描述符、迭代器、生成器
描述符:將某種特殊類型的類的實例指派給另一個類的屬性。
此處特殊類型的要求,至少實現”__set__(self , instance , owner)“、”__get__(self , instance , value)“、”__delete__(self , instance )“三個方法中的一個。
>>> class MyDecriptor:def __get__(self,instance,owner):print('getting...',self,instance,owner)def __set__(self,instacne,owner):print('setting...',self,instance,owner)def __delete__(self,instace):print('deleting...',self,instance)>>> class Test:x = MyDecriptor() >>>test.x getting... <__main__.MyDecriptor object at 0x00000212DA0936D8> <__main__.Test object at 0x00000212DA0EABE0> <class '__main__.Test'> >>> test.x = 'X-man' setting... <__main__.MyDecriptor object at 0x00000223972236D8> <__main__.Test object at 0x00000223972234E0> X-man >>> del test.x deleting... <__main__.MyDecriptor object at 0x00000223972236D8> <__main__.Test object at 0x00000223972234E0> >>>test.x訪問屬性時,調用__get__方法,從結果可以看出,調用時傳入的三個參數依次為?__main__.MyDecriptor object at 0x00000212DA0936D8,即描述符類本身的實例;第二個,<__main__.Test object at 0x00000212DA0EABE0>,Test類的實例,
第三個,?<class '__main__.Test'>,類本身。
另外 __set__、__delete__與之相類似。
?
2、迭代器
a、定義:提供迭代方法的容器稱為迭代器,序列、字典、文件等都是迭代器,它們都支持迭代操作。
for i in 'Fishc':print(i) F i s h c此處 for語句的作用是觸發迭代器的迭代功能,每次從容器中取出一個數據。
b、關于迭代操作,python提供了兩個相關的 BIF、iter()、next()。對于一個容器對象,調用iter()就得到它的迭代器,調用next(),迭代器就會返回下一個值,直到迭代器沒有值可以返回,就拋出StopItration異常。
>>> string = 'Fishc' >>> s =iter(string) >>> next(s) 'F' >>> next(s) 'i' >>> next(s) 's' >>> next(s) 'h' >>> next(s) 'c' >>> next(s) Traceback (most recent call last):File "<pyshell#13>", line 1, in <module>next(s) StopIterationc、關于迭代器的魔法方法,iter()的實現 ” __iter__()“、next()的實現” __next__()“,下面斐波拉契數列的例子。
>>> class Fibs:def __init__(self,n = 10):self.a = 0self.b = 1self.n = ndef __iter__(self):return selfdef __next__(self):self.a , self.b = self.b ,self.a + self.bif self.a > self.n:raise StopIterationreturn self.a>>> fibs = Fibs() >>> for each in fibs:print(each)1 1 2 3 5 8 >>> fibs = Fibs(100) >>> for each in fibs:print(each)1 1 2 3 5 8 13 21 34 55 89?
4、生成器,生成器實際上是一個特殊的迭代器。
a、協同程序:可以運行的獨立函數調用,函數可以暫停或者掛起,在需要的時候從程序離開的地方繼續運行或重新開始。
b、一旦一個函數中存在 yield ,這個函數就成了一個生成器。
c、生成器的關鍵字:yield,每當遇到yield,會將后面的內容會返回,并暫停,采用next()繼續。
>>> def Fibs():a =0b = 1while True:a,b = b,a+byield a>>> c = Fibs() >>> next(c) 1 >>> next(c) 1 >>> next(c) 2 >>> next(c) 3 >>> next(c) 5>>> for each in c:if each > 100:breakprint(each,end=" ")8 13 21 34 55 89 >>> type(c) <class 'generator'> >>>?
轉載于:https://www.cnblogs.com/Chris-01/p/11235450.html
總結
以上是生活随笔為你收集整理的描述符、迭代器、生成器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 被别人梦到怎么回复
- 下一篇: 梦到捉小虾是什么意思