python 函數
參考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017261630425888
使用help(函數名)
的方法查看函數的幫助信息
自定義函數如果沒有return
也會返回結果, 爲None
。return None
簡寫爲return
函數定義
定義一個什麼也不做的空函數,可以使用pass
def nop():
pass
pass
語句什麼都不做,可以用來爲沒想好的函數佔位,沒有pass
就會報錯
內置函數可以檢查出參數類型的錯誤,而自定義函數不能
函數可以返回多個值(return多個值時,會以一個元組的方式返回)
函數參數
默認參數
#默認參數
def power(x, n = 2):
#n值沒有傳參的話默認爲2
s = 1
while n > 0:
n -= 1
s *= x
return s
設置默認參數時注意:
必選參數在前,默認參數在後,否則會報錯
函數有多個參數時,把變化大的參數放在前面,變化小的參數放後面,變化小的可以使用默認參數。
可以含有多個默認參數,調用時指定參數來傳遞數值
def stu(name, gender, age = 6, city = 'Beijing'):
print(name)
print(gender)
print(age)
print(city)
stu('a', 'f')
#a
#f
#6
#Beijing
stu('a', 'f', city = 'abc')
#a
#f
#6
#abc
函數在被定義的時候,默認參數就被計算出來了並指向這個對象,如果對象可變,下次調用函數時,參數內容就可能會改變。
所以,定義默認參數要牢記一點:默認參數必須指向不變對象!
可變參數
在參數前面加一個*
號,該參數接收到的就是一個tuple
def cal(*num):
sum = 0
print(num)
for i in num:
sum += i
return sum
cal(1, 2, 3)
#(1, 2, 3)
#6
#可以將一個list或是tuple作爲可變參數傳入,在變量名前加一個*
l = [1, 2, 3]
cal(*l)
#(1, 2, 3)
#6
關鍵字參數
可變參數允許你傳入0個或任意個參數,這些可變參數在函數調用時自動組裝爲一個tuple。而關鍵字參數允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict。
關鍵字參數有什麼用?它可以擴展函數的功能。比如,在person
函數裏,我們保證能接收到name
和age
這兩個參數,但是,如果調用者願意提供更多的參數,我們也能收到。試想你正在做一個用戶註冊的功能,除了用戶名和年齡是必填項外,其他都是可選項,利用關鍵字參數來定義這個函數就能滿足註冊的需求。
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
函數person
除了必選參數name
和age
外,還接受關鍵字參數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 = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, city=extra['city'], job=extra['job'])
#name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
當然,上面複雜的調用可以用簡化的寫法:
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)
#name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}
**extra
表示把extra
這個dict的所有key-value用關鍵字參數傳入到函數的**kw
參數,kw
將獲得一個dict,注意kw
獲得的dict是extra
的一份拷貝,對kw
的改動不會影響到函數外的extra
。
命名關鍵字參數
如果要限制關鍵字參數的名字,就可以用命名關鍵字參數,例如,只接收city
和job
作爲關鍵字參數。這種方式定義的函數如下:
def person(name, age, *, city, job):
print(name, age, city, job)
和關鍵字參數**kw
不同,命名關鍵字參數需要一個特殊分隔符*
,*
後面的參數被視爲命名關鍵字參數。
調用方式如下:
person('Jack', 24, city='Beijing', job='Engineer')
#Jack 24 Beijing Engineer
如果函數定義中已經有了一個可變參數,後面跟着的命名關鍵字參數就不再需要一個特殊分隔符*
了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
命名關鍵字參數必須傳入參數名,這和位置參數不同。如果沒有傳入參數名,調用將報錯。
使用命名關鍵字參數時,要特別注意,如果沒有可變參數,就必須加一個*
作爲特殊分隔符。如果缺少*
,Python解釋器將無法識別位置參數和命名關鍵字參數。
參數組合
在Python中定義函數,可以用必選參數、默認參數、可變參數、關鍵字參數和命名關鍵字參數,這5種參數都可以組合使用。但是請注意,參數定義的順序必須是:必選參數、默認參數、可變參數、命名關鍵字參數和關鍵字參數。
函數可以對list和tuple使用。