这个问题在这里已有答案:
*
运算符在Python中的含义是什么,例如 zip(*x)
或 f(**k)
等代码?
-
如何在解释器内部处理?
-
它会影响性能吗?是快还是慢?
-
什么时候有用,什么时候不用?
-
它应该用在函数声明还是调用中?
这个问题在这里已有答案:
*
运算符在Python中的含义是什么,例如 zip(*x)
或 f(**k)
等代码?
如何在解释器内部处理?
它会影响性能吗?是快还是慢?
什么时候有用,什么时候不用?
它应该用在函数声明还是调用中?
5 回答
单星
*
将序列/集合解压缩为位置参数,因此您可以这样做:这将解压缩元组,使其实际执行如下:
双星
**
做同样的事情,只使用字典并因此命名参数:你也可以结合:
将执行为:
另请参阅Python文档的4.7.4 - Unpacking Argument Lists部分 .
此外,您可以定义函数以获取
*x
和**y
参数,这允许函数接受在声明中未明确命名的任意数量的位置和/或命名参数 .例:
或者
**
:这可以允许您指定大量可选参数而无需声明它们 .
再次,你可以结合:
一点是:这些不是运营商 . 运算符在表达式中用于从现有值创建新值(例如,1 2变为3 . *和**这里是函数声明和调用语法的一部分 .
它被称为扩展调用语法 . 来自documentation:
和:
我发现这对于你想要“存储”一个函数调用特别有用 .
例如,假设我对函数'add'进行了一些单元测试:
没有其他方法可以调用add,除了手动执行add(test [0],test [1])之类的操作,这很丑陋 . 此外,如果存在可变数量的变量,那么代码可能会变得非常丑陋,您需要使用所有if语句 .
另一个有用的地方是定义Factory对象(为您创建对象的对象) . 假设您有一些类Factory,它会生成Car对象并返回它们 . 你可以这样做,myFactory.make_car('red','bmw','335ix')创建Car('red','bmw','335ix'),然后返回它 .
当您想要调用超类的构造函数时,这也很有用 .
在函数调用中,单个星形将列表转换为单独的参数(例如,如果
x=[x1,x2,x3]
,则zip(*x)
与zip(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
将是[1,2,3]
)”,def bar(**k)
表示“bar接受任意数量的关键字参数,它们将可访问通过字典k(即如果用户调用bar(x=42, y=23)
,k
将{'x': 42, 'y': 23}
)“ .