我非常喜欢Python的... else语法 - 令人惊讶的是它的适用频率,以及它如何有效地简化代码.
但是,我还没有想出一个在生成器中使用它的好方法,例如:
def iterate(i): for value in i: yield value else: print 'i is empty'
在上面的例子中,我希望print
只有在i
空的情况下才能执行该语句.然而,无论长度如何,else
只有方面break
和return
它总是被执行i
.
如果不可能以for...else
这种方式使用,那么最好的方法是什么才能使print
语句只在没有产生的情况下执行?
你打破了生成器的定义,当迭代完成时它应该抛出一个StopIteration异常(由生成器函数中的return语句自动处理)
所以:
def iterate(i): for value in i: yield value return
最好让调用代码处理空迭代器的情况:
count = 0 for value in iterate(range([])): print value count += 1 else: if count == 0: print "list was empty"
可能是一种更干净的方式来做上述事情,但它应该工作正常,并不属于任何常见的"处理下面的陷阱列表陷阱".
有几种方法可以做到这一点.你总是可以Iterator
直接使用:
def iterate(i): try: i_iter = iter(i) next = i_iter.next() except StopIteration: print 'i is empty' return while True: yield next next = i_iter.next()
但是如果你对这个论点的期望有了更多的了解i
,你可以更简洁:
def iterate(i): if i: # or if len(i) == 0 for next in i: yield next else: print 'i is empty' raise StopIteration()