我对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.
不,它没有.以下代码段返回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.
发电机不能多次使用.
>>> 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第二次返回,尽管不为空。
| 归档时间: |
|
| 查看次数: |
1351 次 |
| 最近记录: |