码迷,mamicode.com
首页 > 其他好文 > 详细

彻底理解 yield

时间:2018-09-26 13:03:38      阅读:1011      评论:0      收藏:0      [点我收藏+]

标签:16px   创建生成器   round   包含   lis   重复   ack   过程   代码   

1. 生成器定义

在Python中,一边循环一边计算的机制,称为生成器:generator。

 

2. 为什么要有生成器

列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。

如:仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间

 

3.如何创建生成器

第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:

>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

 创建Lg的区别仅在于最外层的[]()L是一个list,而g是一个generator。

 

方法二, 如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator:

 

4. 生成器的工作原理

(1)生成器(generator)能够迭代的关键是它有一个next()方法,

  工作原理就是通过重复调用next()方法,直到捕获一个异常

(2)带有 yield 的函数不再是一个普通函数,而是一个生成器generator,可用于迭代,工作原理同上。

(3)yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行

 

话不多说,翠花,上栗子:

 1 #encoding:UTF-8  
 2 def yield_test(n):  
 3     for i in range(n):  
 4         yield call(i)  
 5         print("i=",i)      
 6     print("Done.")  
 7   
 8 def call(i):  
 9     return i*2  
10   
11 for i in yield_test(5):  
12     print(i,",")

  结果:

>>>   
0 ,  
i= 0  
2 ,  
i= 1  
4 ,  
i= 2  
6 ,  
i= 3  
8 ,  
i= 4  
Done.
>>>

 理解的关键在于:下次迭代时,代码从yield的下一条语句开始执行。

彻底理解 yield

标签:16px   创建生成器   round   包含   lis   重复   ack   过程   代码   

原文地址:https://www.cnblogs.com/liangmingshen/p/9706181.html

(0)
(1)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!