01 生成器
什么是生成器?
就是自己用python代码写的迭代器。本质就是迭代器。
怎么构建生成器?
1.通过生成器函数写
2.生成器表达式
生成器函数:
在函数中func()表示执行函数,而当函数体内包含yield,那么函数就是一个生成器,func()就变成了生成器对象。
def func(x):
x += 1
return x #函数直接返回
print(666) #666不会执行
def func1(x):
x += 1
yield x #生成器函数不会中断,可以理解为暂停在yield
print(666) #在下一个__next__()执行时666将会被打印
yield x
g = func1(5)
print(g.__next__()) #打印6
print(g.__next__()) #先打印666,再打印6
yield和return的区别
1.return出现表示函数结束并返回,yield不会中断函数。
2.return给函数执行者返回值,yield给__next__()返回值,一个next对于一个yield
生成器函数vs迭代器
1.自定制区别
2.内存级别的级别
迭代器是需要可迭代对象进行转化,可迭代对象是非常占内存的。
生成器直接创建,不需要转化,从本质就节约内存
send与next
send作用:
1.send与next一样,也是对生成器取值(执行一个yield)的方法
2.send可以给上一个yield传值
def func2():
count = yield 6
print(count)
count1 = yield 7
print(count1)
yield 8
g = func2()
print(g.__next__()) #打印6
print(g.send('alex')) #通过send将‘alex’传值给了count,所以输出alex,随后输出7
print(g.send('taibai')) #通过send将‘taibai’传值给了count1,所以输出taibai,随后输出8
send的坑:
1.第一次取值永远都是next不能用send。
2.最后一个yield永远也得不到send传的值
02 列表表达式,生成器生成式
列表推导式:一行代码几乎搞定你需要的任何列表
两种模式:
1.循环模式
结构:[变量(加工后的变量) for 变量 in iterable]
例:求出30以内的数,并放入到一个列表中。
l1 = [i for i in range(1,31)]
2.筛选模式
结构:[变量(加工后的变量) for 变量 in iterable if 条件]
例:求出50以内能被3整除的数的平方,并放入到一个列表中。
l2 = [i**2 for i in range(1,51) if i % 3 == 0]
推导式及生成式优缺点:
优点:一行解决,方便。
缺点:容易着迷,不易拍错,不能超过三次循环,不能解决所有列表问题,不要刻意用。
生成器表达式:
就是将列表推导式的中括号换为小括号即可。
字典表达式 and 集合表达式
详情转链接:http://www.cnblogs.com/jin-xin/articles/8423802.html