Answers:
使用创建一个生成器
g = myfunct()
每当您想要一个项目时,请使用
next(g)
(或g.next()
在Python 2.5或更低版本中)。
如果发电机退出,它将升高StopIteration
。您可以根据需要捕获此异常,也可以将default
参数用于next()
:
next(g, default_value)
next(gen, default)
也可以用来避免StopIteration
异常。例如,next(g, None)
对于字符串生成器,在迭代完成后将生成字符串或“无”。
next(g)
。这将在内部调用g.__next__()
,但是您实际上不必担心,就像您通常不关心在len(a)
内部调用一样a.__len__()
。
g.next()
是g.__next__()
在py3k。next(iterator)
自python 2.6起就内置了该内建函数,所有新的Python代码都应使用该内建函数,如果需要支持py <= 2.5,则对后实现来说是微不足道的。
要仅选择生成器的一个元素,请break
在for
语句中使用,或list(itertools.islice(gen, 1))
根据您的示例(从字面上看),您可以执行以下操作:
while True:
...
if something:
for my_element in myfunct():
dostuff(my_element)
break
else:
do_generator_empty()
如果您想“ 每当我喜欢的时候就从 [生成的] 生成器中仅获取一个元素 ”(我想是最初意图的50%,也是最常见的意图),那么:
gen = myfunct()
while True:
...
if something:
for my_element in gen:
dostuff(my_element)
break
else:
do_generator_empty()
这样generator.next()
可以避免显式使用,并且输入结束处理不需要(神秘的)StopIteration
异常处理或额外的默认值比较。
在else:
的for
,如果你想要做一些特别的结束产生的case语句段时,才需要。
next()
/ .next()
:在Python3中,该.next()
方法被重命名.__next__()
为有充分的理由:它被认为是低级的(PEP 3114)。在Python 2.6之前,内置函数next()
不存在。甚至讨论过迁移next()
到该operator
模块(这本来是明智的做法),因为它很少需要,并且内置名称的可疑膨胀。
在next()
没有默认值的情况下使用仍然是非常低级的实践- StopIteration
在普通的应用程序代码中公开地将神秘的东西扔掉。而且使用next()
默认的哨兵-最好是next()
直接输入的唯一选择builtins
-受限制,并且通常会给出奇怪的非Python逻辑/可读性的原因。
底线:很少使用next()-就像使用operator
模块的功能一样。使用for x in iterator
,islice
,list(iterator)
等功能接受一个迭代器无缝地使用是在应用层上的迭代器的自然方式-而且相当总是可能的。next()
是低级的,一个额外的概念,很明显-正如该线程的问题所示。虽然例如,使用break
在for
是常规的。
mySeq.head
?
Generator是产生迭代器的函数。因此,一旦有了迭代器实例,就可以使用next()从迭代器中获取下一项。例如,使用next()函数来获取第一个项目,然后for in
用于处理剩余的项目:
# create new instance of iterator by calling a generator function
items = generator_function()
# fetch and print first item
first = next(items)
print('first item:', first)
# process remaining items:
for item in items:
print('next item:', item)
我相信唯一的方法是从迭代器中获取一个列表,然后从该列表中获取所需的元素。
l = list(myfunct())
l[4]
myfunct()
生成大量值,则不是最佳方法),因为您可以使用内置函数next
来获取下一个生成的值。