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(" ")取值并传值.
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("蒸熊掌")还是会继续执行的
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()取值方式机理?
2、
待.
上一篇: 查询Oracle表结构信息(走数模用)
下一篇: 美团热修复Robust的踩坑之旅-使用篇