小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Python 學習之路四

 Four兄 2019-08-30

目錄

函數(shù)

調用函數(shù)

數(shù)據(jù)類型轉換

定義函數(shù)

空函數(shù)

參數(shù)檢查

返回多個值

函數(shù)的參數(shù)

位置參數(shù)

默認參數(shù)

可變參數(shù)

關鍵字參數(shù)

命名關鍵字參數(shù)


繼 'Python 學習之路三':

函數(shù)

調用函數(shù)

Python 內置了很多有用的函數(shù),我們可以直接調用。

要調用一個函數(shù),需要知道函數(shù)的名稱和參數(shù),比如求絕對值的函數(shù) abs,只有一個參數(shù)??梢灾苯訌?Python 的官方網(wǎng)站查看文檔:

https://docs./3/library/functions.html

官網(wǎng) 3.7.2 版本內置函數(shù)匯總(截圖):

也可以在交互式命令行通過 help(abs)查看 abs 函數(shù)的幫助信息。調用 abs 函數(shù):

  1. >>> abs(100)
  2. 100
  3. >>> abs(-100)
  4. 100
  5. >>> abs(12.12)
  6. 12.12
  7. >>>

調用函數(shù)的時候,如果傳入的參數(shù)數(shù)量不對,會報 TypeError 的錯誤,并且 Python 會明確地告訴你:abs()有且僅有 1 個參數(shù),但給出了兩個:

  1. >>> abs(11,22)
  2. Traceback (most recent call last):
  3. File '<pyshell#114>', line 1, in <module>
  4. abs(11,22)
  5. TypeError: abs() takes exactly one argument (2 given)
  6. >>>

如果傳入的參數(shù)數(shù)量是對的,但參數(shù)類型不能被函數(shù)所接受,也會報 TypeError 的錯誤,并且給出錯誤信息:str 是錯誤的參數(shù)類型:

  1. >>> abs('a')
  2. Traceback (most recent call last):
  3. File '<pyshell#117>', line 1, in <module>
  4. abs('a')
  5. TypeError: bad operand type for abs(): 'str'
  6. >>>

數(shù)據(jù)類型轉換

Python 內置的常用函數(shù)還包括數(shù)據(jù)類型轉換函數(shù),比如 int()函數(shù)可以把其他數(shù)據(jù)類型轉換為整數(shù):

  1. >>> int('321')
  2. 321
  3. >>> int(32.1)
  4. 32
  5. >>> float('12.12')
  6. 12.12
  7. >>> str(12.12)
  8. '12.12'
  9. >>> bool(1)
  10. True
  11. >>> bool(' ')
  12. True
  13. >>> bool(6)
  14. True
  15. >>>

函數(shù)名其實就是指向一個函數(shù)對象的引用,完全可以把函數(shù)名賦給一個變量,相當于給這個函數(shù)起了一個“別名”:

  1. >>> a = abs
  2. >>> a(-1)
  3. 1
  4. >>>

定義函數(shù)

在 Python 中,定義一個函數(shù)要使用 def 語句,依次寫出函數(shù)名、括號、括號中的參數(shù)和冒號:,然后,在縮進塊中編寫函數(shù)體,函數(shù)的返回值用 return 語句返回。

自定義一個求絕對值的 my_abs 函數(shù):

  1. >>> def my_abs(x) :
  2. if x >= 0 :
  3. return x
  4. else :
  5. return -x
  6. >>> print(my_abs(-9))
  7. 9
  8. >>>

請注意,函數(shù)體內部的語句在執(zhí)行時,一旦執(zhí)行到 return 時,函數(shù)就執(zhí)行完畢,并將結果返回。因此,函數(shù)內部通過條件判斷和循環(huán)可以實現(xiàn)非常復雜的邏輯。如果沒有 return 語句,函數(shù)執(zhí)行完畢后也會返回結果,只是結果為 None。return None可以簡寫為 return。

如果你已經(jīng)把 my_abs()的函數(shù)定義保存為 abstest.py 文件了,那么,可以在該文件的當前目錄下啟動 Python 解釋器,用 from abstest import my_abs 來導入 my_abs()函數(shù),注意 abstest 是文件名(不含.py 擴展名):

  1. >>> from abstest import my_abs
  2. >>> my_aba(-9)
  3. -9
  4. >>>

空函數(shù)

如果想定義一個什么事也不做的空函數(shù),可以用 pass 語句:

  1. >>> def nop():
  2. pass
  3. >>>

pass 語句什么都不做,那有什么用?實際上 pass 可以用來作為占位符,比如現(xiàn)在還沒想好怎么寫函數(shù)的代碼,就可以先放一個 pass,讓代碼能運行起來。pass 還可以用在其他語句里,比如:

  1. >>> if age >= 20 :
  2. pass
  3. (缺少了 pass,代碼運行就會有語法錯誤。)

參數(shù)檢查

調用函數(shù)時,如果參數(shù)個數(shù)不對,Python 解釋器會自動檢查出來,并拋出TypeError:

  1. >>> abs('a')
  2. Traceback (most recent call last):
  3. File '<pyshell#117>', line 1, in <module>
  4. abs('a')
  5. TypeError: bad operand type for abs(): 'str'
  6. >>>

返回多個值

函數(shù)可以返回多個值嗎?答案是肯定的。比如在游戲中經(jīng)常需要從一個點移動到另一個點,給出坐標、位移和角度,就可以計算出新的新的坐標:

  1. >>> import math
  2. >>> def move(x,y,step,angle=0):
  3. nx = x + step * math.cos(angle)
  4. ny = y - step * math.sin(angle)
  5. return nx,ny
  6. >>> x,y = move(100,100,60,math.pi/6)
  7. >>> print(x,y)
  8. 151.96152422706632 70.0
  9. >>>

但其實這只是一種假象,Python 函數(shù)返回的仍然是單一值:

  1. >>> m = move(100,100,60,math.pi/6)
  2. >>> print(m)
  3. (151.96152422706632, 70.0)

原來返回值是一個 tuple!但是,在語法上,返回一個 tuple 可以省略括號,而多個變量可以同時接收一個 tuple,按位置賦給對應的值,所以,Python 的函數(shù)返回多值其實就是返回一個 tuple,但寫起來更方便。

函數(shù)的參數(shù)

定義函數(shù)的時候,把參數(shù)的名字和位置確定下來,函數(shù)的接口定義就完成了。對于函數(shù)的調用者來說,只需要知道如何傳遞正確的參數(shù),以及函數(shù)將返回什么樣的值就夠了,函數(shù)內部的復雜邏輯被封裝起來,調用者無需了解。Python 的函數(shù)定義非常簡單,但靈活度卻非常大。除了正常定義的必選參數(shù)外,還可以使用默認參數(shù)、可變參數(shù)和關鍵字參數(shù),使得函數(shù)定義出來的接口,不但能處理復雜的參數(shù),還可以簡化調用者的代碼。

位置參數(shù)

  1. >>> def power(x) :
  2. return x * x
  3. >>> power(3)
  4. 9
  5. >>>

對于 power(x)函數(shù),參數(shù) x 就是一個位置參數(shù)。當我們調用 power 函數(shù)時,必須傳入有且僅有的一個參數(shù) x:

那么,可以把 power(x)修改為 power(x, n),用來計算 x的n次方:

  1. >>> power(5,2)
  2. 5
  3. >>> def power(x,n):
  4. s = 1
  5. while n > 0 :
  6. n = n -1
  7. s = s*x
  8. return s
  9. >>> power(5,2)
  10. 25
  11. >>> power(3,5)
  12. 243
  13. >>>

修改后的 power(x, n)函數(shù)有兩個參數(shù):x 和 n,這兩個參數(shù)都是位置參數(shù),調用函數(shù)時,傳入的兩個值按照位置順序依次賦給參數(shù) x 和 n。

默認參數(shù)

新的 power(x, n)函數(shù)定義沒有問題,但是,舊的調用代碼失敗了,原因是我們增加了一個參數(shù),導致舊的代碼因為缺少一個參數(shù)而無法正常調用:

  1. >>> power(2)
  2. Traceback (most recent call last):
  3. File '<pyshell#189>', line 1, in <module>
  4. power(2)
  5. TypeError: power() missing 1 required positional argument: 'n'
  6. >>>

Python 的錯誤信息很明確:調用函數(shù) power()缺少了一個位置參數(shù) n。這個時候,默認參數(shù)就排上用場了。由于我們經(jīng)常計算 x2,所以,完全可以把第二個參數(shù) n 的默認值設定為 2:

  1. >>> def power(x,n = 2):
  2. s = 1
  3. while n > 0:
  4. n = n - 1
  5. s = s * x
  6. return s
  7. >>> power(2)
  8. 4
  9. >>> power(2,5)
  10. 32
  11. >>>

從上面的例子可以看出,默認參數(shù)可以簡化函數(shù)的調用。設置默認參數(shù)時,有幾點要注意:

  • 一是必選參數(shù)在前,默認參數(shù)在后,否則 Python 的解釋器會報錯(思考一下為什么默認參數(shù)不能放在必選參數(shù)前面);
  • 二是如何設置默認參數(shù)。

當函數(shù)有多個參數(shù)時,把變化大的參數(shù)放前面,變化小的參數(shù)放后面。變化小的參數(shù)就可以作為默認參數(shù)。使用默認參數(shù)有什么好處?最大的好處是能降低調用函數(shù)的難度。

可變參數(shù)

在 Python 函數(shù)中,還可以定義可變參數(shù)。顧名思義,可變參數(shù)就是傳入的參數(shù)個數(shù)是可變的,可以是 1 個、2 個到任意個,還可以是 0 個。

以數(shù)學題為例子,給定一組數(shù)字 a,b,c……,請計算 a2 + b2 + c2 + ……。要定義出這個函數(shù),我們必須確定輸入的參數(shù)。由于參數(shù)個數(shù)不確定,首先想到可以把a,b,c……作為一個 list 或 tuple 傳進來,這樣,函數(shù)可以定義如下:

  1. >>> def calc(nums):
  2. sum = 0
  3. for n in nums:
  4. sum = sum + n * n
  5. return sum
  6. >>> calc([1,2,3,4])
  7. 30
  1. >>> def calc(*num):
  2. sum = 0
  3. for n in num:
  4. sum += n * n
  5. return sum
  6. >>> calc (1,2)
  7. 5
  8. >>> calc(3)
  9. 9
  10. >>>

定義可變參數(shù)和定義一個 list 或 tuple 參數(shù)相比,僅僅在參數(shù)前面加了一個*號。在函數(shù)內部,參數(shù) numbers 接收到的是一個 tuple,因此,函數(shù)代碼完全不變。但是,調用該函數(shù)時,可以傳入任意個參數(shù),包括 0 個參數(shù):

  1. >>> calc (1,2)
  2. 5
  3. >>> calc(3)
  4. 9
  5. >>> calc()
  6. 0
  7. >>>

*nums 表示把 nums 這個 list 的所有元素作為可變參數(shù)傳進去。這種寫法相當有用,而且很常見。

關鍵字參數(shù)

可變參數(shù)允許你傳入 0 個或任意個參數(shù),這些可變參數(shù)在函數(shù)調用時自動組裝為一個tuple。而關鍵字參數(shù)允許你傳入 0 個或任意個含參數(shù)名的參數(shù),這些關鍵字參數(shù)在函數(shù)內部自動組裝為一個 dict。

  1. >>> def person(name,age,**kg):
  2. print('name:',name,'age:',age,'other',kg)
  3. >>> person('Jerry',20)
  4. name: Jerry age: 20 other {}
  5. >>> person('Jerry',20,city='shanghai')
  6. name: Jerry age: 20 other {'city': 'shanghai'}
  7. >>>

函數(shù) person 除了必選參數(shù) name 和 age 外,還接受關鍵字參數(shù) kg。在調用該函數(shù)時,可以只傳入必選參數(shù):

  1. >>> person('Jerry',20,city='shanghai',job='Enginner')
  2. name: Jerry age: 20 other {'city': 'shanghai', 'job': 'Enginner'}
  3. >>>

關鍵字參數(shù)有什么用?它可以擴展函數(shù)的功能。比如,在 person 函數(shù)里,保證能接收到 name 和 age 這兩個參數(shù),但是,如果調用者愿意提供更多的參數(shù),也能收到。試想正在做一個用戶注冊的功能,除了用戶名和年齡是必填項外,其他都是可選項,利用關鍵字參數(shù)來定義這個函數(shù)就能滿足注冊的需求。

**extra 表示把 extra 這個 dict 的所有 key-value 用關鍵字參數(shù)傳入到函數(shù)的**kw 參數(shù),kw 將獲得一個 dict,注意 kw 獲得的 dict 是 extra 的一份拷貝,對 kw 的改動不會影響到函數(shù)外的 extra。

命名關鍵字參數(shù)

(待整理)

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多