1.生成器
迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器的好处是可以节省内存。
生成器:就是自己用python代码写的迭代器,生成器的本质就是迭代器。
迭代器的构建:1.通过生成器函数 2.生成器表达式。
#生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
def func1(x): x +=1 print(x) yield x x +=2 print(x) yield x m = func1(5) print(m.__next__()) print(m.__next__())
yield和return
yield:不会结束函数,一个next对应一个yield,给生成器对象.__next__()返回值。
return:结束函数,给函数的执行者返回一个值。
#生成器表达式
类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
g = (i for i in range(10000)) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__())
2.生成器与迭代器的区别
区别1:自定制的区别
区别2:内存级别的区别
迭代器是需要可迭代对象进行转化。可迭代对象非常占内存。
生成器直接创建,不需要转化,从本质就节省内存。
3.send 与 next
def func1(): # print(1) count = yield 6 print(count) # print(2) count1 = yield 7 print(count1) # print(3) yield 8 g = func1() print(next(g)) g.send('alex') g.send('太白')
send与next一样,也是对生成器取值(执行一个yield)的方法。
send可以给上一个yield传值。
第一次取值永远是next。
最后一个yield永远也得不到send传的值。
4.列表推导式
一行代码几乎搞定你需要的任何列表。
循环模式
l = [i for i in range(1,10)] print(l)
筛选模式
m = [i for i in range(1,30) if i%3==0] print(m)
列表推导式优缺点:
优点:一行解决,方便。
缺点:容易着迷,不宜排错,不能超过三次循环。
列表推导式不能解决所有列表的问题,所以不要太可以用。