python知识点结构(五)(5.1标准类型)5.2控制和函数5.2.5-各种武器之生成器和迭代器

1、生成器

  记:1)def foo(): yield 则foo就叫做生成器函数。 ---》a =  foo() 则a就叫做生成器。这个构成函数什么都不执行。

    2)yield 本质是保存上一次执行的位置。 --- 返回yield 后数值。

    3)执行yield就返回数值,生成器.__next__()找到上一次yield位置,--- 寻找过程中所有语句都执行 遇到return 跳出整个函数。

以下例子是xrange的原理说明:

 1 def xr(xun):
 2     i = 0
 3     while i<xun:
 4         yield i
 5         i += 1
 6    
 7 n=xr(5)
 8 rec1 =n.__next__()
 9 rec2 =n.__next__()
10 rec3 =n.__next__()
11 rec4 =n.__next__()
12 rec5 =n.__next__()
13 
14 
15 print (rec1,rec2,rec3,rec4,rec5,)
16 #print (rec1.__next__(),rec2.__next__(),rec3.__next__(),rec4.__next__(),rec5.__next__(),)
17 print("******************************")
18 
19 
20 >>> 
21  RESTART: C:/Users/Administrator/AppData/Local/Programs/Python/Python35-32/xun.py 
22 0 1 2 3 4
23 ******************************
24 >>> 
View Code

 2、迭代器

1)能力:访问序列 ,未用生成器用next()方法按顺序遍历。生成器使用__next__逐个查yield。
2) 遍历序列 三步 1生成序列 2构造迭代器 3 next()访问获取元素。
3)如果序列能够构造迭代器则说这个对象是可迭代的对象。 用for来迭代访问。

 1 def xr(xun):
 2     i = 0
 3     while i<xun:
 4         yield i
 5         i += 1
 6    
 7 print("******************************")
 8 
 9 for i in xr(5):
10     print (i)
11 
12 
13 >>> 
14  RESTART: C:/Users/Administrator/AppData/Local/Programs/Python/Python35-32/xun.py 
15 ******************************
16 0
17 1
18 2
19 3
20 4
21 >>> 
View Code

迭代器与生成器连用省内存。

3、面试题 生成器表达式

 1 >>> print [(x,y) for x in range(3) for y in range(3)]
 2 [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
 3 >>> print ((x,y) for x in range(3) for y in range(3))
 4 <generator object <genexpr> at 0x01B3BDF0>  #()返回一个生成器
 5 
 6 #######
 7 加if else 三元也是可以 在输入前先考虑清楚输入的是什么内容
 8 生成器表达式需要的是 变量 循环
 9 所以在变量的位置只要返回一个变量的表达式和输入为一个变量的表达式都是可以。
10 >>> print (x if x >1 else x+100 for x in range(3))
11 <generator object <genexpr> at 0x01B42698>
12 >>> print [x if x >1 else x+100 for x in range(3)]
13 [100, 101, 2]
View Code

 

posted on 2016-06-10 17:36  lexn  阅读(82)  评论(0)    收藏  举报

导航