2

我有点困惑。让我们创建一个名为 x 的函数。我知道通过将 * 放在 y 之前,这意味着我们可以添加任意数量的参数。

def x(*y):
    return y

然而。

情况1:

>>> x(1, 2)
(1, 2)

案例 2: 让我们传递一个带有星号的列表 [1,2]:

>>> x(*[1,2])
(1, 2)

似乎单个星号有两个用途:

  1. 允许在函数中使用多个参数 - 本质上是将它们放入列表中
  2. 如果执行两次,将列表“分解”为单独的项目

为什么是这样?为什么我不能这样做:*a*b?

4

2 回答 2

3

函数定义中的星号与函数调用中的星号完全不同。您不需要两颗星就可以将列表分成单独的参数:

def f(a, b, c):
    return a*b + c

f(*(1, 2, 3)) # returns 5

在定义中,星号参数接收任何不适合声明的位置参数的位置参数,包装在一个元组中。在调用中,Python 迭代一个带星号的参数,并将元素作为参数单独传递。这些功能有时一起使用,但很少会定义一个带有星号参数的函数,只是为了始终传递一个星号参数。

于 2013-08-02T22:43:55.587 回答
3

在函数定义*中用于收集元组中的所有位置参数,在函数调用中*解包一个可迭代对象并将其项目作为位置参数传递。

如果*a*b您尝试解压缩两个迭代器/迭代器ab那么正确的方法是:

>>> 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')

如果两者ab都是相同类型并且是可迭代的,那么您也可以使用:

>>> a = [1, 2, 4]
>>> b = [0,1]
>>> func(*(a + b))
(1, 2, 4, 0, 1)
于 2013-08-02T22:54:29.250 回答