生成器及推导式

生成器

  生成器的本质就是迭代器

  生成器的特点和迭代器一样,取值方式和迭代器一样(__next__,send():给上一个yield 传值)

  

def func():
    print('我是第一段')
    a = yield 123
    print(a)
    print('刘能是第二段')
    b = yield 456
    print(b)
    print('谢大脚是第三段')
    c = yield 789
    print(c)
    print('赵四是最后一段')
    yield 79       #最后收尾一定是 yeild  后边不能加 print 
g = func()
print(g.__next__())   #没有上一个 yield 所以不能使用 send() 开头必须是 __next__()
print(g.send('韭菜盒子'))
print(g.send('煎饼果子'))
print(g.send('锅包肉'))

打印结果
我是第一段
123
韭菜盒子
刘能是第二段
456
韭菜盒子
谢大脚是第三段
789
赵四是最后一段
79

  生成器一般是生成器函数或者生成器表达式来创建的

  其实就是手写的迭代器

生成器函数

  和普通函数没有区别,里面有 yield的函数就是生成器函数

  生成器函数在执行的时候。默认不会执行函数体,返回生成器 

  通过生成器的 __next__()分段执行这个函数

  send() 给上一个 yield 传值,不能再开头(没有上一个yield),最后一个 yield 也不可以用send()函数

推导式

  列表推导式   【结果 for循环 条件筛选】

  

lst = ['python' + str(i) for i in range(1,50)]
print(lst)
输出结果
python1
python2
python3
。。。
python48
python49

  字典推导式  【k,v for循环 条件筛选】

list = [11,22,33]
dict = {i : lst[i] for i in range(len(list))}
prnt(dict)
结果
{0:11,1:22,2:33}


dic = {"jj": "林俊杰", "jay": "周杰伦", "zs": "赵四", "ln":"刘能"}
dict = {v:k for k,v in dic.items()}
print(dict)
结果
{'林俊杰':'jj','周杰伦':'jay','赵四':'zs','刘能':'ln'}

  集合推导式  【k for循环 条件】

lst = [1,1,2,3,4,4,5,5,6]
s = {el for el in lst}
print(s)   #取值的是 lst 里的每一项
 
s = set(lst)
print(s)
结果
{1,2,3,4,5,6}

生成器表达式特点

  惰性机制

  节省内存

  只能向前不能向后

原文地址:https://www.cnblogs.com/lzqrkn/p/9469403.html