【问题标题】:Unexpected Outcome with Generator Expressions and Any/All生成器表达式和任何/全部的意外结果
【发布时间】:2020-07-06 19:02:54
【问题描述】:

我在评估生成器表达式时遇到了一个奇怪的问题。

我的代码有一个生成器表达式,可以测试几个条件。我们称之为“gen_ex”。如果我把它变成一个列表来查看输出:

print(list(gen_ex))

我明白了:

[False, False, False, False, True, True, False, False, False]

但是,当我对它使用 any() 和 all() 时,我得到了意想不到的结果。

any(gen_ex)

返回 False,而:

all(gen_ex)

返回 True。

这应该是预期的行为吗?还是幕后发生了什么奇怪的事情?

【问题讨论】:

  • 创建列表会耗尽生成器; anyall 都没有看到任何要测试的值,因此分别对 FalseTrue 进行空评估。
  • ...这就是你所做的一切吗?因为如果您执行list(gen_ex),那么生成器将被消耗,之后始终为空,因此,any 将始终返回 false,all true 将始终在空迭代器上返回 true...请始终发布 @ 987654321@ 这样我们就可以真正重现您正在做的事情并避免这种不必要的猜测

标签: python generator any


【解决方案1】:

生成器不能迭代多次。第一次调用list 会消耗所有值。

>>> gen_ex = (x for x in (1,2,3))
>>> list(gen_ex)
[1,2,3]
>>> list(gen_ex)
[]

因此,anyall 也看到了一个空的值序列。您看到的返回值是基本情况:

  • any([])False,因为列表中没有 True 元素(即,参数中的元素计算结果为 True 是不正确的)
  • all([])True,因为列表中没有 False 元素(即,确实列表中的每个元素都是 True,因为没有元素

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多