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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 迭代器 我們已經知道,可以直接作用于`for`循環的數據類型有以下幾種: 一類是集合數據類型,如`list`、`tuple`、`dict`、`set`、`str`等; 一類是`generator`,包括生成器和帶`yield`的generator function。 這些可以直接作用于`for`循環的對象統稱為可迭代對象:`Iterable`。 可以使用`isinstance()`判斷一個對象是否是`Iterable`對象: ``` >>> from collections import Iterable >>> isinstance([], Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('abc', Iterable) True >>> isinstance((x for x in range(10)), Iterable) True >>> isinstance(100, Iterable) False ``` 而生成器不但可以作用于`for`循環,還可以被`next()`函數不斷調用并返回下一個值,直到最后拋出`StopIteration`錯誤表示無法繼續返回下一個值了。 可以被`next()`函數調用并不斷返回下一個值的對象稱為迭代器:`Iterator`。 可以使用`isinstance()`判斷一個對象是否是`Iterator`對象: ``` >>> from collections import Iterator >>> isinstance((x for x in range(10)), Iterator) True >>> isinstance([], Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('abc', Iterator) False ``` 生成器都是`Iterator`對象,但`list`、`dict`、`str`雖然是`Iterable`,卻不是`Iterator`。 把`list`、`dict`、`str`等`Iterable`變成`Iterator`可以使用`iter()`函數: ``` >>> isinstance(iter([]), Iterator) True >>> isinstance(iter('abc'), Iterator) True ``` 你可能會問,為什么`list`、`dict`、`str`等數據類型不是`Iterator`? 這是因為Python的`Iterator`對象表示的是一個數據流,Iterator對象可以被`next()`函數調用并不斷返回下一個數據,直到沒有數據時拋出`StopIteration`錯誤。可以把這個數據流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過`next()`函數實現按需計算下一個數據,所以`Iterator`的計算是惰性的,只有在需要返回下一個數據時它才會計算。 `Iterator`甚至可以表示一個無限大的數據流,例如全體自然數。而使用list是永遠不可能存儲全體自然數的。 ## 小結 凡是可作用于`for`循環的對象都是`Iterable`類型; 凡是可作用于`next()`函數的對象都是`Iterator`類型,它們表示一個惰性計算的序列; 集合數據類型如`list`、`dict`、`str`等是`Iterable`但不是`Iterator`,不過可以通過`iter()`函數獲得一個`Iterator`對象。 Python的`for`循環本質上就是通過不斷調用`next()`函數實現的,例如: ``` for x in [1, 2, 3, 4, 5]: pass ``` 實際上完全等價于: ``` # 首先獲得Iterator對象: it = iter([1, 2, 3, 4, 5]) # 循環: while True: try: # 獲得下一個值: x = next(it) except StopIteration: # 遇到StopIteration就退出循環 break ``` ## 參考源碼 [do_iter.py](https://github.com/michaelliao/learn-python3/blob/master/samples/advance/do_iter.py)
                  <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>

                              哎呀哎呀视频在线观看