摘要:我們把對象傳給內置的方法,會返回一個迭代器,循環就是使用這個模式來實現適用于所有的對象。舉例當迭代器再沒有元素可以迭代時會引發一個異常。因此,對于你提的例子我們使用迭代器來重新定義一下。
如果你從迭代層面來理解的話可能對于for的工作原理會有更深的理解。
首先我們來使用dir查看一下對于range、str這兩個的不一樣的類型有什么共同點。
>>> 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"] 查看這兩個的共有屬性 >>> 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__"}
我們關注__iter__屬性,他們兩個都有這個函數,如果你查看其他可以使用for循環迭代的對象,你都可以發現這個特殊方法。
實現了這個方法的對象我們稱之為iterable。
我們把對象傳給Python內置的iter()方法,會返回一個迭代器,for循環就是使用這個模式來實現適用于所有的對象。
比如:
>>> iter([1, 2])>>> iter(range(0, 10)) >>> iter("abc") >>> iter函數返回的對象我們稱之為iterator,iterator只需要做一件事,那就是調用next(iterator)方法,返回下一個元素。
舉例:
>>> t = iter("abc") >>> next(t) "a" >>> next(t) "b" >>> next(t) "c" >>> next(t) Traceback (most recent call last): File "", line 1, in StopIteration
當迭代器再沒有元素可以迭代時會引發一個異常。
那么在這里我給出itrable和iterator的定義。
iterable:
可以傳給iter并返回一個iteratot的對象
iterator:
可以傳給next函數并返回下一個迭代元素的對象,并在迭代結束引發一個異常。
因此,對于你提的例子我們使用迭代器來重新定義一下。
>>> t = iter(range(90, 0, -1)) >>> t>>> next(t) 90 >>> next(t) 89 >>> next(t) 88
希望看完有所收獲。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/38432.html
摘要:假設我們需要在程序中計算一些數字的平方根。此外如果我們需要在程序中多次使用平方根函數,代碼將會更整潔。然而在這個虛構的例子中,只有的年齡超過歲。然后檢查這三個人的年齡是否滿足第二個條件。 作者:?Christopher Tao翻譯:王可汗校對:王雨桐本文約1800字,建議閱讀5分鐘本文...
摘要:不同的人的路線圖版本會有所不同。尋找答案從一無所知到無所不知如果你在這個過程中多次遇到困難,在知難而退之前努力嘗試解決問題。并不是成為一個全面的開發人員所需要的唯一技能。首先進行一兩個月的學習階段,然后進入一個月的構建階段。 初級開發者學Python容易陷入茫然,面對市面上種類眾多的編程語言和框架,重要的是堅持自己的選擇,宜精不宜雜。本文是一篇指路文,概述了從編程基礎、引導、文檔閱讀、...
摘要:總之,要永遠做個學習者,但不僅僅只做學習者了解并踐行學習實踐階段循環任何創造性學科的學習都可以分兩個階段,學習階段和構建階段,彼此不斷重復。 初級開發者學Python容易陷入茫然,面對市面上種類眾多的編程語言和框架,重要的是堅持自己的選擇,宜精不宜雜。本文是一篇指路文,概述了從編程基礎、引導、文檔閱讀、書籍和視頻、源代碼等學習和積累環節,值得初學者參考。 作為一個開發者,為何要選擇Py...
摘要:因此,當任何由返回的函數被調用時,的值將在附近的范圍進行查找。下面是解決這一問題的一些方法。另外一個解決方案就是創造一個閉包,利用默認函數立即綁定。當缺失時,執行類,字典的實例將自動實例化這個數列。 1、下面這段代碼的輸出結果是什么?請解釋。 def extendList(val, list=[]): list.append(val) return list list...
閱讀 3834·2021-09-06 15:00
閱讀 2171·2019-08-30 15:53
閱讀 3277·2019-08-23 16:44
閱讀 944·2019-08-23 15:19
閱讀 1391·2019-08-23 12:27
閱讀 4187·2019-08-23 11:30
閱讀 581·2019-08-23 10:33
閱讀 369·2019-08-22 16:05