为什么'所有' Python中的函数接收数组而不是* args?

时间:2016-06-15 16:25:11

标签: python

问题是关于流行的Pythonic功能。

a = True
b = True
print(all([a, b]))

为什么不使用*args?所以它看起来像这样:

a = True
b = True
print(all(a, b))

列表在这里似乎是多余的 - 当我们能够将参数传递给* args。

2 个答案:

答案 0 :(得分:3)

all适用于已有迭代的情况。如果您有两个单独的布尔值,那就是and的工作:

print(a and b)

使all*args而不是迭代会强制输入的实现,即使在早期返回False结果的情况下,或者输入可迭代结果太多的情况下也是如此将所有这些元素保存在记忆中的元素。

from itertools import repeat

def starargs_all(*booleans):
    return all(booleans)

print(all(repeat(False, 10**10))) # prints immediately
print(starargs_all(*repeat(False, 10**10))) # takes a while, uses lots of memory, awkward *

答案 1 :(得分:0)

因为all()适用于 ANY 可迭代,不仅仅是列表。 E.g:

def makeGen():
   i = 1
   while i <= 10:
      yield i
      i = i + 1

all(makeGen())