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

 

arrow
arrow

    Eric 發表在 痞客邦 留言(0) 人氣()