什么是生成器
可以理解为数据类型,自动实现了 迭代器协议(其他的数据类型需要调用自己内置的__iter__方法,所以生成器是可迭代对象
生成器分类及在python中的表现:
1.生成器函数:常规函数定义, 使用yield语句 而不是return语句 返回结果, yield语句一次返回一个结果
def test(): yield 1 yield 2 # 取代了return的位置 不会终止程序 g = test() print(g) print(g.__next__) print(g.__next__)
2. 生成器表达式: 类似于 列表推到, 但是生成器 返回按需产生的结果
#三元表达式 name = ‘lyg‘ res = ‘SB‘ if name ==‘lyg‘ else ‘noob‘ print(res)
#列表解析 egg_list = [] for i in range(10): egg_list.append(‘鸡蛋%s‘ %i) print(egg_list)
l = [‘鸡蛋%s‘ %i for i in range(10)]
# l = [i for i in range(10 if i>5] #没有四元 没有else
print(l)
# 与列表解析 l = (‘鸡蛋%s‘ %i for i in range(10)) # 生成器外部用括号表示 而不是 [] # l 生成器表达式形式 print(l) print(next(l)) # Next 本质就是调用__next__ print(l.__next__())
总结:
1: 列表解析的 [] 换成()就是 声称其表达式
2: 列表解析与 生成器表达式都是 遍历编程方式,只不过 生成器表达式更节省内存
3: Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数也使用迭代器协议访问对象
sum(x ** 2 for x in range(4)) # 而不是 sum ([x ** 2 for x in range(4)])
生成器总结
- 语法与函数类似
- 状态挂起不用等待列表全部生成 ,生产一个就可以yield一个
- 自动返回迭代器协议
yield两个特点:
- 相当于 return做返回值
- 保留函数的运行状态