[Python] for迴圈是怎麼運作的
如果你從迭代層面來理解的話可能對於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]) <list_iterator object at 0x000001A1141E0668> >>> iter(range(0, 10)) <range_iterator object at 0x000001A1124C6BB0> >>> iter("abc") <str_iterator object at 0x000001A1141E0CF8> >>> 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 "<stdin>", line 1, in <module> StopIteration
當迭代器再沒有元素可以迭代時會引發一個異常。
那麼在這裡我給itrable和iterator的定義。
iterable:
可以傳給iter並傳回一個iteratot的物件
iterator:
可以傳給next函數並傳回下一個迭代元素的對象,並在迭代結束引發一個異常。
因此,對於你提的例子我們使用迭代器來重新定義一下。
>>> t = iter(range(90, 0, -1)) >>> t <range_iterator object at 0x000001A1124C6BB0> >>> next(t) 90 >>> next(t) 89 >>> next(t) 88
希望看完有所收穫。
更多[Python] for循環是怎樣工作的相關文章請關注PHP中文網!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Uvicorn是如何持續監聽HTTP請求的? Uvicorn是一個基於ASGI的輕量級Web服務器,其核心功能之一便是監聽HTTP請求並進�...

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途

在Python中,如何通過字符串動態創建對象並調用其方法?這是一個常見的編程需求,尤其在需要根據配置或運行...
