函数调用中的星号和双星号运算符是什么意思?

新手上路,请多包涵

* 运算符在 Python 中是什么意思,例如 zip(*x)f(**k) 之类的代码?

  1. 解释器内部是如何处理的?
  2. 它会影响性能吗?是快还是慢?
  3. 什么时候有用什么时候没用?
  4. 它应该用在函数声明中还是调用中?

原文由 psihodelia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 356
2 个回答

单星 * 将序列/集合解压缩到位置参数中,因此您可以这样做:

 def sum(a, b):
    return a + b

values = (1, 2)

s = sum(*values)

这将解压元组,以便它实际执行为:

 s = sum(1, 2)

双星 ** 做同样的事情,只使用字典并因此命名参数:

 values = { 'a': 1, 'b': 2 }
s = sum(**values)

您还可以组合:

 def sum(a, b, c, d):
    return a + b + c + d

values1 = (1, 2)
values2 = { 'c': 10, 'd': 15 }
s = sum(*values1, **values2)

将执行为:

 s = sum(1, 2, c=10, d=15)

另请参阅 Python 文档的第 4.7.4 节 - 解包参数列表


此外,您可以定义函数以接受 *x**y 参数,这允许函数接受声明中未明确命名的任意数量的位置和/或命名参数。

例子:

 def sum(*values):
    s = 0
    for v in values:
        s = s + v
    return s

s = sum(1, 2, 3, 4, 5)

或者用 **

 def get_a(**values):
    return values['a']

s = get_a(a=1, b=2)      # returns 1

这可以允许您指定大量可选参数而无需声明它们。

同样,您可以组合:

 def sum(*values, **options):
    s = 0
    for i in values:
        s = s + i
    if "neg" in options:
        if options["neg"]:
            s = -s
    return s

s = sum(1, 2, 3, 4, 5)            # returns 15
s = sum(1, 2, 3, 4, 5, neg=True)  # returns -15
s = sum(1, 2, 3, 4, 5, neg=False) # returns 15

原文由 Lasse V. Karlsen 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题