函數(shù)的定義
Python的函數(shù)定義使用關(guān)鍵字def,如定義一個(gè)返回絕對(duì)值的函數(shù)my_abs
1 2 3 4 5 | def my_abs(x): if x> = 0 : return x else : return - x |
函數(shù)調(diào)用
參數(shù)錯(cuò)誤
如果在調(diào)用函數(shù)時(shí),傳給函數(shù)的參數(shù)增多或減少,python解釋器都會(huì)檢查出來
TypeError:提示my_abs()只需一個(gè)參數(shù),但是調(diào)用時(shí)給了兩個(gè)
雖然python解釋器能檢查到參數(shù)個(gè)數(shù)的變化,但當(dāng)給函數(shù)一個(gè)非法類型的參數(shù)時(shí),就無法準(zhǔn)確檢測到
解釋器雖然給出了錯(cuò)誤,但是沒有定義具體是哪種錯(cuò)誤
參數(shù)類型檢查
python提供了內(nèi)置函數(shù)isinstance()來判斷參數(shù)的數(shù)據(jù)類型
1 2 3 4 5 6 7 | def my_abs(x): if not isinstance (x, ( int , float )): raise TypeError( 'wrong type......' ) if x > = 0 : return x else : return - x |
改寫了my_abs函數(shù)后,如果傳參不是int或float類型,則會(huì)報(bào)錯(cuò)并給出錯(cuò)誤信息'wrong type'
函數(shù)的參數(shù)
python的函數(shù)定義雖然相對(duì)簡單,但是參數(shù)種類非常靈活。如正常的必須參數(shù),還有默認(rèn)參數(shù)、可變參數(shù)以及關(guān)鍵字參數(shù)
位置參數(shù)
即必須參數(shù),在傳參時(shí)按照函數(shù)定義的順序賦給函數(shù)
1 2 3 4 5 6 | def power(x, n): s = 1 while n > 0 : n = n - 1 s = s * x return s |
定義一個(gè)函數(shù)power()來求x的n次方,在調(diào)用時(shí)根據(jù)函數(shù)定義的順序傳參。不同的位置順序得到不同的結(jié)果
默認(rèn)參數(shù)
同其他編程語言一樣,python在定義函數(shù)時(shí)可通過設(shè)置默認(rèn)參數(shù)來避免因某些參數(shù)沒有傳入而導(dǎo)致的錯(cuò)誤
如power(x, n),如果沒有傳入?yún)?shù)n則會(huì)引起錯(cuò)誤
解釋器提示power()缺少一個(gè)必須的參數(shù)n。來使用默認(rèn)參數(shù)來改進(jìn)一下power函數(shù)
1 2 3 4 5 6 | def power(x, n = 2 ): s = 1 while n > 0 : n = n - 1 s = s * x return s |
兩種形式的函數(shù)調(diào)用都能正常運(yùn)行,這正是因?yàn)槟J(rèn)函數(shù)的作用。當(dāng)參數(shù)都給全時(shí),函數(shù)按照給定的參數(shù)進(jìn)行運(yùn)算;當(dāng)參數(shù)n未傳入時(shí),函數(shù)按照設(shè)置的默認(rèn)參數(shù)進(jìn)行運(yùn)算
可變參數(shù)
可變參數(shù)即參數(shù)的個(gè)數(shù)是可變的,在定義函數(shù)時(shí),無需一個(gè)一個(gè)的給定
1 2 3 4 5 | def add( * numbers): sum = 0 for n in numbers: sum = sum + n return sum |
定義一個(gè)add函數(shù)用來計(jì)算參數(shù)的和
通過可變參數(shù),我們可以傳入任意個(gè)參數(shù)來調(diào)用函數(shù)進(jìn)行運(yùn)算
關(guān)鍵字參數(shù)
不同于可變參數(shù),關(guān)鍵字參數(shù)允許傳入0或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組合成dict
1 2 | def student(name, age, * * args): print ( 'name: ' , name, 'age: ' , age, 'other: ' , args) |
**args:代表傳入的是關(guān)鍵字參數(shù)
命名關(guān)鍵字參數(shù)
上述student函數(shù)可以接收除name,age外的任意參數(shù),但是如果需要限制接收的參數(shù)就要用到命名關(guān)鍵字參數(shù)
假設(shè)對(duì)于student信息還只需要一個(gè)city信息,可以改寫student函數(shù)如下
1 2 | def student(name, age, * , city): print (name, age, city) |
運(yùn)行結(jié)果如下
命名關(guān)鍵字參數(shù)必須傳入?yún)?shù)名,這和位置參數(shù)不同。如果沒有傳入?yún)?shù)名,調(diào)用將報(bào)錯(cuò)
函數(shù)定義中已經(jīng)有了一個(gè)可變參數(shù),后面跟著的命名關(guān)鍵字參數(shù)就不再需要一個(gè)特殊分隔符*
了,如
1 2 | def student(name, age, * args, city): print (name, age, args, city) |
http://www.cnblogs.com/feanmy/p/6980352.html