1. 程式人生 > >python開發函數進階:可叠代的&叠代器&生成器

python開發函數進階:可叠代的&叠代器&生成器

== 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開發函數進階:可叠代的&叠代器&生成器