Python中 * 和 ** 的打包和解包

python中的 * 和 ** ,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的。

一、打包参数

*的作用:在函数定义中,收集所有位置参数到一个新的元组,并将整个元组赋值给变量args。

def f(*args):
    print(args)
 
 
f()  # ()
f(1)  # (1,)
f(1,2,3,4,5)  #(1,2,3,4,5)

** 的作用:在函数定义中,收集关键字参数到一个新的字典,并将整个字典赋值给变量kwargs。

def f(**kwargs):
    print(kwargs)
 
f()     # {}
f(a=1, b=2)     # {'a': 1, 'b': 2}

二、解包参数

*的作用:在函数调用中,能够将元组或列表解包成不同的参数。

def func(a, b, c, d):
    print(a, b, c, d)
 
 
argc = (1, 2, 3, 4)
func(*argc)     # 1 2 3 4
 
argc = [1, 2, 3, 4]
func(*argc)     # 1 2 3 4

** 的作用:在函数调用中,** 会以键/值的形式解包一个字典,使其成为一个独立的关键字参数。

def func(a,b,c,d):
    print(a,b,c,d)
 
kwargs = {'a':1, 'b':2, 'c':3, 'd':4}
func(**kwargs)      # 1 2 3 4

三、注意

在函数定义时, * 表示打包,在函数体内部, * 表示的却是解包,事实上,下面例子中print(*args)是print()函数的调用。

def foo(*args, **kwargs):
    print(args)  # 未解包参数
    print(*args)  # 解包参数
 
 
v = (1, 2, 4)
d = {'a': 1, 'b': 12}
foo(v, d)
 
#   ((1, 2, 4), {'a': 1, 'b': 12})
#   (1, 2, 4) {'a': 1, 'b': 12}

打包和解包并不能脱离函数而存在

表面上看并没有什么函数,实际上是有的,用的就是format的函数调用。

c = {'name':'张', 'age':12}
 
**c  # 报错信息: SyntaxError: invalid syntax
 
print("Name:{name}, Age:{age}".format(**c))   # Name:张, Age:12

四、练习

def f(str1, *args, **kwargs):
    print(str1, args, kwargs)
 
l = [1, 2, 3]
t = [4, 5, 6]
d = {"a":7, "b":8, "c":9}
 
f(1, 2)
f(1, 2, 3, "python")
f("python", a=1, b=2, c=3)
 
print("================")
 
f("python", l, d)
f("python", *t)
f("python", *l, **d)
f("python", q="winning", **d)
 
 
运行结果:
(2,) {}
(2, 3, 'python') {}
python () {'a': 1, 'b': 2, 'c': 3}
================
python ([1, 2, 3], {'a': 7, 'b': 8, 'c': 9}) {}
python (4, 5, 6) {}
python (1, 2, 3) {'a': 7, 'b': 8, 'c': 9}
python () {'a': 7, 'b': 8, 'q': 'winning', 'c': 9}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值