2017-03-01 70 views
0

为什么我必须使用变量从Python生成器中获取next()值?为什么我必须使用变量来从Python生成器中获取值?

def my_gen(): 
    i = 0 
    while i < 4: 
     yield 2 * i 
     i += 1 

#p = my_gen() 
#for i in range(4): 
# print(next(p)) 

##for i in range(4): 
## print(next(my_gen())) 

在上面#号工作,而##块返回4个副本的第一个“收益”。

+3

'my_gen()'创建一个新的生成器。也就是说,'next(p)'不等于重复调用'my_gen()'。 – miradulo

+0

你可以使用生成器:'print(* my_gen())' '0 2 4 6'' – f5r5e5d

回答

2
print(next(my_gen())) 

每本上运行,你打电话next()my_gen()返回一个单独的(和全新)生成时间。

如果您想在同一个生成器上多次呼叫next(),您需要一些方法让该生成器保持足够长的时间以重用它。

+1

python命名的生成器/迭代器/疯狂a **函数有点坏了。它增加了很多功能,但其中很多解释方式只会让人感到困惑 – Aaron

+2

@aaron你能解释为什么它们被破坏吗? –

+1

@PaulRooney许多人可互换地引用生成器,迭代器和协程(异步函数等)。技术上有单独的单独定义,但细微差别很容易混淆那些没有在cPython源代码中学习实际发生的东西的人们。这是我比较喜欢Lua而不是python的一个方面,因为它有函数和co-例程,没有别的。 (但这对橘子来说有点苹果) – Aaron

1

只是要加我的0.02 $ ...

这可能有助于澄清一些误解:

def function_that_creates_a_generator(n): 
    while n>0: 
     yield n 
     n - 1 

# this 
for x in function_that_creates_a_generator(5): 
    print(x) 

#is almost exactly the same as this 
generator = function_that_creates_a_generator(5) 
while True: 
    try: 
     x = generator.next() #same as: x = next(generator) 
    except StopIteration: 
     break 
    print(x) 

For循环其实只是写一个while循环,不断询问一个迭代对象的方式漂亮为其下一个元素。当你为另一个对象请求一个迭代器并且它没有时,它将引发一个StopIteration异常,该异常会自动陷入for循环;从循环中发出信号。在while循环中,我们简单地将这些事件单独分解出来,而不是将它们隐藏在解释器中。

相关问题