Star运算符是什么意思?

可能重复:
* args和** kwargs是什么意思?

*运算符在Python中的含义是什么,比如像zip(*x)f(**k)这样的代码?

  • 翻译人员在内部如何处理?
  • 它会影响性能吗? 它是快还是慢?
  • 它何时有用,何时不是?
  • 是否应该在函数声明或通话中使用?

  • 单星*将序列/集合解开成位置参数,所以你可以这样做:

    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)
    

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


    此外,您可以定义函数来获取*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
    

    一个小点:这些不是运营商。 运算符在表达式中用于从现有值中创建新值(例如,1 + 2变为3)。这些*和**是函数声明和调用语法的一部分。


    它被称为扩展调用语法。 从文档:

    如果语法*表达式出现在函数调用中,则表达式必须计算为一个序列。 来自这个序列的元素被视为它们是附加的位置参数; 如果存在位置参数x1,...,xN,并且表达式计算为序列y1,...,yM,则这相当于具有M + N个位置参数x1,...,xN,y1,...的调用。 ..,yM。

    和:

    如果语法**表达式出现在函数调用中,则表达式必须计算为一个映射,其中的内容被视为附加关键字参数。 如果关键字出现在expression和explicit关键字参数中,则会引发TypeError异常。

    链接地址: http://www.djcxy.com/p/1569.html

    上一篇: What does the Star operator mean?

    下一篇: Unpacking, extended unpacking, and nested extended unpacking