python----叠代器和生成器
1、python中的for循環
for i in [1,2,3,4]: print(i)
2、叠代和可叠代協議
iterable:可叠代的,可重復的、叠代的
可叠代:籠統的說就是可以被for循環,如,字符串(str)、列表(list)、元組(tuple),字典(dict),集合(set),range、map、filter、enumerate等。
叠代---叠代器:把某個數據集內的元素一個個取出來
可叠代協議的定義:是內部實現了_iter_方法
能被for循環的都是可叠代的,內部必須有一個_iter_方法
iterator:叠代器,叠代程序
_next_方法:就是一個一個取值
***叠代器遵循叠代器協議:必須擁有_iter_方法和_next_方法
l=[1,2,3,4] a=l.__iter__() while True: try: x=a.__next__() print(x) except StopIteration: break
初識生成器
python中提供的生成器
1、生成器函數:用yield語句返回結果,一擦返回一個結果
2、生成器表達式 類似列表推到,生成器返回按產生一個結果的一個對象,不是一次構建一個結果列表
3、生成器Generator
本質就是叠代器(自帶了_iter_方法和_next_方法)
4、生成器偶函數
import time def genrator_func(): a=1 print(‘定義了a變量‘) yield a b=2 print(‘定義了一個b變量‘) yield b g=genrator_func() print(‘g:‘,g) #打印g可以發現g就是一個生成器 print(‘_‘*20) #分割線 print(next(g)) time.sleep(1) #sleep一秒看清執行過程 print(next(g))
生成器函數二
# def func(): # #生產衣服 # for i in range(2000000): # yield #生產了第%s件衣服%i # func1=func() # print(func1.__next__())#要一件衣服 # print(func1.__next__())#再買一件衣服 # print(func1.__next__())#再要買一件衣服 # num=0 # for i in func1: #要一批衣服 # print(1) # num+=1 # if num == 5: # break
更過應用
# import time # def tail(filename): # f=open(filename) # f.seek(0,2) #從文件末尾算起 # while True: # line = f.readline() #讀取文件新的文本行 # if not line: # time.sleep(0.1) # continue # yield line # tail_g=tail(‘tmp‘) # for line in tail_g: # print(line)
計算移動平均值
def averager(): total=0.0 count=0 average=None while True: term=yield average total+=term count+=1 average = total/count g_avg=averager() next(g_avg) print(g_avg.send(10)) print(g_avg.send(30)) print(g_avg.send(5))
計算移動平均值-預激協程的裝飾器
def time(func): def inner(*args,**kwargs): ret=func(*args,**kwargs) next(ret) return ret return inner @time def averager(): total=0.0 ccount=0 average=None while True: term = yield average total +=term ccount+=1 average=total/ccount g_avg = averager() print(g_avg.send(10)) print(g_avg.send(20)) print(g_avg.send(5))
yiel from
def gen1(): for c in ‘AB‘: yield c for i in range(3): yield i print(list(gen1())) def gen2(): yield from ‘AB‘ yield from range(3) print(list(gen2()))
liebiao推導式和生成器表達式
egg_list=[‘雞蛋%s‘ %i for i in range(10)] #列表解析 laomuji=(‘雞蛋%s‘ %i for i in range(10)) #生成器表達式 print(laomuji) print(next(laomuji)) #next本質就是調用_next_ print(laomuji.__next__()) print(next(laomuji))
本章小結
可叠代對象:
擁有_iter_方法 如:range()、str、list、tuple、dict、set
特性:惰性運算
叠代器:Iterator:
擁有_iter_方法和_next_方法 如:iter(range()),iter(str),iter(list)、iter(tuple)、iter(set)、reversed(list_o)、map(func,list_o)、filter(func,list_o)、file-o
生成器Generator:
本質:叠代器,所以擁有__iter__方法和__next__方法
特點:惰性運算,開發者自定義
使用生成器的優點:
1.延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對於大數據量處理,將會非常有用。
#列表解析
sum([i for i in range(100000000)])#內存占用大,機器容易卡死
#生成器表達式
sum(i for i in range(100000000))#幾乎不占內存
python----叠代器和生成器