日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

描述符、迭代器、生成器

發(fā)布時(shí)間:2023/11/29 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 描述符、迭代器、生成器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

描述符:將某種特殊類型的類的實(shí)例指派給另一個(gè)類的屬性。

  此處特殊類型的要求,至少實(shí)現(xiàn)”__set__(self , instance , owner)“、”__get__(self , instance , value)“、”__delete__(self , instance )“三個(gè)方法中的一個(gè)。

>>> 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訪問屬性時(shí),調(diào)用__get__方法,從結(jié)果可以看出,調(diào)用時(shí)傳入的三個(gè)參數(shù)依次為?__main__.MyDecriptor object at 0x00000212DA0936D8,即描述符類本身的實(shí)例;第二個(gè),<__main__.Test object at 0x00000212DA0EABE0>,Test類的實(shí)例,

第三個(gè),?<class '__main__.Test'>,類本身。

  另外 __set__、__delete__與之相類似。

?

2、迭代器

  a、定義:提供迭代方法的容器稱為迭代器,序列、字典、文件等都是迭代器,它們都支持迭代操作。

for i in 'Fishc':print(i) F i s h c

  此處 for語句的作用是觸發(fā)迭代器的迭代功能,每次從容器中取出一個(gè)數(shù)據(jù)。

  b、關(guān)于迭代操作,python提供了兩個(gè)相關(guān)的 BIF、iter()、next()。對(duì)于一個(gè)容器對(duì)象,調(diào)用iter()就得到它的迭代器,調(diào)用next(),迭代器就會(huì)返回下一個(gè)值,直到迭代器沒有值可以返回,就拋出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) StopIteration

  c、關(guān)于迭代器的魔法方法,iter()的實(shí)現(xiàn) ” __iter__()“、next()的實(shí)現(xiàn)” __next__()“,下面斐波拉契數(shù)列的例子。

>>> 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、生成器,生成器實(shí)際上是一個(gè)特殊的迭代器。

  a、協(xié)同程序:可以運(yùn)行的獨(dú)立函數(shù)調(diào)用,函數(shù)可以暫停或者掛起,在需要的時(shí)候從程序離開的地方繼續(xù)運(yùn)行或重新開始。

  b、一旦一個(gè)函數(shù)中存在 yield ,這個(gè)函數(shù)就成了一個(gè)生成器。

  c、生成器的關(guān)鍵字:yield,每當(dāng)遇到y(tǒng)ield,會(huì)將后面的內(nèi)容會(huì)返回,并暫停,采用next()繼續(xù)。

>>> 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'> >>>

?

轉(zhuǎn)載于:https://www.cnblogs.com/Chris-01/p/11235450.html

總結(jié)

以上是生活随笔為你收集整理的描述符、迭代器、生成器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。