Python:对没有 if 子句的非空列表的迭代结果为空。为什么?

标签 python iterator generator leaky-abstraction

非空序列上的迭代器如何在没有过滤和聚合(sum() 等)的情况下不产生任何结果?

考虑一个简单的例子:

sequence = ['a', 'b', 'c']
list((el, ord(el)) for el in sequence)

这会按预期产生 [('a', 97), ('b', 98), ('c', 99)]

现在,只需将 ord(el) 替换为使用 (...).next() 从某个生成器中获取第一个值的表达式 —原谅人为的例子:

def odd_integers_up_to_length(str):
    return (x for x in xrange(len(str)) if x%2==1)

list((el, odd_integers_up_to_length(el).next()) for el in sequence)

这会产生 []。是的,空列表。没有 ('a',stuff) 元组。什么都没有。

但我们不会过滤、聚合或减少。没有过滤或聚合的 n 对象的生成器表达式必须产生 n 对象,对吗?怎么回事?

最佳答案

odd_integers_up_to_length(el).next() 将引发 StopIteration,它不会在那里被捕获,但会被其中的生成器表达式捕获,停止它而不产生任何东西。

看看第一次迭代,当值为 'a' 时:

>>> odd_integers_up_to_length('a').next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

关于Python:对没有 if 子句的非空列表的迭代结果为空。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/703520/

相关文章:

python - Django 和换行问题

c++ - 用于 C++ 的 Eclipse 自动完成迭代器

c++ - 为什么我不能使用迭代器将 unique_ptr 从集合 move 到函数参数?

ruby-on-rails - 过滤掉 rails 保留字?

python - yield (yield) 有什么作用?

java - 如何仅生成整数列表的 3 个分区

python - 从 App Engine 连接到 MySQL 数据库

python - 安装 Python 2.7 和 Python 3.5 后,使用 IDLE 编辑选项不可用。应该做什么?

python - win32com.client : AttributeError: wdHeaderFooterPrimary and AttributeError: wdAlignParagraphCenter

c++ - 当需要访问容器时返回迭代器而不是底层容器本身