摘要:我們把對(duì)象傳給內(nèi)置的方法,會(huì)返回一個(gè)迭代器,循環(huán)就是使用這個(gè)模式來(lái)實(shí)現(xiàn)適用于所有的對(duì)象。舉例當(dāng)?shù)髟贈(zèng)]有元素可以迭代時(shí)會(huì)引發(fā)一個(gè)異常。因此,對(duì)于你提的例子我們使用迭代器來(lái)重新定義一下。
如果你從迭代層面來(lái)理解的話可能對(duì)于for的工作原理會(huì)有更深的理解。
首先我們來(lái)使用dir查看一下對(duì)于range、str這兩個(gè)的不一樣的類型有什么共同點(diǎn)。
>>> dir(range) ["__class__", "__contains__", "__delattr__", "__dir__", "__doc__", "__eq__", "__format__", "__ge__", "__getattribute__", "__getitem__", "__gt__", "__hash__", "__init__", "__iter__", "__le__", "__len__", "__lt__", "__ne__", "__new__", "__reduce__", "__reduce_ex__", "__repr__", "__reversed__", "__setattr__", "__sizeof__", "__str__", "__subclasshook__", "count", "index", "start", "step", "stop"] >>> dir(str) ["__add__", "__class__", "__contains__", "__delattr__", "__dir__", "__doc__", "__eq__", "__format__", "__ge__", "__getattribute__", "__getitem__", "__getnewargs__", "__gt__", "__hash__", "__init__", "__iter__", "__le__", "__len__", "__lt__", "__mod__", "__mul__", "__ne__", "__new__", "__reduce__", "__reduce_ex__", "__repr__", "__rmod__", "__rmul__", "__setattr__", "__sizeof__", "__str__", "__subclasshook__", "capitalize", "casefold", "center", "count", "encode", "endswith", "expandtabs", "find", "format", "format_map", "index", "isalnum", "isalpha", "isdecimal", "isdigit", "isidentifier", "islower", "isnumeric", "isprintable", "isspace", "istitle", "isupper", "join", "ljust", "lower", "lstrip", "maketrans", "partition", "replace", "rfind", "rindex", "rjust", "rpartition", "rsplit", "rstrip", "split", "splitlines", "startswith", "strip", "swapcase", "title", "translate", "upper", "zfill"] 查看這兩個(gè)的共有屬性 >>> set(dir(range)) & set(dir(str)) {"__hash__", "__eq__", "__contains__", "__iter__", "__getitem__", "count", "__lt__", "__dir__", "__le__", "__subclasshook__", "__ge__", "__sizeof__", "__format__", "__len__", "__ne__", "__getattribute__", "__delattr__", "__reduce_ex__", "__gt__", "__reduce__", "__setattr__", "__doc__", "__class__", "__new__", "__repr__", "__init__", "index", "__str__"}
我們關(guān)注__iter__屬性,他們兩個(gè)都有這個(gè)函數(shù),如果你查看其他可以使用for循環(huán)迭代的對(duì)象,你都可以發(fā)現(xiàn)這個(gè)特殊方法。
實(shí)現(xiàn)了這個(gè)方法的對(duì)象我們稱之為iterable。
我們把對(duì)象傳給Python內(nèi)置的iter()方法,會(huì)返回一個(gè)迭代器,for循環(huán)就是使用這個(gè)模式來(lái)實(shí)現(xiàn)適用于所有的對(duì)象。
比如:
>>> iter([1, 2])>>> iter(range(0, 10)) >>> iter("abc") >>> iter函數(shù)返回的對(duì)象我們稱之為iterator,iterator只需要做一件事,那就是調(diào)用next(iterator)方法,返回下一個(gè)元素。
舉例:
>>> t = iter("abc") >>> next(t) "a" >>> next(t) "b" >>> next(t) "c" >>> next(t) Traceback (most recent call last): File "", line 1, in StopIteration
當(dāng)?shù)髟贈(zèng)]有元素可以迭代時(shí)會(huì)引發(fā)一個(gè)異常。
那么在這里我給出itrable和iterator的定義。
iterable:
可以傳給iter并返回一個(gè)iteratot的對(duì)象
iterator:
可以傳給next函數(shù)并返回下一個(gè)迭代元素的對(duì)象,并在迭代結(jié)束引發(fā)一個(gè)異常。
因此,對(duì)于你提的例子我們使用迭代器來(lái)重新定義一下。
>>> t = iter(range(90, 0, -1)) >>> t>>> next(t) 90 >>> next(t) 89 >>> next(t) 88
希望看完有所收獲。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38432.html
摘要:假設(shè)我們需要在程序中計(jì)算一些數(shù)字的平方根。此外如果我們需要在程序中多次使用平方根函數(shù),代碼將會(huì)更整潔。然而在這個(gè)虛構(gòu)的例子中,只有的年齡超過歲。然后檢查這三個(gè)人的年齡是否滿足第二個(gè)條件。 作者:?Christopher Tao翻譯:王可汗校對(duì):王雨桐本文約1800字,建議閱讀5分鐘本文...
摘要:對(duì)于迭代器來(lái)說,返回的是它自身,則是返回迭代器中的下一個(gè)值,如果沒有值了則拋出一個(gè)的異常。有一點(diǎn)繞,我們?cè)賮?lái)理一理迭代器和可迭代這兩個(gè)的差別一個(gè)迭代器一定是可迭代對(duì)象,因?yàn)樗欢ㄓ蟹椒?。而可迭代?duì)象的方法通常會(huì)生成一個(gè)新的迭代器對(duì)象。 for 循環(huán) 是我們?cè)?Python 里非常常用的一個(gè)語(yǔ)法,但你有沒有思考過 for 循環(huán)是怎樣實(shí)現(xiàn)的? 如果你以前接觸過 C++,應(yīng)該會(huì)知道類似 fo...
摘要:不同的人的路線圖版本會(huì)有所不同。尋找答案從一無(wú)所知到無(wú)所不知如果你在這個(gè)過程中多次遇到困難,在知難而退之前努力嘗試解決問題。并不是成為一個(gè)全面的開發(fā)人員所需要的唯一技能。首先進(jìn)行一兩個(gè)月的學(xué)習(xí)階段,然后進(jìn)入一個(gè)月的構(gòu)建階段。 初級(jí)開發(fā)者學(xué)Python容易陷入茫然,面對(duì)市面上種類眾多的編程語(yǔ)言和框架,重要的是堅(jiān)持自己的選擇,宜精不宜雜。本文是一篇指路文,概述了從編程基礎(chǔ)、引導(dǎo)、文檔閱讀、...
摘要:總之,要永遠(yuǎn)做個(gè)學(xué)習(xí)者,但不僅僅只做學(xué)習(xí)者了解并踐行學(xué)習(xí)實(shí)踐階段循環(huán)任何創(chuàng)造性學(xué)科的學(xué)習(xí)都可以分兩個(gè)階段,學(xué)習(xí)階段和構(gòu)建階段,彼此不斷重復(fù)。 初級(jí)開發(fā)者學(xué)Python容易陷入茫然,面對(duì)市面上種類眾多的編程語(yǔ)言和框架,重要的是堅(jiān)持自己的選擇,宜精不宜雜。本文是一篇指路文,概述了從編程基礎(chǔ)、引導(dǎo)、文檔閱讀、書籍和視頻、源代碼等學(xué)習(xí)和積累環(huán)節(jié),值得初學(xué)者參考。 作為一個(gè)開發(fā)者,為何要選擇Py...
摘要:因此,當(dāng)任何由返回的函數(shù)被調(diào)用時(shí),的值將在附近的范圍進(jìn)行查找。下面是解決這一問題的一些方法。另外一個(gè)解決方案就是創(chuàng)造一個(gè)閉包,利用默認(rèn)函數(shù)立即綁定。當(dāng)缺失時(shí),執(zhí)行類,字典的實(shí)例將自動(dòng)實(shí)例化這個(gè)數(shù)列。 1、下面這段代碼的輸出結(jié)果是什么?請(qǐng)解釋。 def extendList(val, list=[]): list.append(val) return list list...
閱讀 3860·2021-09-06 15:00
閱讀 2187·2019-08-30 15:53
閱讀 3293·2019-08-23 16:44
閱讀 953·2019-08-23 15:19
閱讀 1406·2019-08-23 12:27
閱讀 4204·2019-08-23 11:30
閱讀 600·2019-08-23 10:33
閱讀 378·2019-08-22 16:05