close
協議是什麼 ?
協議( Protocols )與其他編程語言中的接口(interface)很相似,它規定你哪些方法必須要定義。然而,在Python中的協議就顯得不那麼正式。事實上,在Python中,協議更像是一種指南。
容器類型的協議
如果說你希望定制的容器是不可變的話,你只需要定義__len()__和__getitem__()方法。
如果你希望定制的容器是可以改變的話,除了__len__()和__getitem__()方法,你還需要定義__setitem__()和__delitem__()兩個方法。
練習:
編寫一個不可改變的自定義列表,要求紀錄列表中每個元素被訪問的次數。
class CountList: def __init__(self, *args): #參數 = 可變數量的 self.valus = [x for x in args] self.count = {}.fromkeys(range(len(self.valus)),0) def __len__(self): return len(self.valus) def __getitem__(self, key): self.count[key] += 1 return self.values[key] c1 = CountList(1,3,5,7,9) c2 = CountList(2,4,6,8,10) c1[1] + c2[1] # = 7 c1.count
迭代器
for i in "Eric": print(i) #字符串就是一個容器,同時也是一個迭代器 #for 語句的功用,就是觸發這個迭代器的功能 #每次從容器裡面拿出一個東西,這就是所謂的迭代操做 links = {'Eric blog' : 'http://dangerlover9403.pixnet.net/blog' ,\ 'Google' : 'www.google.com'} for each in links : print("%s -> %s " %(each,links[each]))
iter()
next()
string = 'Eric' it = iter(string) ''' print(next(it)) #E print(next(it)) #r print(next(it)) #i print(next(it)) #c print(next(it)) #Exception : StopIteration ''' while (True): try: each = next(it) except StopIteration: break; print(each) for each in string: print(each)
生成器
迭代器需要定一個類和實現相關的方法,才可以定義一個靈活的迭代器。
而生成器,只需要在普通的函數裡面,添加一個yield語句即可。
生成器的發明,使得Python在模仿協同程序 (註1)的概念可以實現。
註1: 所謂的協同程序,就是可以運行的獨立函數調用,函數可以暫停或掛起,並在需要的時候,從程序離開的地方繼續或重新開始。
'''' yield 相當於function裡面的return語句, 但是對於生成器來說,出現yield後,會把yield後面的參數返回回去, 返回去後,就暫停在這個yield的位置,下一次執行,就執行下一個。 假如說下以下的,執行yield 1 (將1 return 回去後 ) 下一次會執行 yield 2 (將 2 return 回去) ''''' def myGen(): print("生成器被執行!") yield 1 yield 2 ''' myG= myGen() print(next(myG)) print(next(myG)) print(next(myG)) #沒有了就拋出 StopIteration 這個異常 for i in myGen(): print(i) ''' def libs(): a = 0 b = 1 while True: a,b = b,a+b yield a for each in libs(): if each > 100 : break print(each,end=' ') print('\n') #列表推導數 #這個列表,就是要求100以內,能夠被2整除,但是不能被3整除的所有數 a = [i for i in range(100) if not (i%2) and i%3 ] print(a) #[2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98] print('\n') #通過字典的型式,把0-9的這10個數字分別顯示他們是否為偶數 b = { i: i % 2 == 0 for i in range(10) } print(b)#{0: True, 1: False, 2: True, 3: False, 4: True, 5: False, 6: True, 7: False, 8: True, 9: False} #用集合的方式 (不會顯示重複的數字# ){1, 2, 3, 4, 5, 6, 7, 8} c = {i for i in [1,1,2,3,4,5,5,6,7,8,1,2,3,1,]} print(c) print('\n') d = (i for i in range(10)) print(next(d))#0 print(next(d))#1 print(next(d))#2 for each in d: print(each)# 3 4 5 6 7 8 9 0 #把0-100不能夠被2整除的數字加起來 result = sum(i for i in range(100) if i % 2 ) print(result) # 2500
文章標籤
全站熱搜
留言列表