欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python摸爬滚打之day12----生成器, 生成式

程序员文章站 2022-06-30 12:18:14
1、生成器 生成器的本质就是迭代器. 1.1 获取生成器 1: 生成器函数 函数中出现 "yield" 的函数就是一个生成器, 再次执行函数时就不是运行函数而是获取生成器. 取值方式: 1, 通过__next__()取值. 2 , 通过send(" ")取值并传值. 1 def func(): 2 ......

1、生成器

 生成器的本质就是迭代器.

 1.1  获取生成器

  1:  生成器函数

   函数中出现 "yield" 的函数就是一个生成器, 再次执行函数时就不是运行函数而是获取生成器. 

  取值方式:  

    1,  通过__next__()取值.     2 , 通过send(" ")取值并传值.

python摸爬滚打之day12----生成器, 生成式
 1 def func():
 2     print("黄焖鸡")                # 1
 3     yield "黄焖鸡yield"            # 2
 4     print("烧鸭")            # 3
 5     yield "烧鸭yield"            # 4
 6     print("蒸鹿茸")            # 5
 7     yield "蒸鹿茸yield"            # 6
 8     print("蒸熊掌")
 9 
10 gen = func()     # 函数中出现"yield" 时,表示该函数为生成器,获取生成器.
11 print(gen)     #  结果是一个生成器地址. <generator object func at 0x000002798c873c78>
12 gen.__next__()        # 取到函数体中yield的那行就停止(第1,2行),并将yield后面的内容返回给调用者
13 print(gen.__next__())       # 再次调用就从上次停止的yield下行(第3行)开始运行,截止到第四行.
14 print(gen.__next__())
15 print(gen.__next__())     # 如果yield内容结束,还继续调用,则报错,但是print("蒸熊掌")还是会继续执行的
生成器__next__()取值

 1.2  生成器本质就是迭代器, 如何满足迭代器的三个特点呢?

python摸爬滚打之day12----生成器, 生成式
 1 def buy():
 2     lst = []
 3     for i in range(1000):
 4         lst.append("帽子%s" %(i))             # 把多有的帽子放在内存的列表里,占得内存大
 5     return lst
 6 print(buy())
 7 
 8 
 9 def buy_gen():
10     for i in range(1000):
11         yield "帽子%s" %(i)           # 不是一次性全部把帽子0.......帽子999放在内存,
12                                       # 而是通过__next__()一个一个取,比较省内存,但是不能往前执行,
13                                       # 满足迭代器的三个特点
14 gen = buy_gen()
15 print(gen.__next__())
16 print(gen.__next__())
17 print(gen.__next__())
18 print(gen.__next__())
如何满足迭代器的三个特点
python摸爬滚打之day12----生成器, 生成式
 1 def baocaiming():
 2     print("蒸鹿茸")
 3     a = yield "蒸鹿茸yield"
 4     print("a=",a)
 5     print("蒸熊掌")
 6     b = yield "蒸熊掌yield"
 7     print("b=", b)
 8     print("烧花鸭")
 9     c = yield "烧花鸭yield"
10     print("c=", c)
11     print("烧子鹅")
12 
13 gen = baocaiming()   
14 print(gen.__next__())       # 第一次只能用__next__()取值
15 print(gen.send("a++"))      # 从上一次停止的yield开始执行,并将"a++"传给上次yield之前的变量a, a == "a++"    
16 print(gen.send("b++"))
17 print(gen.send("c++"))      # 函数里没有yield了,还继续调用,则报错,但是print("蒸熊掌")还是会继续执行的
生成器send()取值

  send()取值方式机理?

python摸爬滚打之day12----生成器, 生成式

2、

  待.