1、生成器和生成器表达式
本质就是一个迭代器
三种生成办法:
a、生成器函数
注:生成器函数被执行,获取到的是生成器,而不是函数的执行
def func():
print("jay")
yield "周杰伦" # 函数中包含了yield,当前函数为生成器函数
print("bubble")
yield "哈哈"
g = func() # 通过函数func()来创建一个生成器
print(g.__next__())
print(g.__next__())
return:直接返回结果,结束函数调用
yield:返回结果,让函数分段执行
b、生成器表达式
(结果 for 变量 in 可迭代对象 if 条件)
取值:1、__next__()
2、send(值)
def eat():
print("我吃什么啊?")
a = yield "馒头"
print("a=",a)
b = yield "大饼"
print("b=",b)
c = yield "韭菜"
print("c=", c)
yield "GAME OVER"
gen = eat()
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4)
# __next__():让生成器向下执行一次
# send:让生成器向下执行一次,并给上一个yield传值,第一个和最后一个不能用
c、数据转换
生成器转换为列表
def func():
yield 11
yield 22
yield 33
g = func()
li = list(g) # g可迭代对象
print(li)
2、各种推倒式和生成器表达式
列表推倒式:[结果(变量) for i in 可迭代对象 if 条件]
生成器推倒式:(结果(变量) for i in 可迭代对象 if 条件)
区别:列表比较消耗内存,一次性加载,生成器表达式几乎不占内存,使用时才分配
得到的值不一样,列表得到一个列表,生成器获得一个生成器
def func():
print(111)
yield 222
g = func() #生成器g
g1 = (i for i in g) #生成器g1 ,数据来源于g
g2 = (i for i in g1) #生成器g2 ,数据来源于g1
print(list(g)) # 获取g中的数据,打印111,获取222
print(list(g1)) # 获取g1中的数据,但是g中数据已经取完了,g1也就没有数据
print(list(g2))
字典推倒式:{结果(K:v) for i in 可迭代对象 if 条件}
a、字典中key和value值互换
dic = {'a':'1','b':'2'}
new_dic = {dic[key]:key for key in dic}
print(new_dic)
b、li1[]和li2[]组成字典
li1 = ['a','b','c','d']
li2 = ['1','2','3','4']
dic = {li1[i]:li2[i] for i in range(len(li1))}
print(dic)
集合推倒式(去重){结果(K:v) for i in 可迭代对象 if 条件}
li = ['a','b','c','d','a','b','c','d']
s = {i for i in li}
print(s)
注:没有元组推倒式
def add(a,b):
return a + b
def test():
for i in range(4):
yield i
g = test() # 0,1,2,3
for n in [2,10]:
g = (add(n,i) for i in g)
# g = (add(n,i) for i in (add(n,i) for i in test()))
print(list(g)) # 所有n都是10,都是最后一个元素
结果:[15, 16, 17, 18]
# m中[3,6,9]组成的列表
m = [[1,2,3],[4,5,6],[7,8,9]]
li = [i[2] for i in m]
print(li) # 结果:[3,6,9]
m = [3,6,9]
li = [[x-2,x-1,x] for x in m]
print(li) # 结果: [1,2,3],[4,5,6],[7,8,9]
# 求(x,y)其中x是0-5之间的偶数,y是奇数,组成的元组列表
li = [(x,y) for x in range(5) if x % 2 == 0\
for y in range(5) if y % 2 ==1]
print(li)
x = {
'name':'alex',
'Values':[{'time':12763.232,'values':'100'},
{'time':12333.232,'values':'200'},
{'time':15433.232,'values':'700'},
{'time':14263.232,'values':'800',}]
}
li = [[i['time'],i['values']] for i in x['Values'] ]
print(li)
结果:[[12763.232, '100'], [12333.232, '200'], [15433.232, '700'], [14263.232, '800']]