内容大纲:
一、生成器
二、列表推导式、生成器表达式
一、什么是生成器:
生成器是自己用python代码写出的迭代器,其本质就是迭代器,包含__iter__和__next__功能
二、如何产生生成器(两种方法)
第一种方法:通过生成器函数,就是将函数种的return变为yield
def func2(x): x += 1 print(111) yield x x += 1 print(222) yield x func2(2)#函数不会执行 g_obj =func2(3)#将func2(3)赋值给g_obj,g_obj是个迭代器 #g_obj.__next__()#输出结果是111,一个next对一个一个yield,只有遇到next,函数才会执行 print(g_obj.__next__())#输出结果是1114 print(g_obj.__next__())#输出结果是2225
1、return 与 yield的区别
① 自定制的区别
② 内存级别的区别
迭代器是需要可迭代对象进行转化,可迭代对象非常占内存
生成器是直接转化,从本质上节省内存
def func1(): for i in range(10): yield i g=func1() for I in range(10): print(g.__next__())
2、send 与 next 的区别
① send 与 next 一样,也是对生成器进行取值
② send 可以给上一个yield 传值
③ 第一次取值只能用next
④ 最后一个yield永远得不到send传的值
def func1(): print(1) count = yield 1 print(count) print(2) count2 = yield 2 print(count2) print(3) count3 = yield 3 g=func1() g.__next__() g.send('alex') g.send('hello')
三、列表推导式、生成器表达式
1、列表推导式:
优点:一行代码几乎可以搞定所需要的任何列表
缺点:容易着迷,不易排错,不能超过三个循环
① 循环模式:
l=[I for I in range(1,101)] print(l) l1=['python%s期' % I for I in range(1,15)] print(l1) l2=[i*I for I in range(1,11)] print(l2)
② 筛选模式:
l3=[I for I in range(1,31) if i%2 == 0] print(l3) l4=[I for I in range(31) if i%3 == 0] print(l4) l5=[i*I for i in range(31) if i%3 == 0] print(l5) names=[['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']] name=[str for names1 in names for str in names1 if str.count('e') == 2] print(name)
2、生成器表达式:
与列表推导式相同,只是将[ ]改为( )
还有字典推导式、集合推导式这里不再一一赘述