python(day9)

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']]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章