在Python中产生突破
根据对这个问题的回答,C#中的yield break与python中的return相当。 在正常情况下,'返回'的确停止了发电机。 但是,如果你的函数什么都不做,只能返回,你将得到一个None,而不是一个空的迭代器,它是由C#中的yield break返回的。
def generate_nothing():
return
for i in generate_nothing():
print i
你将得到一个TypeError:'NoneType'对象不可迭代。 但是如果我在返回之前添加一个永不退出的yield,这个函数返回我期望的结果。
def generate_nothing():
if False: yield None
return
如果工作,但似乎有线。 谁有更好的主意?
谢谢,
处理这个问题的一个好方法是提高StopIteration,当你的迭代器没有剩下任何东西放弃并调用next()
时,会引发StopIteration。 这也将优雅地摆脱for循环执行循环内没有任何东西。
例如,给定一个元组(0, 1, 2, 3)
我想得到重叠对((0, 1), (1, 2), (2, 3))
。 我可以这样做:
def pairs(numbers):
if len(numbers) < 2:
raise StopIteration
for i, number in enumerate(numbers[1:]):
yield numbers[i], number
现在pairs
安全处理与1号以下列表。
def generate_nothing():
return
yield
def generate_nothing():
return iter([])
链接地址: http://www.djcxy.com/p/54333.html