如何一个迭代在非空序列,没有过滤和没有聚集(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

其他提示

所发生的是该next()调用产生一个StopIteration例外,其堆气泡到外发生器表达和停止的迭代。

一个StopIteration是一个迭代的信号,它的完成正常的方式。一般来说,我们看不到它,因为一般next()呼叫消耗的迭代器结构内发生,例如for x in iteratorsum(iterator)。但是,当我们直接调用next(),我们负责捕捉StopIteration的人。不这样做弹簧的抽象,它在这里导致意外的行为在外部循环的泄漏。

的教训,我想:要小心直接调用next()

str是一个保留关键字,你应该以不同命名变量

我也告知关于下一个

>>> seq=['a','b','c']
>>> list((el,4) for el in seq)
[('a',4), ('b',4), ('c',4)]

所以它不是list这里给你的麻烦...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top