这个问题基本弄清楚了,星号(asterisk)主要在函数定义和函数调用的时候使用。函数定义时使用单个*会将所有的参数,放入一个元组(tuple)供函数使用。
使用两个 **会将所有的关键字参数,放入一个字典(dict)供函数使用。
函数调用时在list,tuple,set前加一个星号会把容器中的所有元素解包(unpack)变成位置参数。
在dict前加一个星号会把字典的键变成位置参数。
在dict前加两个星号会把字典的键值对变成关键字参数。
a={'a':'Ass','b':'We','c':'Can'}
具体到描述中的函数:
Aniki(*a)
等同于Aniki("a", "b", "c")
Aniki(**a)
等同于 Aniki(a="Ass", b="We", c="Can")
Aniki(**a,b=(1,2))
等同于 Aniki(a="Ass", b="We", c="Can",b=(1,2))
希望说清楚了。
Python3中新增的两种用法:Keyword-Only Arguments 仅关键字参数
Extended Iterable Unpacking 扩展迭代解包
仅关键字参数
在*args后加入关键字参数,就可以要求这个参数必须以关键字的方式赋值。
def keyword_only(a, *args, b):
print[a, args, b]
在调用的时候,必须用关键字的方式赋值。单个星号*也有相同作用,只不过不能接收无限位置参数了。
def keyword_only(a, *, b):
print[a, args, b]
扩展迭代解包
许多算法要求以第一个元素 和 剩下的全部 这种方式分割一个序列。即
first, rest = seq[0], seq[1:]
现在可以这样:
first, *rest = seq
或者这样:
a, *b, c = seq
a取得第一个元素,c取得最后一个元素,b取得剩下的全部。
PEP文档: