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