Python 函式引數形式
阿新 • • 發佈:2019-01-05
一、位置引數
根據定義的函式的引數位置來判斷引數的值。位置引數一旦定義,在呼叫函式時,就必須傳入對應的引數值。
def show_info(name, age):
print("name: {0}, age: {1}".format(name,age))
show_info("yuchaoshui", 23)
二、預設引數
def show_info(name, age, city="beijing", company="alibaba"):
print("name: {0}, age: {1}, city:{2}, company:{3}".format(name, age, city, company))
show_info("yuchaoshui" , 23)
show_info("yuchaoshui", 23, "shanghai")
show_info("yuchaoshui", 23, company="baidu", city="shanghai")
注意:
- a、必選引數放在前面,預設引數放在後面
- b、變化大引數放在前面,變化小的放在後面
- c、呼叫時預設引數可以不用按順序提供預設引數,可以使用類似
show_info("yuchaoshui", 23, company="baidu", city="shanghai")
的方法傳遞引數, 後面的預設引數部分調換了順序 - 呼叫時預設引數部分如果不給出關鍵字,可以用預設引數按照順序給出,以位置引數的形式呼叫,達到位置引數的效果。
show_info("yuchaoshui", 23, shanghai, baidu)
- d、預設引數必須指定不變物件,不能是
[]
這種可變的序列。
def func(a, b=[])
pass
上面的做法是錯誤的,正確的應該像下面這樣實現。
no_value = object()
def func(a, b=no_value):
if b is no_value:
print("No b value supplied")
三、可變引數
可變引數表示引數的個數變化的,呼叫時傳遞多個引數。
def func(*args):
for i in args:
print(i)
func(1,2,3,4)
也可以先組裝 list 或 tuple,再通過 *mylist
傳入,呼叫函式時, *
可以將序列分解成單個的引數。args接收到的是一個 tuple 或 list
def func(*args):
for i in args:
print(i)
mylist = [1,2,3,4]
func(*mylist)
四、關鍵字引數
關鍵字引數允許傳入未定義的引數名, 函式中 kwargs
接收到的是一個字典。
呼叫函式方式時使用類似 city='Shanghai'
這種方式傳入引數。 也可以傳入一個字典,傳入時使用兩個 **
號來將字典解析成引數傳入。
def person(**kwargs):
for k,v in kwargs.items():
print('{0}: {1}'.format(k, v))
person(city='Shanghai')
extra = {'city': 'Beijing', 'job': 'Engineer'}
person(**extra)
五、命名關鍵字引數
命名關鍵字引數也叫強制關鍵字引數。關鍵字引數允許傳入任意的引數,命名關鍵字引數可以限制傳入引數的關鍵字,使用*
將其分開。
- 通常使用方式如下,表示只接收關鍵字為city、job的引數傳入值。如果傳入其他未定義的關鍵字引數則報錯。
def person(name, age, *, city, job):
print(name, age, city, job)
person('yzy', 23, city='beijing', job='programer')
- 命名關鍵字引數一旦定義,呼叫時就必須要傳入,除非給定的關鍵字引數已經有了預設值
def person(name, age, *, city='beijing', job='programer'):
print(name, age, city, job)
person('yzy', 23)
- 如果已經有了一個可變引數,後面跟著的命名關鍵字引數就不再需要一個特殊分隔符
*
了:
def person(name, age, *scores, city='beijing', job='programer'):
print(name, age, scores, city, job)
person('yzy', 23, 99, 100, city='shanghai')
結果為: yzy 23 (99, 100) shanghai programer
, 99,100 是傳遞的可變引數,後面是命名關鍵字引數。
六、函式引數組合使用
以上5中引數都可以隨意組合,但是引數定義的順序必須是:位置引數、預設引數、可變引數、命名關鍵字引數和關鍵字引數。
注意: 引數的組合使用不建議太複雜,太複雜的話可讀性很差。
七、函式引數型別檢查
函式的引數可以使用 isinstance()
內建函式來檢查。
def test(x,y,z):
if not isinstance(x, int):
raise TypeError('x need arg type int')
if not isinstance(y, str):
raise TypeError('y need arg type str')
if not isinstance(z, (str, int)):
raise TypeError('z need arg type str or int')
test(2,'3',object)