生成器
生成器的一些概念
1、只要含有yield关键字的函数都是生成器函数
2、yield不能和return共用且需要写在函数内
3、生成器函数 : 执行之后会得到一个生成器作为返回值
2、yield不能和return共用且需要写在函数内
3、生成器函数 : 执行之后会得到一个生成器作为返回值
4、生成器的本质就是迭代器
5、 生成器函数的特点
(1)调用之后函数内的代码不执行,返回一个生成器
(2)每从生成器中取一个值就会执行一段代码,遇见yield就停止
(3)直到取完最后一个,在执行nxt会报错
(4)如何从生成器中取值:
for :如果没有break会一直取直到取完
next :每次只取一个
send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
数据类型强制转换 :会一次性把所有数据都读到内存里
for :如果没有break会一直取直到取完
next :每次只取一个
send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
数据类型强制转换 :会一次性把所有数据都读到内存里
6、send 获取下一个值的效果和next基本一致
(1)只是在获取下一个值的时候,给上一yield的位置传递一个数据
(2)使用send的注意事项:
第一次使用生成器的时候 是用next获取下一个值
最后一个yield不能接受外部的值
(1)只是在获取下一个值的时候,给上一yield的位置传递一个数据
(2)使用send的注意事项:
第一次使用生成器的时候 是用next获取下一个值
最后一个yield不能接受外部的值
7、 生成器表达式
(条件成立想放在生成器中的值 for i in 可迭代的 if 条件)
(条件成立想放在生成器中的值 for i in 可迭代的 if 条件)
例一
1 def generator(): 2 print(1) 3 yield "a" 4 5 g=generator() #g为生成器 6 print(g) #<generator object generator at 0x000001FCC1F364C0> 7 print(g.__next__())
例二
1 def generator(): 2 print(1) 3 yield "a" 4 print(2) 5 yield "b" 6 print(3) 7 yield "c" 8 g=generator() 9 print(g.__next__()) 10 print(g.__next__()) 11 print(g.__next__()) 12 13 结果: 14 1 15 a 16 2 17 b 18 3 19 c
例三:
1 def generator(): 2 print(1) 3 yield "a" 4 print(2) 5 yield "b" 6 print(3) 7 yield "c" 8 g=generator() 9 10 for i in g: 11 print(i) 12 13 结果: 14 1 15 a 16 2 17 b 18 3 19 c
例四
1 def pipi(): 2 for i in range(200000): 3 yield "皮皮%s"%i 4 5 6 g=pipi() 7 g1=pipi() #g和g1是不同的两个生成器 8 print(g.__next__()) 9 print(g.__next__()) 10 11 print("***",g1.__next__()) 12 print("***",g1.__next__()) 13 14 结果: 15 皮皮0 16 皮皮1 17 *** 皮皮0 18 *** 皮皮1
例五
1 def pipi(): 2 for i in range(200000): 3 yield "皮皮%s"%i 4 5 g=pipi() 6 count=0 7 for i in g: 8 #print(i) 9 print("###", g.__next__()) 10 count+=1 11 print("count=",count) 12 print(i) 13 if count>10: 14 break 15 16 结果: 17 ### 皮皮1 #这里为1,是因为执行for循环后,又执行了__next__方法。 18 count= 1 19 皮皮0 #这里为0,是因为i的取值从0开始。在for循环的时候,0先读取进内存了,所以上面是### 皮皮1 20 ### 皮皮3 21 count= 2 22 皮皮2 23 ### 皮皮5 24 count= 3 25 皮皮4 26 ### 皮皮7 27 count= 4 28 皮皮6 29 ### 皮皮9 30 count= 5 31 皮皮8 32 ### 皮皮11 33 count= 6 34 皮皮10 35 ### 皮皮13 36 count= 7 37 皮皮12 38 ### 皮皮15 39 count= 8 40 皮皮14 41 ### 皮皮17 42 count= 9 43 皮皮16 44 ### 皮皮19 45 count= 10 46 皮皮18 47 ### 皮皮21 48 count= 11 49 皮皮20 50 51 #改变print位置 52 def pipi(): 53 for i in range(200000): 54 yield "皮皮%s"%i 55 56 def pipi(): 57 for i in range(200000): 58 yield "皮皮%s"%i 59 60 g=pipi() 61 count=0 62 for i in g: 63 print(i) 64 print("###", g.__next__()) 65 count+=1 66 print("count=",count) 67 #print(i) 68 if count>10: 69 break 70 71 结果: 72 73 皮皮0 74 ### 皮皮1 75 count= 1 76 皮皮2 77 ### 皮皮3 78 count= 2 79 皮皮4 80 ### 皮皮5 81 count= 3 82 皮皮6 83 ### 皮皮7 84 count= 4 85 皮皮8 86 ### 皮皮9 87 count= 5 88 皮皮10 89 ### 皮皮11 90 count= 6 91 皮皮12 92 ### 皮皮13 93 count= 7 94 皮皮14 95 ### 皮皮15 96 count= 8 97 皮皮16 98 ### 皮皮17 99 count= 9 100 皮皮18 101 ### 皮皮19 102 count= 10 103 皮皮20 104 ### 皮皮21 105 count= 11
例六 文件监听
写成生成器后,可以对结果进行扩展。
1 def tail(filename): 2 f = open(filename,encoding='utf-8') 3 while True: 4 line = f.readline() 5 if line.strip(): #判断是否为空 6 yield line.strip() 7 8 g = tail('file') 9 for i in g: 10 if 'python' in i: 11 print('***',i)
posted on 2018-10-23 14:41 cherish-LL 阅读(149) 评论(0) 收藏 举报
浙公网安备 33010602011771号