【问题标题】:Are python ANY and ALL greedy? [duplicate]python ANY 和 ALL 贪婪吗? [复制]
【发布时间】:2015-11-20 21:01:22
【问题描述】:

AnyAll 真值测试方法在 Python 中非常好。

基本上,当迭代器中至少有一个元素是 Truthy 时,any 返回 True。

只有当所有元素都是Truthy时,all才会返回True。

我无法理解的是,这些方法本质上是贪婪的吗?

如果我这样做了

all([False, x, y, z, p, q, r])

Python 甚至不应该费心检查 x,y,z ..et .al 的值,因为第一个 False 确保无论它们的值是什么,结果总是为假。

【问题讨论】:

  • all 短路,但列表创建不会。 [False, x, y, z, p, q, r] 将在 all 被调用之前评估所有元素。
  • 您可以自己查看:k=iter(range(2));all(k);print next(k)。请注意,生成器不会被消耗,只会消耗第一个虚假值之前的所有值。
  • @user2357112 很有趣。那么有什么好方法可以让这样的事情变得懒惰呢?
  • @iankit 使用生成器。
  • 顺便说一句:lazy 一词在这里过于笼统。 anyall 使用短路求值,这是一种特殊类型的非严格求值。请参阅Wikipedia article on evaluation strategies 以获得细微差别。

标签: python greedy


【解决方案1】:

这些方法很懒惰:它们会尽快退出。

【讨论】:

  • 该方法是惰性的,但是会在调用该方法之前构建完整的列表。当你传递一个生成器时,你只会得到懒惰的行为。
  • @MarkRansom 是的,但这有点像指出如果将列表用作初始值设定项,它会发生变异——这是编程语言的一个陷阱,实际上并没有反映有问题的操作。
猜你喜欢
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2011-05-15
  • 2017-07-13
  • 1970-01-01
  • 2011-08-29
相关资源
最近更新 更多