1.生成器是 python用自己的代码写的迭代器,其本质是迭代器。
2.构建生成器的两种方法
1.生成器函数。
def num(x): s = x*x s1 = x + 1 print(666) yield s print(777) yield s1 print(num(3)) num1 = num(3) print(next(num1)) print(next(num1))
3.生成器vs迭代器
1.自制的区别:
def num(x): s = x*x s1 = x + 1 print(466) yield s print(217) yield s1 print(num(3)) num1 = num(3) print(next(num1)) print(next(num1))
l = [1,2,3,4,5] l1 = iter(l)
2.内存级别的区别:
迭代器需要对可迭代对象进行转化,可迭代对象数据量大时非常占用内存
生成器直接转创建,不需要转化,从本质上节省内存
num1 = num(100000000000) for a in range(1,101): print(next(num1)) for a in range(1,101): print(next(num1))
4.send 与next
send 与next 一样都是生成器取值(执行一个yield)的方法
send可以给上一个yield传值
第一次取值永远都是next
send取不到最后一个yield值
def fun(): count = yield 1 print(count) count1 = yield 11 print(count1) yield 111 g = fun() next(g) # g.send('45') g.send('2') g.send('22')
5.列表推导式,一行代码基本能满足生成常用的列表
一行解决,非常方便
不容易排错,循环次数不能超过三次
复杂的列表,不能用列表推导式生成不要勉强使用
l = (i for i in range(100) if i % 2 == 0) print(l)