*
运算符在 Python 中是什么意思,例如 zip(*x)
或 f(**k)
之类的代码?
- 解释器内部是如何处理的?
- 它会影响性能吗?是快还是慢?
- 什么时候有用什么时候没用?
- 它应该用在函数声明中还是调用中?
原文由 psihodelia 发布,翻译遵循 CC BY-SA 4.0 许可协议
*
运算符在 Python 中是什么意思,例如 zip(*x)
或 f(**k)
之类的代码?
原文由 psihodelia 发布,翻译遵循 CC BY-SA 4.0 许可协议
在函数调用中,单星将列表转换为单独的参数(例如 zip(*x)
与 zip(x1,x2,x3)
相同,如果 x=[x1,x2,x3]
将字典转换为双星 - )单独的关键字参数(例如 f(**k)
与 f(x=my_x, y=my_y)
相同,如果 k = {'x':my_x, 'y':my_y}
。
在函数定义中,情况正好相反:单星将任意数量的参数转换为列表,而双星将任意数量的关键字参数转换为字典。例如 def foo(*x)
表示“foo 接受任意数量的参数,它们可以通过列表 x 访问(即如果用户调用 foo(1,2,3)
, x
-c3-ed267 将是 [1,2,3]
)” 和 def bar(**k)
意味着”bar 接受任意数量的关键字参数,它们可以通过字典 k 访问(即,如果用户调用 bar(x=42, y=23)
k
将是 {'x': 42, 'y': 23}
)”。
原文由 sepp2k 发布,翻译遵循 CC BY-SA 2.5 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答884 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
单星
*
将序列/集合解压缩到位置参数中,因此您可以这样做:这将解压元组,以便它实际执行为:
双星
**
做同样的事情,只使用字典并因此命名参数:您还可以组合:
将执行为:
另请参阅 Python 文档的第 4.7.4 节 - 解包参数列表。
此外,您可以定义函数以接受
*x
和**y
参数,这允许函数接受声明中未明确命名的任意数量的位置和/或命名参数。例子:
或者用
**
:这可以允许您指定大量可选参数而无需声明它们。
同样,您可以组合: