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']]