<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Python 迭代器 > 原文: [https://www.programiz.com/python-programming/iterator](https://www.programiz.com/python-programming/iterator) #### 迭代器是可以迭代的對象。 在本教程中,您將學習迭代器如何工作以及如何使用`__iter__`和`__next__`方法構建自己的迭代器。 ## Python 中的迭代器 迭代器在 Python 中無處不在。 它們在`for`循環,理解力,生成器等中優雅地實現,但隱藏在清晰的視野中。 Python 中的迭代器只是可以對其進行迭代的[對象](/python-programming/class)。 一個將返回數據的對象,一次返回一個元素。 從技術上講,Python **迭代器對象**必須實現兩個特殊方法`__iter__()`和`__next__()`,統稱為**迭代器協議**。 如果我們可以從中獲得一個迭代器,則該對象稱為**可迭代對象**。 Python 中大多數內置容器都是可迭代的,例如:[列表](/python-programming/list),[元組](/python-programming/tuple),[字符串](/python-programming/string)等。 `iter()`函數(依次調用`__iter__()`方法)從它們返回一個迭代器。 * * * ## 通過迭代器進行迭代 我們使用`next()`函數手動迭代迭代器的所有項目。 當我們到達末尾并且沒有更多數據要返回時,它將引發`StopIteration`異常。 以下是一個示例。 ```py # define a list my_list = [4, 7, 0, 3] # get an iterator using iter() my_iter = iter(my_list) # iterate through it using next() # Output: 4 print(next(my_iter)) # Output: 7 print(next(my_iter)) # next(obj) is same as obj.__next__() # Output: 0 print(my_iter.__next__()) # Output: 3 print(my_iter.__next__()) # This will raise error, no items left next(my_iter) ``` **輸出** ```py 4 7 0 3 Traceback (most recent call last): File "<string>", line 24, in <module> next(my_iter) StopIteration ``` 一種更優雅的自動迭代方式是[`for`循環](/python-programming/for-loop)。 使用此方法,我們可以迭代可以返回迭代器的任何對象,例如列表,字符串,文件等。 ```py >>> for element in my_list: ... print(element) ... 4 7 0 3 ``` * * * ## 迭代器和`for`循環 如上例所示,`for`循環能夠自動迭代列表。 實際上,`for`循環可以迭代任何可迭代的對象。 讓我們仔細看看`for`循環是如何在 Python 中實際實現的。 ```py for element in iterable: # do something with element ``` 實際上是實現為。 ```py # create an iterator object from that iterable iter_obj = iter(iterable) # infinite loop while True: try: # get the next item element = next(iter_obj) # do something with element except StopIteration: # if StopIteration is raised, break from loop break ``` 因此,在內部,`for`循環通過在可迭代對象上調用`iter()`創建了迭代器對象`iter_obj`。 具有諷刺意味的是,這個`for`循環實際上是一個無限[`while`循環](/python-programming/while-loop)。 在循環內部,它調用`next()`獲取下一個元素,并使用該值執行`for`循環的主體。 所有物品耗盡后,`StopIteration`拋出,內部被卡住,循環結束。 請注意,任何其他類型的異常都將通過。 * * * ## 構建自定義迭代器 在 Python 中從頭開始構建迭代器很容易。 我們只需要實現`__iter__()`和`__next__()`方法。 `__iter__()`方法返回迭代器對象本身。 如果需要,可以執行一些初始化。 `__next__()`方法必須返回序列中的下一項。 在到達末尾以及隨后的調用中,它必須提高`StopIteration`。 在這里,我們顯示一個示例,該示例將在每次迭代中為我們提供下一個 2 的冪。 冪指數從零開始一直到用戶設置的數字。 ```py class PowTwo: """Class to implement an iterator of powers of two""" def __init__(self, max=0): self.max = max def __iter__(self): self.n = 0 return self def __next__(self): if self.n <= self.max: result = 2 ** self.n self.n += 1 return result else: raise StopIteration # create an object numbers = PowTwo(3) # create an iterable from the object i = iter(numbers) # Using next to get to the next iterator element print(next(i)) print(next(i)) print(next(i)) print(next(i)) print(next(i)) ``` **輸出**: ```py 1 2 4 8 Traceback (most recent call last): File "/home/bsoyuj/Desktop/Untitled-1.py", line 32, in <module> print(next(i)) File "<string>", line 18, in __next__ raise StopIteration StopIteration ``` 我們還可以使用`for`循環來迭代迭代器類。 ```py >>> for i in PowTwo(5): ... print(i) ... 1 2 4 8 16 32 ``` * * * ## Python 無限迭代器 不必耗盡迭代器對象中的項目。 可以有無限迭代器(永無止境)。 處理此類迭代器時必須小心。 這是一個演示無限迭代器的簡單示例。 可以使用兩個參數來調用[內置函數](/python-programming/built-in-function) `iter()`函數,其中第一個參數必須是可調用的對象(函數),第二個參數是前哨。 迭代器將調用此函數,直到返回的值等于哨兵。 ```py >>> int() 0 >>> inf = iter(int,1) >>> next(inf) 0 >>> next(inf) 0 ``` 我們可以看到`int()`函數始終返回 0。因此,將其傳遞為`iter(int,1)`將返回一個迭代器,該迭代器將調用`int()`,直到返回的值等于 1。這永遠不會發生,并且會得到一個無限的迭代器。 我們還可以構建自己的無限迭代器。 理論上,以下迭代器將返回所有奇數。 ```py class InfIter: """Infinite iterator to return all odd numbers""" def __iter__(self): self.num = 1 return self def __next__(self): num = self.num self.num += 2 return num ``` 樣本運行如下。 ```py >>> a = iter(InfIter()) >>> next(a) 1 >>> next(a) 3 >>> next(a) 5 >>> next(a) 7 ``` 等等... 在這些類型的無限迭代器上進行迭代時,請小心包含終止條件。 使用迭代器的優點是節省了資源。 如上圖所示,我們無需將整個數字系統存儲在內存中就可以獲得所有奇數。 從理論上講,我們可以在有限內存中包含無限項。 有一種在 Python 中創建迭代器的簡便方法。 要了解更多信息,請訪問:[使用`yield`的 Python 生成器](/python-programming/generator)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看