Python的:在一个非空列表的迭代没有if子句来了空。为什么?
-
22-08-2019 - |
题
如何一个迭代在非空序列,没有过滤和没有聚集(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 iterator
或sum(iterator)
。但是,当我们直接调用next()
,我们负责捕捉StopIteration
的人。不这样做弹簧的抽象,它在这里导致意外的行为在外部循环的泄漏。
的教训,我想:要小心直接调用next()
str是一个保留关键字,你应该以不同命名变量
我也告知关于下一个
>>> seq=['a','b','c']
>>> list((el,4) for el in seq)
[('a',4), ('b',4), ('c',4)]
所以它不是list
这里给你的麻烦...
不隶属于 StackOverflow