一. 推导式
列表, 字典, 集合有推导式, 元组没有推导式
列表推导式: lst = [i for i in range(10) if i % 2 == 0]
字典推导式: dic = {k,v for k,v in func() if k>v} # def func(): yield 2,1 yield 3,1 yield 4,1 (yield 的第一个值不能相同, 因为字典的键会传不进去)
集合推导式: se = {i for i in range(5)}
a = (i for i in range(10) # 这不是元组, 这是生成器的表达式, 具有惰性.
可以用for循环, while循环, list[], tuple(), set(), 来遍历生成器
二. 生成器
生成器的本质是迭代器
生成器的特点和迭代器一样, 取值方式一样, __next__(), send(), send()可以给上一个yield传值
生成器一般由生成器函数或生成器表达式来创建
生成器函数:
和普通函数没有区别, 当里面含有yield.
生成器函数在执行时, 默认不会执行函数, 而是返回生成器
生成器函数通过生成器的__next__()分段执行这个函数.
可以用send()给上一个yield传值, 不能在开头(没有上一个yield), 最后一个yield也不可以用send()def func():
def func(): a = yield 1 print(a) b = yield 2 print(b) c = yield 3 print(c) yield 4 f = func() # ========================================第一个输出方法======================================= print(f.__next__()) print(f.send(123)) print(f.send(234)) print(f.send(345)) 输出 1 123 2 234 3 345 4
# =====================================第二个输出方法========================================== print(f.__next__(),f.send(123),f.send(234),f.send(345)) 输出: 123 234 345 1 2 3 4