本文所述的*和**,指的是*和**前缀运算符,而不是中缀运算符
这包括:
使用*和**将参数传递给函数
使用*和**捕捉传递到函数中的参数
使用*接受强制关键字参数
使用*在元组拆包封期间时捕获各项
使用*将迭代器解解包到列表/元组中
用**把词典解包到其他词典
调用函数时,使用*运算符可将迭代对象解包到不同参数中:
print(*fruits)将fruits列表中的所有项作为单独的参数传递到print函数调用中,我们甚至不需要知道列表包含多少个参数。如果没有*,除非列表是固定长度的,否则无法做到将特定迭代对象中的所有项作为单独的参数提交。
**运算符执行类似的操作,但是使用关键字参数。**操作符允许我们取一个键值对字典,并将其在函数调用中解包成关键字参数:
**用于将关键字参数解包到函数调用中并不常见,最常见的地方是执行继承:调用super()通常会用到*和**
假设有一个函数,该函数接受任何序列,并返回具有序列表与该列表的反序连接在一起:
这个函数需要经历两次转换成列表的过程来连接列表并返回结果。我们可以用下面写法替代:
该代码删除了一些不必要的列表调用使得它更高效、可读性更强。
使用*运算符是将不同类型的迭代器串在一起的方法。*运算符适用于任何迭代,而使用+运算符只适用于类型均相同的特定序列。
*运算符不限于创建列表。我们也可以利用它将迭代器转储到新的元组或集合中:
**运算符用于将键/值对从一个字典转储到新字典中来扩展其能力:
双星号不仅可以用于合并字典也可以在添加一个新值的同时复制字典:
或在重写特定值时复制或合并字典: