Python3之函式的引數傳遞與引數定義

geek_xiong發表於2018-09-01

函式的引數傳遞

函式傳參方式分為兩大類,四小類

  1. 位置傳參
    ~序列傳參
  2. 關鍵字傳參
    ~字典關鍵字傳參

位置傳參

實參的對應關係與形參的對應關係是借位置來依次對應的
例項:

def mymin(a, b, c):
    pass

mymin(1, 2, 3)

上邊的栗子很好的解釋了位置的對應關係,1,2,3分別對應a,b,c

說明:
~實參和形參通過位置進行傳參和匹配
~實參的個數必須與形參的個數相同

序列傳參

序列傳參是指在呼叫過程中,用 * 將序列拆解後按位置進行傳遞的傳參方式

說明:
序列傳參時,序列拆解的位置與形參一一對應
序列的位置資訊對應相應的引數位置

例項:

def myfun(a, b, c):
    print('a:', a)
    print('b:', b)
    print('c:', c)

s1 = [1, 2, 3]
s2 = [4, 5, 6]
s3 = 'ABC'

myfun(*s1)  # == myfun(s1[0],s1[1],s1[2])
myfun(*s2)  # == myfun(s2[0],s2[1],s2[2])
myfun(*s3)  # == myfun(s3[0],s3[1],s3[2])

由例項講解:
myfun有三個引數,所以我們也要傳遞三個引數,其中s1列表有3個元素,其實我已經寫出來了,呼叫函式傳遞引數時會在列表名前加一個 ‘ * ’ 號,表示按列表的元素位置傳參,即第一個引數傳s[0],第二個引數傳s[1],第三個引數傳s[2]。其實看例項就懂了,就不多囉嗦了

關鍵字傳參

關鍵字傳參,是隻指在傳參時,按照形參的名稱給實參賦值
實參和形參按名稱進行匹配

例項:

>>> def myfun(a, b, c):
    print('a:', a)
    print('b:', b)
    print('c:', c)
>>> myfun(b = 23, c = 34, a = 12)
a: 12
b: 23
c: 34

雖然傳遞引數時不是按abc的順序傳遞的,但卻能各就其位,這就是關鍵字傳參的好處了吧。

說明:實參和形參按照形參名進行匹配,可以不按位置進行匹配。沒毛病

字典關鍵字傳參

字典關鍵字傳參是指實參為字典,將字典用 ** 拆解後進行關鍵字傳參的方式

說明:

  • 字典的鍵名和形參名一致
  • 字典的鍵名必須是字串(且為識別符號的命名方式)
  • 字典的鍵名要在形參中存在

函式的綜合傳參

~函式的傳參方式,在能確定形參能唯一匹配到相應實參的情況下可以任意組合
~函式的位置傳參要先於關鍵字傳參
說明:
1. 位置傳參和序列傳參可以混合使用,也可以順序顛倒
如:
myfun(100, *[100, 200])
myfun(*[100, 200], 300)
myfun([100], 200, [300])
2. 函式的關鍵字傳參和字典關鍵字傳參可以混合使用也可以順序顛倒
如:
myfun(c=300, **{‘b’: 10, ‘a’: 20})
myfun( **{‘b’: 10, ‘c’: 20}, a = 30)
3. 位置傳參和關鍵字傳參可以混合使用,但位置傳參要先於關鍵字傳參
如:
myfun(100, c=200, b=10)
myfun(10, c=30, **{‘b’:200})

函式的預設引數

~預設引數必須自左至右依次存在,如果一個引數有預設引數,則其右側的所有引數必須有預設引數
~預設引數可以有0個或多個,甚至全部都有預設引數

例項:

def fn(a, b=10, c):  # 錯誤
    pass
def fn(a, b=12, c=23):  # 正確
    pass

函式形參的定義方式:

  • 位置
  • 星號元組
  • 命名關鍵字
  • 雙星字典

位置形參

語法:

def 函式名(形參名1,形參名2...):
    語句塊

星號元組形參

語法:

def 函式名(*元組形參名):
    語句塊

作用:收集多於的位置形參

例項:

def func(a, b, *args):
    print('a=',a)
    print('b=',b)
    print('args=',args)

func(1, 2, 3, 4, 5, 6, 7, 8, 9)

先按位置傳參:a=1, b=2, 剩下的都給 *args
列印結果:

a= 1
b= 2
args= (3, 4, 5, 6, 7, 8, 9)

命名關鍵字形參:

語法:

def 函式名(*, 命名關鍵字形參):
    語句塊
或
def 函式名(*args, 命名關鍵字形參):
    語句塊

作用:
強制所有的引數都必須用關鍵字傳參或字典關鍵字傳參

例項:

def fun(*, c, d):
    print('c=', c)
    print('d=', d)

def fun2(a, b, *, c, d):  # *是位置傳參和關鍵字傳參的分隔符
    print(a, b, c, d)

def fun3(a, b, *args, c, d):
    print(a, b, args, c, d)

# fun(3, 4)  # 出錯
fun(d=2, c=3)
fun2(1, 2, c=3, d=4)
fun3(11, 22, 33, 44, 55, c=66, d=77)
fun3(11, 22, **{'d': 4, 'c': 5})

列印結果:

c= 3
d= 2
1 2 3 4
11 22 (33, 44, 55) 66 77
11 22 () 5 4

雙星號字典形參

語法:

def 函式名(**字典形參名):
    語句塊 

作用:收集多餘的關鍵字傳參

例項:

def fun(**kwargs):
    print('關鍵字傳參的個數:', len(kwargs))
    print('kwargs=', kwargs)

fun(name='zhangsan', age=12, address='北京朝陽區')
fun(a=1, b='bbb', c=[1, 2, 3], d=True)
fun(a=100, **{'c': 300, 'd': 200})

列印結果:

關鍵字傳參的個數: 3
kwargs= {'name': 'zhangsan', 'age': 12, 'address': '北京朝陽區'}
關鍵字傳參的個數: 4
kwargs= {'a': 1, 'b': 'bbb', 'c': [1, 2, 3], 'd': True}
關鍵字傳參的個數: 3
kwargs= {'a': 100, 'c': 300, 'd': 200}

函式的引數說明:

位置形參,預設引數,星號元組形參,雙星號字典形參等可以混合使用

函式形參從左向右的順序為:
1. 位置形參
2. 星號元組形參
3. 命名關鍵字形參
4. 雙星號字典形參
例項:

def fn(a, b, *args, c, **kwargs):
    print(a, b, args, c, kwargs)

fn(1, 2, 3, 4, d='d', e='e', c='c')

列印結果:

1 2 (3, 4) c {'d': 'd', 'e': 'e'}

本節完

相關文章