生成器

生成器的一些概念

1、只要含有yield关键字的函数都是生成器函数
2、yield不能和return共用且需要写在函数内
3、生成器函数 : 执行之后会得到一个生成器作为返回值
4、生成器的本质就是迭代器
5、 生成器函数的特点
  (1)调用之后函数内的代码不执行,返回一个生成器
  (2)每从生成器中取一个值就会执行一段代码,遇见yield就停止
  (3)直到取完最后一个,在执行nxt会报错
  (4)如何从生成器中取值:
                for :如果没有break会一直取直到取完
                next :每次只取一个
                send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
                数据类型强制转换 :会一次性把所有数据都读到内存里
6、send 获取下一个值的效果和next基本一致
  (1)只是在获取下一个值的时候,给上一yield的位置传递一个数据
  (2)使用send的注意事项:
        第一次使用生成器的时候 是用next获取下一个值
        最后一个yield不能接受外部的值
7、 生成器表达式
        (条件成立想放在生成器中的值 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)    收藏  举报

导航