2017-09-02 58 views
-3

我不明白为什么for i in gen(100): print(i)正在这里使用。当我替换print(i)print(gen(i))它开始给予内存位置。我知道产量被用于一次性存储,但它的工作原理是什么?为什么for循环用于通过函数生成数字?

def gen(num): 
     i = 0 
     while i<num: 
      x=i 
      i+=1 
      if x%7 == 0: 
       yield x 
    for i in gen(100): 
     print(i) 
+2

可能重复[什么是“yield”关键字?](https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-做) – mx0

回答

1

yield不用于一次性存储。 yield使函数返回生成器

生成器是一个可迭代的对象(这意味着您可以使用它来代替任何序列,如list(gen()),for i in gen()等)。您也可以将它传递给next()内置函数,使发电机前进一步(使其开始或从停止位置开始并运行至碰到的第一个yield)。它还返回值产生

def gen(): 
    for i in range(5): 
     yield i 

print(list(gen())) # prints [0, 1, 2, 3, 4] 
print(next(gen())) # prints 0 

gn = gen() 
print(next(gn))  # prints 0 
print(list(gn))  # prints [1, 2, 3, 4] 
print(next(gn))  # raises StopIteration, because the generator is 
        # exhausted (the generator function ran to completion) 

为什么你从print(gen(i))得到一个内存地址的原因是因为你实际打印生成的对象,而不是它的价值。所以这就是为什么发生器首先必须迭代不知何故