当前位置: 移动技术网 > IT编程>脚本编程>Python > python摸爬滚打之day12----生成器, 生成式

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

2018年11月01日  | 移动技术网IT编程  | 我要评论

网络幽狗vip破解版,姜维传乱码,金梅瓶2

1、生成器

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

 1.1  获取生成器

  1:  生成器函数

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

  取值方式:  

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

 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  生成器本质就是迭代器, 如何满足迭代器的三个特点呢?

 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__())
如何满足迭代器的三个特点
 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()取值方式机理?

2、

  待.

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网