特殊用法
1. 常规用法:
* 乘法运算 ** 指数运算
2. 函数参数
*args 和 **kwargs 主要用于函数定义。
*(星号) 才是必须的. 也可以写成 *ar 和 **k 。
*args 与 **kwargs 的区别,两者都是 python 中的可变参数:
*args 表示任何多个无名参数,它本质是一个 tuple
**kwargs 表示关键字参数,它本质上是一个 dict
如果同时使用 *args 和 **kwargs 时,必须 *args 参数列要在 **kwargs 之前。
3. 序列解包
可方便用于列表赋值
>>> a,*b,c=[1,2,3,4,5,6] >>> b [2, 3, 4, 5] >>> >>> a,*b,c=1,2,3,4,5,6 >>> b [2, 3, 4, 5] >>> a 1 >>> c 6 >>> >>> a,b,*c=range(1,7) >>> c [3, 4, 5, 6] >>> a 1 >>> b 2 >>> c [3, 4, 5, 6] >>> *c SyntaxError: can't use starred expression here >>> #不能直接在提示符下操作,如下: >>> print(*c) 3 4 5 6 >>>
功能扩展: 给单个列表赋值,然后降序排列输出
>>> *a,=range(1,4) >>> a [1, 2, 3] >>> print(*sorted(a,reverse=True)) 3 2 1 >>> >>> a = [*range(1,4)] >>> a [1, 2, 3] >>>
4. 字典解包
可方便用于合并字典
>>> a = dict.fromkeys('abcd') >>> b = dict.fromkeys('123') >>> {**a} {'a': None, 'b': None, 'c': None, 'd': None} >>> c = {**a, **b} >>> c {'a': None, 'b': None, 'c': None, 'd': None, '1': None, '2': None, '3': None} >>>
附录
位置参数和关键字参数
Python的函数的输入参数有两种类型,一种是位置参数(positional argument),一种是关键字参数(keyword argument)。
所谓positional argument位置参数,是指用相对位置指代参数。关键字参数(keyword argument),见名知意使用关键字指代参数。位置参数或者按顺序传递参数,或者使用名字,自然使用名字时,对顺序没有要求。
形参与实参
1. 形参:
1.1 位置形参:在定义阶段,按照从左到右的顺序依次定义的形参
特点:必须被传值
1.2 默认参数:在定义阶段,就已经为某个形参赋值,该形参称之为默认形参
特点:在定义阶段就已经有值,意味着调用阶段可以不用为其传值
注意点:位置形参必须放在默认形参的前面
1.3 形参中*与**的用法
1. 形参中带*:*会将溢出的位置实参存成元组的形式然后赋值其后变量名
def func(x,y,*args):
print(x,y,args)
func(1,2,3,4,5,6)
2. 形参中带**:**会溢出的关键字实参存成字典的格式然后赋值其后变量名
def func(x,y,**kwargs):
print(x,y,kwargs)
func(1,y=2,z=3,m=1,n=2)
2. 实参
2.1 位置实参: 在调用阶段,按照从左到右的顺序依次传入的值
特点:这种传值方式会与形参一一对应
func(2,1,3)
2.2 关键字实参: 在调用阶段,按照key=value的格式传值
特点:可以完全打乱位置,但仍然能为指定的形参传值
func(z=3,y=2,x=1)
注意:可以混用关键字实参与位置实参,但是
1. 同一个形参只能被赋值一次
2. 位置实参必须跟在关键字实参的前面
func(1,z=3,y=2)
func(1,z=3,y=2,x=333)
func(x=1,2,z=3) # 报语法错误
2.3 实参中*与**的用法
1. 实参中带*:先将实参打散成位置实参,然后再与形参做对应
def func(x,y,z):
print(x,y,z)
func(1,[2,3])
func(*[1,2,3]) #func(1,2,3)
func(*'hello') #func('h','e','l','l','o')
func(*'hel') #func('h','e','l')
2. 实参中带**:先将实参打散成关键字实参,然后再与形参做对应