python——內建型別——函式——引數
阿新 • • 發佈:2019-01-01
必選引數
def enroll(name, gender):
print 'name:', name, 'gender:', gender
enroll('Bob', 'M')
enroll('Lily', 'F')
output:
name: Bob gender: M
name: Lily gender: F
預設引數
output:def enroll(name, gender, age = 8, city = 'Hangzhou'): print 'name:', name, 'gender:', gender, 'age:', age, 'city:', city enroll('Bob', 'M') enroll('Lily', 'F', 9) enroll('Jack', 'M', city = 'Shanghai')
name: Bob gender: M age: 8 city: Hangzhou
name: Lily gender: F age: 9 city: Hangzhou
name: Jack gender: M age: 8 city: Shanghai
總結:
- 必選引數在前,預設引數在後
- 函式有多個引數時,變化大引數放前面,變化小引數放後面,變化小引數可設為預設引數
- 有多個預設引數時,既可按順序提供預設引數,也可不按順序提供部分預設引數,當不按順序提供部分預設引數時,需說明引數名
output:def add_end(list=[]): list.append('End') return list print add_end() print add_end() print add_end()
['End']
['End', 'End']
['End', 'End', 'End']
解釋:
- 函式是instance,函式定義時,預設引數指向物件就確定了,呼叫函式時,如果改變了預設引數指向物件值,預設引數就不再是函式定義時初值,因此預設引數必須指向不可變物件,否則執行會有邏輯錯誤
可變引數
output:def calSum(*args): sum = 0 for num in args: sum = sum + num return sum print calSum(), calSum(1), calSum(1, 9), calSum(1, 9, 19) odd_list = [1, 3, 5, 7, 9] even_tuple = (2, 4, 6, 8 ,10) color_dict = {1:'red', 2:'green', 3:'blue'} prime_set = ([2, 3, 5, 7]) print calSum(*odd_list), calSum(*even_tuple), calSum(*color_dict), calSum(*prime_set)
0 1 10 29
25 30 6 17
總結:
- 定義可變形參用*變數名
- 可變實參本質上組裝成tuple傳給函式內部的可變形參
- list,tuple,dict,set等容器型別,作為實參傳給可變形參時,前面加*即可,便轉換為tuple傳給可變形參,dict和set是取key組裝成tuple
關鍵字引數
def enroll(name, age, **kw):
print 'name:', name, 'age:', age, 'other:', kw
enroll('Bob', 10)
enroll('Jack', 20, city = 'Hangzhou')
enroll('Martin', 30, gender = 'M', job = 'engineer')
dict = {'city': 'Shanghai', 'job': 'doctor'}
enroll('Tom', 40, **dict)
output:
name: Bob age: 10 other: {}
name: Jack age: 20 other: {'city': 'Hangzhou'}
name: Martin age: 30 other: {'gender': 'M', 'job': 'engineer'}
name: Tom age: 40 other: {'city': 'Shanghai', 'job': 'doctor'}
總結:
- 定義關鍵字引數用**變數名
- 關鍵字實參本質上組裝成dict傳給函式內部的關鍵字形參
- dict作為實參傳給關鍵字形參時,前面加**即可
引數應用
def mixArg(a, b, c = 0, *args, **kw):
print 'a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw
mixArg(1, 2)
mixArg(1, 2, c = 3)
mixArg(1, 2, 3, 'a', 'b')
mixArg(1, 2, 3, 'a', 'b', x = 58)
args = (1, 2, 3, 4)
kw = {'x': 98}
mixArg(*args, **kw)
output:
a = 1 b = 2 c = 0 args = () kw = {}
a = 1 b = 2 c = 3 args = () kw = {}
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 58}
a = 1 b = 2 c = 3 args = (4,) kw = {'x': 98}
總結:
- 必選引數、預設引數、可變引數、關鍵字引數可任意組合使用,但引數定義順序必須是:必選引數、預設引數、可變引數、關鍵字引數
- 函式呼叫時,直譯器自動按照引數位置和引數名把對應引數傳進去
- 任意函式,都可通過類似mixArg(*args, **kw)形式呼叫,無論引數是如何定義的
- 預設引數一定要用不可變物件,如果是可變物件,執行會有邏輯錯誤
- *args是可變引數,args接收的是一個tuple,可變引數既可直接傳入,也可先組裝list,tuple,dict,set等容器型別,再通過*args傳入
- **kw是關鍵字引數,kw接收的是一個dict,關鍵字引數既可直接傳入,也可先組裝dict,再通過**kw傳入
- *args和**kw是python習慣寫法,當然也可用其他引數名,但最好使用習慣寫法