python開發函數進階:可叠代的&叠代器&生成器
阿新 • • 發佈:2017-08-04
== ict turn lena log 中新 odin 使用 def
一,可叠代的&可叠代對象
1.一個一個的取值就是可叠代的 iterable
#str list tuple set dict
#可叠代的 ——對應的標誌 __iter__
2.判斷一個變量是不是一個可叠代的
# print(‘__iter__‘ in dir(list))
# print(‘__iter__‘ in dir([1,2,3]))
3.可叠代協議——凡是可叠代的內部都有一個__iter__方法
二,叠代器
1.將可叠代的轉化成叠代器
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 # iterator #叠代器5 # iterator iterable#可叠代對象 6 l = [1,2,3,4,5] 7 for i in l: 8 print(i) 9 print(iter(l)) #內置函數 iter == l._iter_() 10 l.__iter__() 11 l_iterator = iter(l) 12 print(set(dir(l_iterator))-set(dir(l))) 13 print(next(l_iterator)) #叠代器就要通過next方法取值
2.叠代器小結
#叠代器裏既有iter方法,又有next方法 ——叠代器協議
#通過iter(o)得到的結果就是一個叠代器,
#o是一個可叠代的
#叠代器 大部分都是在python的內部去使用的,我們直接拿來用就行了
#叠代器:內置__iter__和__next__方法
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 l = [1,2,3,4,5] 5 l_iterator = iter(l) 6 print(l_iterator.__next__()) 7 print(l_iterator.__next__()) 8 print(l_iterator.__next__()) 9 print(l_iterator.__next__()) 10 print(l_iterator.__next__()) 11 next(l_iterator) #==l_iterator.__next__() 12 # while True: 自己寫相當於for循環 13 # try: 14 # print(next(l_iterator)) 15 # except StopIteration: 16 # break
3.判斷是否是叠代器 和 可叠代對象的簡便方法
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 from collections import Iterable 5 from collections import Iterator 6 # s = ‘abc‘ 7 # print(isinstance(s,Iterable)) s 是不是一個可叠代對象 8 # print(isinstance(s,Iterator)) s 是不是一個叠代對象 9 # print(isinstance(iter(s),Iterator))
4.可叠代的和叠代器
#不管是一個叠代器還是一個可叠代對象,都可以使用for循環遍歷
#叠代器出現的原因 幫你節省內存
三,生成器
#生成器函數
#生成器的本質就是叠代器
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def func(): 5 print(‘aaaa‘) 6 a = 1 7 yield a #返回第一個值 8 print(‘bbbb‘) 9 yield 12 #返回第二個值 10 #錯誤取值,相當於三個新的生成器 11 # g1 = func() 12 # g2 = func() 13 # g3 = func() 14 # print(next(func() )) #取第一個值 15 # print(next(func() )) #取第二個值 16 # print(next(func() )) #取第三個值 會報錯 因為沒有第三個值 17 #正確取值,都是同一個生成器 18 # ret = func() #拿到一個生成器 19 # # print(ret) 20 # print(next(ret)) #取第一個值 21 # print(next(ret)) #取第二個值 22 # print(next(ret)) #取第三個值 會報錯 因為沒有第三個值
3,1 生成器做衣服實例
1 #/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 def make_cloth(): 5 for i in range(2000000): 6 yield "第%s件衣服"%i 7 # szq = make_cloth() 8 # print(next(szq)) 9 # print(next(szq)) 10 # 11 # print(next(szq)) 12 # for i in range(50): 13 # print(next(szq))
3.2 監聽文件實例
1 #!/usr/bin/env python 2 #_*_codingLutf-8_*_ 3 4 #監聽文件 tail -f 5 import time 6 def tail(filename): 7 with open(filename) as f: 8 f.seek(0, 2) #從文件末尾算起 9 while True: 10 line = f.readline() # 讀取文件中新的文本行 11 if not line: 12 time.sleep(0.1) 13 continue 14 yield line 15 16 # for line in tail(‘tmp_file‘): 17 # print(line,end = ‘‘)
3.3 計算移動平均值
1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #7日平均年化收益 5 def averager(): 6 total = 0 7 day = 0 8 avrage = 0 9 while True: 10 day_num = yield avrage #return avrage 11 total += day_num 12 day += 1 13 avrage = total/day 14 15 # avg = averager() 16 # num = next(avg) #激活生成器 avg.send(),什麽都不send和next效果一樣 17 # print(avg.send(10)) #傳值 next 18 # print(avg.send(20))
3.4 帶裝飾器的生成器
1 #!/usr/bin/env python 2 #_*_codingLutf-8_*_ 3 4 def wrap(func): 5 def inner(*args,**kwargs): 6 g = func(*args,**kwargs) 7 next(g) 8 return g 9 return inner 10 11 @wrap 12 def averager(): 13 total = 0 14 day = 0 15 avrage = 0 16 while True: 17 day_num = yield avrage #return avrage 18 total += day_num 19 day += 1 20 avrage = total/day 21 22 # g = averager() 23 # print(g.send(10)) 24 # print(g.send(20))
python開發函數進階:可叠代的&叠代器&生成器