生成器進階
阿新 • • 發佈:2018-11-19
def generator(): print(123) content = yield 1 print('=======',content) print(456) arg = yield 2 '''''' yield g1 = generator() g2 = generator() g1.__next__() g2.__next__() print('***',generator().__next__()) print('***',generator().__next__()) g = generator() ret = g.__next__() print('***',ret) ret = g.send('hello') #send的效果和next一樣 print('***',ret) #send 獲取下一個值的效果和next基本一致 #只是在獲取下一個值的時候,給上一yield的位置傳遞一個數據 #使用send的注意事項 # 第一次使用生成器的時候 是用next獲取下一個值 # 最後一個yield不能接受外部的值 # 獲取移動平均值 # 10 20 30 10 # 10 15 20 17.5 avg = sum/count def average(): sum = 0 count = 0 avg= 0 while True: num = yield avg sum += num # 10 count += 1 # 1 avg = sum/count avg_g = average() avg_g.__next__() avg1 = avg_g.send(10) avg1 = avg_g.send(20) print(avg1) #預激生成器的裝飾器 def init(func): #裝飾器 def inner(*args,**kwargs): g = func(*args,**kwargs) #g = average() g.__next__() return g return inner @init def average(): sum = 0 count = 0 avg = 0 while True: num = yield avg sum += num # 10 count += 1 # 1 avg = sum/count avg_g = average() #===> inner ret = avg_g.send(10) print(ret) ret = avg_g.send(20) print(ret) #python 3 # def generator(): # a = 'abcde' # b = '12345' # for i in a: # yield i # for i in b: # yield i def generator(): a = 'abcde' b = '12345' yield from a yield from b g = generator() for i in g: print(i) # send # send的作用範圍和next一模一樣 # 第一次不能用send # 函式中的最後一個yield不能接受新的值 # 計算移動平均值的例子 # 預激生成器的裝飾器的例子 # yield from