生成器:
生成器的本质就是迭代器
生成器函数 —— 本质上就是我们自己写得函数
生成器的表现形式
生成器函数
生成器表达式
生成器函数:
含有yield关键字的函数就是生成器函数
yield不能和return共用且需要写在函数内
特点:
调用函数的之后函数不执行,返回一个生成器
每次调用next方法的时候会取到一个值
直到取完最后一个,在执行next会报错
#生成器函数 : 执行之后会得到一个生成器作为返回值 ret = generator() print(ret) print(ret.__next__()) def generator(): print(1) yield 'a' print(2) yield 'b' yield 'c' g = generator() for i in g: print(i) ret = g.__next__() print(ret) ret = g.__next__() print(ret) ret = g.__next__() print(ret)
send
send 获取下一个值的效果和next基本一致
只是在获取下一个值的时候,给上一yield的位置传递一个数据
使用send的注意事项
第一次使用生成器的时候 是用next获取下一个值
最后一个yield不能接受外部的值
def generator(): print('abc') php = yield 1 print('<=>',php) print('qwe') yield 2 g = generator() ret = g.__next__() print('***',ret) ret = g.__next__() print('***',ret)
def generator(): print('abc') php = yield 1 print('<=>',php) print('qwe') yield 2 g = generator() ret = g.__next__() print('***',ret) ret = g.send('hello') print('***',ret)
列表推导式
egg_list=['鸡蛋%s'%i for i in range(10)]
生成器表达式
g = (i for i in range(10))
两者区别:
# 括号不一样
# 返回的值不一样 === 几乎不占用内存
[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理
[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能