非空序列上的迭代器如何在没有过滤和聚合(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/