几种传参方式和解构介绍

位置参数


  • def f(x,y)

参数缺省值


  • def f(x,y=1)

可变位置参数


  • def func(*args)
def sum(*nums):
    result = 0
    print(nums) #看看nums变成的啥?
    for i in nums:
        result += i
    return result
print(sum(1,2,3))
------------------------
(1, 2, 3) # 组织到一个tuple中
6
  • 可接受多个实参
  • 收集来的实参组织到一个 tuple

可变关键字参数


  • def func(**kwargs)
def func(**kwargs):
    print(kwargs)
func(a=1, b=2)
-------------------
{'a': 1, 'b': 2}
  • 可变关键字参数收集形成一个 dict
  • 混合使用参数:普通参数放在参数列表前面,可变参数在后且可变位置参数需要在可变关键字参数之前
    • def func(x,y,*args,**kwargs)

keyword-only 参数


  • py3 新增,在一个*之后,或在一个可变位置参数之后出现的普通参数即为 keyword-only 参数
# 可变位置参数后keyword-only参数
def fn(*args,x):
    print(args, x, sep='\n', end='\n')
fn(1, 2, 3, x=4)
--------------------
(1, 2, 3)
4

# *之后的keyword-only参数
def fn(*,x,y)
    print(x,y)
fn(x=1, y=2)
---------------------
1 2

混合使用遵循规则


  • 可读易懂
  • 参数列表一般顺序为:普通参数,缺省参数,可变位置参数,keyword-only 参数 (可带缺省值)、可变关键字参数
    • def fn(x, y, z=3, *args, m=4, n, **kwargs)
def fn(x, y, z=0, *args, m=1, n, **kwargs):
    print(x,y,z,m,n)
    print(args)
    print(kwargs)
fn(1,2,3,4,5,m=6,n=2,i=1,j=2)
-------------------------------
1 2 3 6 2
(4, 5)
{'i': 1, 'j': 2}

参数解构


  • 在可迭代对象前使用***, 提取其所有元素作为函数的实参
  • *解构成位置参数
  • **解构成关键字参数
def sum(*nums):
    result = 0
    print(nums)
    for i in nums:
        result += i
    return result
print(sum(*range(1,4)))
print(sum(*[1, 2, 3]))
print(sum(1,2,3))
----------------------
(1, 2, 3)
6
(1, 2, 3)
6
(1, 2, 3)
6

参考


  • magedu