将生成器表达式传递给all()

时间:2014-05-08 03:35:46

标签: python iterable generator-expression

内置函数all()应该等同于:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

但是当生成器表达式传递给all()时,行为是不同的:

l=(1,2,3)
def all2(iterable):
    for element in iterable:
        if not element:
            return False
    return True
print all(e > 0 for e in l) # <generator object <genexpr> at 0x00000000096AB510>
print all2(e > 0 for e in l) # True

其他类似的内置插件也是如此。有没有一种简单的方法来解决它? (由于占用空间,将生成器表达式转换为元组或列表实际上不是一种选择。)

1 个答案:

答案 0 :(得分:1)

numpy有自己的all函数,其行为与内置all不同:

>>> numpy.all(x for x in range(3))
<generator object <genexpr> at 0x0000000001FD2900>
>>> all(x for x in range(3))
False

如果由于某种原因all引用numpy.all而不是__builtin__.all,可能是由于from numpy import *或由于Python发行版执行的自动导入而导致的,{&1;}重新使用,您将获得NumPy行为而不是内置行为。