混淆python星号符号的双重用法(作为函数参数或函数定义)
我有点困惑。让我们创建一个名为x的函数。我知道在y前面加*意味着我们可以添加任意多的参数混淆python星号符号的双重用法(作为函数参数或函数定义),python,functional-programming,Python,Functional Programming,我有点困惑。让我们创建一个名为x的函数。我知道在y前面加*意味着我们可以添加任意多的参数 def x(*y): return y 不过 案例1: >>> x(1, 2) (1, 2) 案例2: 让我们传递一个前面有星号的列表[1,2]: >>> x(*[1,2]) (1, 2) 单星号似乎有两种用途: 允许函数中有多个参数-本质上是将它们放入一个列表中 如果执行两次,则将列表“拆分”为单独的项目 为什么会这样?为什么我不能这样做:*a*b?函数定
def x(*y):
return y
不过
案例1:
>>> x(1, 2)
(1, 2)
案例2:
让我们传递一个前面有星号的列表[1,2]:
>>> x(*[1,2])
(1, 2)
单星号似乎有两种用途:
为什么会这样?为什么我不能这样做:*a*b?函数定义中的星号与函数调用中的星号完全分开。不需要两颗星就可以将列表分解为单独的参数:
def f(a, b, c):
return a*b + c
f(*(1, 2, 3)) # returns 5
在定义中,带星号的参数接收任何不适合声明的位置参数的位置参数,并封装在元组中。在调用中,Python对带星号的参数进行迭代,并将元素作为参数单独传递。这些功能有时在一起很有用,但很少使用带星号的参数定义函数,而只传递带星号的参数。在函数定义中,
*
用于收集元组中的所有位置参数,在函数调用中,*
解压iterable并将其项作为位置参数传递
如果通过*a*b
您试图解包两个iterable/迭代器a
和b
,那么正确的方法是:
>>> a = [1, 2, 4]
>>> b = 'foo'
>>> from itertools import chain
def func(*x):
print x
...
>>> func(*chain(a,b)) #chain will work for both iterators and iterables
(1, 2, 4, 'f', 'o', 'o')
如果a
和b
属于同一类型且可使用,则您也可以使用:
>>> a = [1, 2, 4]
>>> b = [0,1]
>>> func(*(a + b))
(1, 2, 4, 0, 1)