python 函數function
函數
- 當代碼出現有規律的重復的時候,只寫一次函數實現多次使用(調用)
可使用的函數:
- 自定義函數
- 內置函數:文檔 https://docs.python.org/3/library/functions.html,本身內置了很多有用的函數,可以直接調用,如max(),abs()。
調用函數:
- 要知道函數的名稱和參數
- 參數數量和參數類型必須正確,否則報
TypeError
的錯誤,並且給出錯誤信息 - 數據類型的轉換:int(),float(),str(),bool()
定義函數:
- 定義一個函數要使用
def
語句,依次寫出函數名、括號、括號中的參數和冒號:
,然後在縮進塊中編寫函數體,函數的返回值用return
- 如果沒有
return
語句,函數執行完畢後也會返回結果,只是結果為None,就是return。
1 #自定義一個求絕對值的my_abs函數為例: 2 def my_abs(x): 3 if x >= 0: 4 return x 5 else: 6 return -x
- 解析:如果你已經把
my_abs()
的函數定義保存為abstest.py
文件了,那麽,可以在該文件的當前目錄下啟動Python解釋器,用from abstest import my_abs
來導入my_abs()
函數,註意abstest
是文件名(不含.py
擴展名) - 空函數:如果想定義一個什麽事也不做的空函數,可以用
pass
語句:實際上pass
可以用來作為占位符 - 參數檢查:isinstance()
#若傳入是字符‘s’上面的代碼會報錯,加入isinstance()判斷。
1 def my_abs(x): 2 if not isinstance(x, (int, float)): 3 raise TypeError(‘bad operand type‘) 4 if x >= 0: 5 return x 6 else: 7 return -x
函數的參數
#計算x的次方def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s
1 位置參數:對應的參數傳入對應的位置,使用最多的。
如:調用時 power(5, 2)
2 默認參數:若頻繁使用某個參數可以設置為默認的值。
經常計算x2,上面的函數可寫為 def power(x, n=2) ,調用直接可寫power(5),其余情況照位置參數處理。
#是必選參數在前,默認參數在後,否則Python的解釋器會報錯
#當函數有多個參數時,把變化大的參數放前面,變化小的參數放後面。變化小的參數就可以作為默認參數。
#定義默認參數要牢記一點:默認參數必須指向不變對象!str
、None
這樣的不變對象,一旦創建,對象內部的數據就不能修改。由於對象不變,多任務環境下同時讀取對象不需要加鎖,同時讀一點 問題都沒有。我們在編寫程序時,如果可以設計一個不變對象,那就盡量設計成不變對象。
1 #L隨調用而增加改變 2 def add_end(L=[]): 3 L.append(‘END‘) 4 return L 5 6 >>> add_end() 7 [‘END‘, ‘END‘] 8 >>> add_end() 9 [‘END‘, ‘END‘, ‘END‘] 10 11 #None這個不變參數來實現 12 def add_end(L=None): 13 if L is None: 14 L = [] 15 L.append(‘END‘) 16 return L
3可變參數:
可變參數就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個。使用*,可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝為一個tuple
作用:傳可變參數
#計算a2+b2+c2+... def calc(numbers): sum = 0 for n in numbers: sum = sum + n * n return sum #組裝出一個list或tuple >>> calc([1, 2, 3]) 14 >>> calc((1, 3, 5, 7)) 84 #可變參數 def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum >>> calc(1, 2) 5 >>> calc() #已經有一個list或者tuple nums = [1, 2, 3] calc(*nums) 14
4 關鍵字參數:
允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict
作用:傳任意參數,以擴展函數的功能
def person(name, age, **kw): print( name, age, kw) >>> person(‘Michael‘, 30) Michael 30 {} >>> person(‘Bob‘, 35, city=‘Beijing‘) Bob 35 {‘city‘: ‘Beijing‘}
#已經有的傳入
>>> extra = {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}
>>> person(‘Jack‘, 24, **extra)
name: Jack age: 24 other: {‘city‘: ‘Beijing‘, ‘job‘: ‘Engineer‘}
5 命名關鍵字參數:
函數的調用者可以傳入任意不受限制的關鍵字參數。至於到底傳入了哪些,就需要在函數內部通過kw
檢查。
#*後面的參數被視為命名關鍵字參數,接收city和job作為關鍵字參數 def person(name, age, *, city, job): print(name, age, city, job) #命名關鍵字參數必須傳入參數名 >>> person(‘Jack‘, 24, city=‘Beijing‘, job=‘Engineer‘) Jack 24 Beijing Engineer #函數定義中已經有了一個可變參數, def person(name, age, *args, city, job): print(name, age, args, city, job)
6 參數組合
參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
def f1(a, b, c=0, *args, **kw): print(‘a =‘, a, ‘b =‘, b, ‘c =‘, c, ‘args =‘, args, ‘kw =‘, kw) def f2(a, b, c=0, *, d, **kw): print(‘a =‘, a, ‘b =‘, b, ‘c =‘, c, ‘d =‘, d, ‘kw =‘, kw) >>> f1(1, 2) a = 1 b = 2 c = 0 args = () kw = {} >>> f1(1, 2, c=3) a = 1 b = 2 c = 3 args = () kw = {} >>> f1(1, 2, 3, ‘a‘, ‘b‘) a = 1 b = 2 c = 3 args = (‘a‘, ‘b‘) kw = {} >>> f1(1, 2, 3, ‘a‘, ‘b‘, x=99) a = 1 b = 2 c = 3 args = (‘a‘, ‘b‘) kw = {‘x‘: 99} >>> f2(1, 2, d=99, ext=None) a = 1 b = 2 c = 0 d = 99 kw = {‘ext‘: None} #最神奇的是通過一個tuple和dict,你也可以調用上述函數: >>> args = (1, 2, 3, 4) >>> kw = {‘d‘: 99, ‘x‘: ‘#‘} >>> f1(*args, **kw) a = 1 b = 2 c = 3 args = (4,) kw = {‘d‘: 99, ‘x‘: ‘#‘} >>> args = (1, 2, 3) >>> kw = {‘d‘: 88, ‘x‘: ‘#‘} >>> f2(*args, **kw) a = 1 b = 2 c = 3 d = 88 kw = {‘x‘: ‘#‘}
小結
Python的函數具有非常靈活的參數形態,既可以實現簡單的調用,又可以傳入非常復雜的參數。
默認參數一定要用不可變對象,如果是可變對象,程序運行時會有邏輯錯誤!
要註意定義可變參數和關鍵字參數的語法:
*args
是可變參數,args接收的是一個tuple;
**kw
是關鍵字參數,kw接收的是一個dict。
以及調用函數時如何傳入可變參數和關鍵字參數的語法:
可變參數既可以直接傳入:func(1, 2, 3)
,又可以先組裝list或tuple,再通過*args
傳入:func(*(1, 2, 3))
;
關鍵字參數既可以直接傳入:func(a=1, b=2)
,又可以先組裝dict,再通過**kw
傳入:func(**{‘a‘: 1, ‘b‘: 2})
。
使用*args
和**kw
是Python的習慣寫法,當然也可以用其他參數名,但最好使用習慣用法。
命名的關鍵字參數是為了限制調用者可以傳入的參數名,同時可以提供默認值。
定義命名的關鍵字參數在沒有可變參數的情況下不要忘了寫分隔符*
,否則定義的將是位置參數。
python 函數function