生成器,生成器推导式和列表推导式
生成器
什么是生成器
python社区,大部分生成器和迭代器是一种.生成器的本质是迭代器.
唯一区别:生成器是我们自己用python代码构建的数据结构.迭代器都是提供的,或者转化得来的.
获取生成器的三种方式:
- 生成器函数
- 生成器表达式
- python提供的
生成器函数
- yield
- 一个next 对应一个yield(yield和下一个yield中间有代码的话只执行一个next时,会停在第一个yield处)
def s():
li=[1,2,3,4,5]
for i in li:
yeild i
yield 与 return的区别
- return:函数中只存在一个被执行的return,结束函数,并且给给函数的执行者返回值.
- yield:只要有yiedl那么她就是生成器函数而不是函数了.生成器函数中可以存在多个yield,一个yield对应一个next
- yield 和return 可以同时存在,如果return先执行了,next()会取不成值.会报错
yield from
- 将li这个列表变成了一个迭代器返回.每一个next返回一个列表一个元素
- 优化了内层循环,降低了时间复杂度.提高开发效率
def gen_fun():
li = [1,2,3,4,5,6]
yield from li
ret = gen_fun()
print(next(ret))
print(next(ret))
print(next(ret)) 依次返回列表元素
生成器表达式,列表推导式
列表推到式
- 循环模式:[变量(加工后的变量) for 变量 in iterable]
[a for a in [1,2,3]]
- 筛选模式:[变量(加工后的变量) for 变量 in iterable if 条件]
[a for a in [1,2,3] if a>2]
生成器表达式
与列表推导式的写法几乎一模一样,也有筛选和循环模式.也可以多层循环构建
将列表[] 变成() 就变成生成器