生成器
本质就是迭代器,他是python自己用代码写的迭代器
用以下两种方式构建一个生成器
1.通过生成器表达式
2.声称器表达式
生成器函数
# def func(x): # x+=1 # print(111) # print(111) # yield x # x+=2 # print(222) # yield 'alex' # x+=3 # g_obj=func(5) # print(g_obj) # print(g_obj.__next__()) # print(g_obj.__next__()) # 一个next对应一个yield # yield将值返回给 生成器对象.__next__()
return 结束函数,给函数的执行者一个返回值yield
不会结束函数,一个next 对应一个yield,
给生成器对象.__next__()返回值
生成器迭代器的区别
生成器函数,vs迭代器
区别1:自定制的区别
# l1=[1,2,3,4,5] # print(l1.__iter__()) # def func1(x): # x+=1 # yield x # x+=3 # yield x # x+=5 # yield x # g1 =func1(5) # print(g1.__next__()) # print(g1.__next__()) # print(g1.__next__())
内存级别的区别
迭代器需要可迭代对象进行转化,可迭代对象非常占内存
生成器直接创建,不需要转化,从本质上就节省内存
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(func1()) # next(g) # g.send('alex') # g.send('alex') # print() # g.send('太白') # g.send('太白')
·send 与next一样,也是对生成器取值,(执行一个yield,取一次值)的方法
send可以给上一个yield 传值
第一次取值永远都是next
最后一个yield 永远也得不到send传的值
# def cloth1(n): # # for i in range(n+1): # # print('衣服%s号' %i) # # cloth1(10000) # def cloth2(n): # for i in range(1,n+1): # yield '衣服的%s号' % i # g=cloth2(10000) # for i in range(50): # print(g.__next__()) # for i in range(50): # print(g.__next__())
列表推导式
列表推导式:一行代码几乎搞定你需要的任何列表
循环模式,[变量 (加工后的变量) for 变量 in iterable]
# li=[i for i in range(1,101)] # print(li)
筛选模式,[变量 (加工后的变量) for 变量 in iterable if 条件]
# l1=[i for i in range(1,31) if i%3==0] # # print(l1)
列表推导式
优点:一行解决,方便
缺点:不易排错,不能超过3次循环
生成器表达式:将列表推导式的[]换成()即可
# g=(i for i in range(100)) # print(g) # print(g.__next__()) # print(g.__next__())
字典推导式
字典的键和值对调
# mcase={'a':10,'b':34} # # mcase_frequency={mcase[k]:k for k in mcase} # # print(mcase) # squared={x**2 for x in [1,-1,2]} # print(squared)