1. 程式人生 > >第018講:函式:靈活即強大

第018講:函式:靈活即強大

目錄

測試題:

0. 請問以下哪個是形參哪個是實參?

1.函式寫註釋有什麼不同?

2. 使用關鍵字引數,可以有效避免什麼問題的出現呢?

3. 使用help(print)檢視print()這個BIF有哪些預設引數?分別起到什麼作用?

4. 預設引數和關鍵字引數表面最大的區別是什麼?

動動手:

0. 編寫一個符合以下要求的函式:   

1. 尋找水仙花數

2. 編寫一個函式 findstr(),該函式統計一個長度為 2 的子字串在另一個字串中出現的次數。

3. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!


測試題:

0. 請問以下哪個是形參哪個是實參?

def MyFun(x):
    return x ** 3

y = 3
print(MyFun(y))

x是形式引數(形參),y是實際引數(實參)。
跟絕大部分程式語言一樣,形參指的是函式建立和定義過程中小括號裡的引數,而實參指的是函式在呼叫過程中傳遞進去的引數。

1.函式寫註釋有什麼不同?

給函式寫文件是為了讓別人可以更好的理解你的函式,所以這是一個好習慣:

>>> def MyFirstFunction(name):
        '函式文件在函式定義的最開頭部分,用不記名字串表示'
        print('I love FishC.com!')

我們看到在函式開頭寫下的字串Ta是不會打印出來的,但Ta會作為函式的一部分儲存起來,這個我們稱之為函式文件字串,Ta的功能跟註釋是一樣的。

函式的文件字串可以按如下方式訪問:

>>> MyFirstFunction.__doc__
'函式文件在函式定義的最開頭部分,用不記名字串表示'

另外,我們用help()來訪問這個函式也可以看到這個文件字串:

>>> help(MyFirstFunction)
Help on function MyFirstFunction in module __main__:

MyFirstFunction(name)
函式文件在函式定義的最開頭部分,用不記名字串表示

2. 使用關鍵字引數,可以有效避免什麼問題的出現呢?

關鍵字引數,是指函式在呼叫的時候,帶上引數的名字去指定具體呼叫的是哪個引數,從而可以不用按照引數的順序呼叫函式,例如:

>>> def SaySome(name, words):
        print(name + '->' + words)

>>> SaySome(words='讓程式設計改變世界!', name='小甲魚')

使用關鍵字引數,可以有效避免因不小心搞亂引數的順序導致的BUG出現。

3. 使用help(print)檢視print()這個BIF有哪些預設引數?分別起到什麼作用?

  1. >>> help(print)
  2. Help on built-in function print in module builtins:
  3.  
  4. print(...)
  5.     print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
  6.     
  7.     Prints the values to a stream, or to sys.stdout by default.
  8.     Optional keyword arguments:
  9.     file:  a file-like object (stream); defaults to the current sys.stdout.
  10.     # 檔案型別物件,預設是sys.stdout(標準輸出流)
  11.     sep:   string inserted between values, default a space.
  12.     # 第一個引數如果有多個值(第一個引數是收集引數),各個值之間預設用空格(space)隔開
  13.     end:   string appended after the last value, default a newline.
  14.     # 列印最後一個值之後預設引數一個新行識別符號(‘\n’)
  15.     flush: whether to forcibly flush the stream.
  16.     # 是否強制重新整理流

4. 預設引數和關鍵字引數表面最大的區別是什麼?

呃,其實這道題考大家有沒有認真聽課啦~

關鍵字引數是在函式呼叫的時候,通過引數名制定需要賦值的引數,這樣做就不怕因為搞不清引數的順序而導致函式調用出錯。而預設引數是在引數定義的過程中,為形參賦初值,當函式呼叫的時候,不傳遞實參,則預設使用形參的初始值代替。


動手:

0. 編寫一個符合以下要求的函式:   

    a) 計算列印所有引數的和乘以基數(base=3)的結果
    b) 如果引數中最後一個引數為(base=5),則設定基數為5,基數不參與求和計算。

def mFun(*param, base=3):
    result = 0
    for each in param:
        result += each

    result *= base
    
    print('結果是:', result)

mFun(1, 2, 3, 4, 5, base=5)

1. 尋找水仙花數

題目要求:如果一個3位數等於其各位數字的立方和,則稱這個數為水仙花數。例如153 = 1^3+5^3+3^3,因此153是一個水仙花數。編寫一個程式,找出所有的水仙花數。

小甲魚的答案:

def Narcissus():
    for each in range(100, 1000):
        temp = each
        sum = 0
        while temp:
            sum = sum + (temp%10) ** 3
            temp = temp // 10  # 注意這裡用地板除

        if sum == each:
            print(each, end='\t')

print("所有的水仙花數分別是:", end='')
Narcissus()

我的答案:

def Find():
	for i in range(100,1000):
		if int(str(i)[0])**3 + int(str(i)[1])**3 + int(str(i)[2])**3 == i:
			print(i)

2. 編寫一個函式 findstr(),該函式統計一個長度為 2 的子字串在另一個字串中出現的次數。

例如:假定輸入的字串為“You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字串為“im”,函式執行後列印“子字母串在目標字串中共出現 3 次”。

程式執行效果:

小甲魚的答案:

def findStr(desStr, subStr):
    count = 0
    length = len(desStr)
    if subStr not in desStr:
        print('在目標字串中未找到字串!')
    else:
        for each1 in range(length-1):      
            if desStr[each1] == subStr[0]:
                if desStr[each1+1] == subStr[1]:
                    count += 1
                    
        print('子字串在目標字串中共出現 %d 次' % count)

desStr = input('請輸入目標字串:')
subStr = input('請輸入子字串(兩個字元):')
findStr(desStr, subStr)

我的答案:

 def findstr():
	str1 = input('請輸入目標字串:')
	str2 = input('請輸入子字串(兩個字元):')
	count = 0
	for i in range(len(str1)-1):
		str3 = str1[i] + str1[i+1]
		if str3 == str2:
			count += 1
	print('子字串在目標字串中共出現%s次'%count)

3. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

本節課主要針對函式的引數進行進一步學習。

(1)形參和實參

引數定義過程中的引數叫做形參,因為Ta只是一個形式,表示佔據一個引數位置。

呼叫引數時傳遞進來的引數叫做實參,因為Ta是具體的引數值。

(2)函式文件

給函式寫文件是為了便於別人更好的理解你的函式。在函式定義裡面,用引號引起來的部分。

例如:

呼叫該函式的預設屬性:

(3)關鍵字引數

為了方式引數輸入時順序的錯亂,導致呼叫引數實現的結果錯誤,引入了關鍵字引數。

有了關鍵字提示之後,Python就不會使用順序索引了,而是使用關鍵字索引。

(4)預設引數

定義了預設值的引數,在函式定義時,為形參賦初值。

當呼叫引數時,沒有帶引數,就會使用預設值的引數。

如果給它一個引數,就會使用新給的引數。

(5)收集引數(可變引數)

發明這種機制的動機是函式的作者有時候也不知道這個函式到底需要多少個引數。在這種情況下,只需要在引數的前面加上星號*。

需要注意的是:如果收集引數後邊還需要加上其它定製的引數,那麼在呼叫函式的時候應該使用關鍵字引數,否則Python就會把你後面的引數全部列為收集引數的範疇了。

建議是:函式定義有收集引數和其它需要定製的引數,那麼請為這些其它的引數設定為預設引數。設定預設引數的話,就不容易出錯啦。

這裡的new的值6,來自於預設值,而不是給定的實參。