python函式之引數
阿新 • • 發佈:2018-11-02
#!/usr/bin/env python3 #_*_ coding:utf-8 _*_ 1.位置引數 #單個引數 def power(x): return x * x #多個引數 def power(x, n): s = 1 while n > 0: n = n - 1 s = s * x return s 2.預設引數 #當修改為多個引數後,單個引數的呼叫失敗了,所以需要引入預設引數 #n=2為預設值,呼叫的時候輸入了,則使用呼叫者輸入的值,當呼叫者沒有輸入則使用預設值2,提高相容性 def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s #預設引數的設定原則 #1.必填引數在前,可選引數在後 #2.多個引數的情況下,變化大的引數放前面,變化小的引數放後面 #預設引數的好處 #降低呼叫函式的難度 #值得注意: #預設引數一定要是不可變的物件,比如list是可變的不行,但是list=None,None是不變的,則可以 3.可變引數, *星號表示,**可變引數就是傳入的引數個數是可變的**, #可以是1個、2個到任意個,還可以是0個,可以是基本資料型別也可以是list,tuple def calc(*numbers): sum = 0 for n in numbers: sum = sum + n * n return sum 呼叫:呼叫的時候也要帶上* >>> nums = [1, 2, 3] >>> calc(*nums) 4.關鍵字引數 **兩個星表示 #可變引數允許你傳入0個或任意個引數,這些可變引數在函式呼叫時自動組裝為一個tuple。 #而**關鍵字引數允許你傳入0個或任意個含引數名的引數**,這些關鍵字引數在函式內部自動組裝為一個dict def person(name, age, **kw): print('name:', name, 'age:', age, 'other:', kw) #不傳引數 >>> person('Michael', 30) name: Michael age: 30 other: {} # 傳一個引數 >>> person('Bob', 35, city='Beijing') name: Bob age: 35 other: {'city': 'Beijing'} #傳兩個引數 >>> person('Adam', 45, gender='M', job='Engineer') name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'} #和可變引數類似,也可以先組裝出一個dict,然後,把該dict轉換為關鍵字引數傳進去 #**extra表示把extra這個dict的所有key-value用關鍵字引數傳入到函式的**kw引數, #kw將獲得一個dict,注意kw獲得的dict是extra的一份拷貝,對kw的改動不會影響到函式外的extra >>> extra = {'city': 'Beijing', 'job': 'Engineer'} >>> person('Jack', 24, **extra) name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'} 5.命名關鍵字引數 #和關鍵字引數**kw不同,命名關鍵字引數需要一個特殊分隔符*,*後面的引數被視為命名關鍵字引數 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) #命名關鍵字引數必須傳入引數名,這和位置引數不同。如果沒有傳入引數名,呼叫將報錯 #因為沒有接引數名,系統當成位置引數報錯了 >>> person('Jack', 24, 'Beijing', 'Engineer') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: person() takes 2 positional arguments but 4 were given #命名關鍵字引數可以有預設值,預設值,從而簡化呼叫,city='Beijing'為預設值,呼叫時,可只傳入job def person(name, age, *, city='Beijing', job): print(name, age, city, job) 6.引數組合 #在Python中定義函式,可以用必選引數、預設引數、可變引數、關鍵字引數和命名關鍵字引數,這5種引數都可以組合使用。 #但是請注意,引數定義的順序必須是:必選引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數 #雖然可以組合多達5種引數,但不要同時使用太多的組合,否則函式介面的可理解性很差。 #對於任意函式,都可以通過類似func(*args, **kw)的形式呼叫它,無論它的引數是如何定義的