如何在没有过滤和没有聚合(sum()
等等)的非空序列上产生迭代器,什么都不产生?
考虑一个简单的例子:
sequence = ['a', 'b', 'c'] list((el, ord(el)) for el in sequence)
这[('a', 97), ('b', 98), ('c', 99)]
按预期产生.
现在,只需将ord(el)
out 换成一个表达式,该表达式使用某个生成器的第一个值(...).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',
东西)
元组.没有.
但我们不是过滤,聚合或减少.n
没有过滤或聚合的对象上的生成器表达式必须产生n
对象,对吗?这是怎么回事?
odd_integers_up_to_length(el).next()
会引发StopIteration,它不会被捕获,但会被捕获到其中的生成器表达式,停止它而不会产生任何结果.
当值为'a'时,查看第一次迭代:
>>> odd_integers_up_to_length('a').next() Traceback (most recent call last): File "", line 1, in StopIteration