Python内置"所有"与生成器

mac*_*iej 5 python numpy

我对python的"all"和生成器有以下问题:

G = (a for a in [0,1])
all(list(G))   # returns False - as I expected
Run Code Online (Sandbox Code Playgroud)

但:

G = (a for a in [0,1])
all(G)         # returns True!
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释一下吗?

更新:我发誓我明白了!看一下这个:

In [1]: G = (a for a in [0,1])

In [2]: all(G)
Out[2]: True
Run Code Online (Sandbox Code Playgroud)

我使用Python 2.6.6和IPython 0.10.2,都安装在Python(x,y)包中.奇怪的是,当我使用Spider IDE时,我得到"True"(上图),而在纯控制台中,我得到"False"......

更新2:正如帝斯曼指出的那样,这似乎是一个尴尬的问题.Python(x,y)加载numpy,所有(G)实际上调用numpy.all(G)而不是内置all().一个快速的解决方法是写:

__builtins__.all(G)
Run Code Online (Sandbox Code Playgroud)

感谢大家的帮助!

-maciej

DSM*_*DSM 13

啊哈!

Python(x,y)是否碰巧导入numpy?[它看起来像.]

Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> 
>>> G = (a for a in [0,1])
>>> all(G)
False
>>> from numpy import all
>>> 
>>> G = (a for a in [0,1])
>>> all(G)
True
>>> 
Run Code Online (Sandbox Code Playgroud)

这是Robert Kern的解释:

它[all --ed]通过调用Numpy.asarray()的C API等效数组和它可以变成数组的东西.在asarray()中有大量的魔术和特殊情况,以便将嵌套的Python序列解释为数组.当我们有已知长度的序列时,这种魔法效果相当好; 当给定一个未知长度的任意迭代器时,它完全失败.所以我们踢了.不幸的是,接下来发生的事情是asarray()看到一个对象无法将其解释为变成真实数组的序列,因此它使用迭代器对象作为值来生成rank-0数组.评估结果为True.


don*_*mus 7

不,它没有.以下代码段返回False

G = (a for a in [0,1])
all(G)         # returns False
Run Code Online (Sandbox Code Playgroud)

你是否正在做以下事情

G = (a for a in [0,1])
all(list(G))   # returns False
all(G)         # returns True!
Run Code Online (Sandbox Code Playgroud)

在这种情况下,G当你构造列表时,你正在耗尽生成器,所以最后的调用all(G)是在一个空的生成器上,因此返回相当于all([])- > True.

发电机不能多次使用.


agf*_*agf 3

>>> G = (a for a in [0,1])
>>> all(list(G))
False
>>> G = (a for a in [0,1])
>>> all(G)
False
Run Code Online (Sandbox Code Playgroud)

True。然而:

>>> G = (a for a in [0,1])
>>> all(list(G))
False
>>> all(G)
True
>>> all([])
True
Run Code Online (Sandbox Code Playgroud)

如果您all第二次调用生成器,您将得到,因为生成器中True没有剩余项目。False正如您所看到的,任何空序列都将起到相同的作用。

对于这个特殊的例子,all短路,所以你必须在1它返回后生成,False因为前导0(如果你不使用list)——所以它会True第二次返回,尽管不为空。