我有一个像下面这样的生成器函数:

def myfunct():
  ...
  yield result

通常调用这个函数的方法是:

for r in myfunct():
  dostuff(r)

我的问题是,有没有一种方法可以随时从生成器中获得一个元素? 例如,我想做这样的事情:

while True:
  ...
  if something:
      my_element = pick_just_one_element(myfunct())
      dostuff(my_element)
  ...

当前回答

generator = myfunct()
while True:
   my_element = generator.next()

确保捕获在获取最后一个元素后抛出的异常

其他回答

使用以下命令创建生成器

g = myfunct()

每次你想要一样东西的时候,就去用

next(g)

(或Python 2.5或以下版本的g.next())。

如果生成器退出,它将引发StopIteration。你可以在必要时捕获这个异常,或者使用默认参数next():

next(g, default_value)

对于那些浏览这些答案以获得完整的Python3工作示例的人……好吧,你开始吧:

def numgen():
    x = 1000
    while True:
        x += 1
        yield x

nums = numgen() # because it must be the _same_ generator

for n in range(3):
    numnext = next(nums)
    print(numnext)

这个输出:

1001
1002
1003

我相信唯一的方法是从迭代器中获取一个列表,然后从该列表中获取你想要的元素。

l = list(myfunct())
l[4]
generator = myfunct()
while True:
   my_element = generator.next()

确保捕获在获取最后一个元素后抛出的异常

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)