在python社区,普遍认为生成器的本质就是迭代器。唯一的区别:生成器是自己用python代码构建的数据结构;而迭代器都是通过提供、转化得到的
获取生成器的三种方式:1.生成器函数 2. 生成器表达式 3.python内部提供
1.生成器函数
def func(): print(111) print(222) yield 3 yield 4 ret = func() # 返回一个生成器对象 print(ret) print(next(ret)) # 通过next(生成器对象)从上到下依次取yiled对应的值,一个next对应一个yield print(next(ret)) # yield不会使整个函数结束
def gen_func(): for i in range(1, 5001): yield f'{i}号包子' ret = gen_func() for i in range(200): print(next(ret)) for i in range(200): # next()在整个程序结束前会记住其当前的位置 print(next(ret))
# yield from 优化内层循环,提高效率 def func1(): l1 = [1, 2, 3, 4, 5] yield from l1 # 将l1这个列表变成了迭代器返回其中的每一个元素 """ yield from l1 的等价如下 yield 1 yield 2 yield 3 yield 4 yield 5 """
ret = func1()
print(next(ret))
print(next(ret))
def func2(): l1 = ['卫龙', '老冰棍', '北冰洋', '牛羊配'] l2 = ['馒头', '花卷', '豆包', '大饼'] yield from l1 yield from l2 g = func2() # 生成器对象 """ for i in range(8): print(next(g)) """ for i in g: print(i)
2. 生成器表达式
obj = (i for i in range(1, 11)) # 生成器表达式 for i in obj: print(i)