1. 程式人生 > >python——內建型別——函式——引數

python——內建型別——函式——引數

必選引數

def enroll(name, gender):
    print 'name:', name, 'gender:', gender

enroll('Bob', 'M')
enroll('Lily', 'F')
output:
name: Bob gender: M
name: Lily gender: F

預設引數

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')
output:
name: Bob gender: M age: 8 city: Hangzhou
name: Lily gender: F age: 9 city: Hangzhou
name: Jack gender: M age: 8 city: Shanghai
總結:
  • 必選引數在前,預設引數在後
  • 函式有多個引數時,變化大引數放前面,變化小引數放後面,變化小引數可設為預設引數
  • 有多個預設引數時,既可按順序提供預設引數,也可不按順序提供部分預設引數,當不按順序提供部分預設引數時,需說明引數名
def add_end(list=[]):
    list.append('End')
    return list
	
print add_end()
print add_end()
print add_end()
output:
['End']
['End', 'End']
['End', 'End', 'End']
解釋:
  • 函式是instance,函式定義時,預設引數指向物件就確定了,呼叫函式時,如果改變了預設引數指向物件值,預設引數就不再是函式定義時初值,因此預設引數必須指向不可變物件,否則執行會有邏輯錯誤

可變引數

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)
output:
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習慣寫法,當然也可用其他引數名,但最好使用習慣寫法