【问题标题】:Passing generator expression to all() [closed]将生成器表达式传递给 all() [关闭]
【发布时间】:2014-06-25 06:51:01
【问题描述】:

内置函数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

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

【问题讨论】:

  • 您的第一个示例在 2.7.6 中对我来说效果很好 - 您使用的是什么版本?
  • 确保你使用的是内置的all(),而不是你自己命名为all的函数。
  • 无法复制。你确定你没有命名函数 all 或者忘记在 genexp 之前写 all 吗?
  • 您是否碰巧在脚本顶部写了from numpy import *numpy 有一个 numpy.all 函数,它不像内置的 all 那样工作。这是不使用import *的原因之一。
  • 如何在评论中接受答案?我相信 user2357112 已经回答了我的问题。我没有import *,但我使用的 WinPython 可能已经为我导入了它。谢谢。

标签: python iterable generator-expression


【解决方案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 发行版执行的自动导入,您将获得 NumPy 行为内置的功能。

【讨论】:

    猜你喜欢
    • 2019-11-24
    • 2016-08-14
    • 2019-08-10
    • 1970-01-01
    • 2020-02-28
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多