1.生成器:本质是一个迭代器,允许自定义逻辑的迭代器。
2.生成器和迭代器的区别:①迭代器本身是系统内置的,重写不了
②生成器是用户自定义,可以重写迭代逻辑
3.生成器可以两种方式创建:①生成器表达式(里面推导式,外面圆括号)
②生成器函数,里面由def 定义,里面有yield
4.生成器函数:①yield类似于return
②共同点:执行到这句话都能返回出去值。
③不同点:yield返回时,会记住上一次执行的位置,下次调用。而return直接终止函数,下一次重头调用。
④一般使用yield x,不加括号。
""" -*- coding: utf-8 -*- @FileName: 生成器.py @Software: PyCharm @Time : 2023/5/9 16:54 @Author : Panda """ gen = (i for i in range(10)) print(gen) from collections import Iterable, Iterator print(isinstance(gen, Iterator)) # Output:True # 因为本质是迭代器,所以取值使用迭代器的取值方式 print(next(gen)) # 1.初步使用 def mygen(): print("111") yield 1 print("222") yield 2 print("333") return 3 gen = mygen() res = next(gen) print(res) res = next(gen) print(res) res = next(gen) print(res) def mygen1(): for i in range(101): yield i # 2.有多个值需要初始化生成器 gen = mygen1() for i in range(30): num = next(gen) print(num) # 会接着上一次暂停的位置再次读取 for i in range(20): num = next(gen) print(num) # 3.send """ next和send的区别: next 只能取值 send 不但能取值,还能发送值 send: 第一个send不能给yield传值,默认只能写None 最后一个yield接收不到send的发送值 """ def mygen2(): yield 1 x = yield 2 # print(x) yield x + 2 yield "Done" g = mygen2() print(next(g)) # Output:1 print(next(g)) # Output:2 print(g.send(4)) # Output:6 在使用send的情况中,需要在第几次yield返回时,就在第几次传值 print(next(g)) # Output:Done # 4.yield from 使用:可以将一个可迭代对象变成一个迭代器返回 def mygen4(): ls = ["no1", "no2", "no3", "no4"] yield from ls gen = mygen4() print(gen.__next__()) # Output:no1 print(next(gen)) # Output:no2 # 5.斐波那契数列 每一个数的值都是前两个数的值的和 def mygen4(maxval): a, b = 0, 1 i = 0 while i < maxval: yield b # 返回的时候,一定要注意 a, b = b, a + b i += 1 gen = mygen4(20) for i in range(5): print(next(gen)) # Output: 1 1 2 3 5标签:迭代,Python,生成器,yield,next,print,gen From: https://www.cnblogs.com/future-panda/p/17385933.html