生成器
生成器的本质就是迭代器
生成器的特点和迭代器一样,取值方式和迭代器一样(__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}
生成器表达式特点
惰性机制
节省内存
只能向前不能向后