生成器和推导式

一. 推导式

列表, 字典, 集合有推导式, 元组没有推导式

列表推导式: 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

猜你喜欢

转载自www.cnblogs.com/NachoLau/p/9469318.html
今日推荐