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

                **生成器 (generator)** 在 Python 中一邊循環一邊計算的方式稱為生成器 ( generator )。 當我們需要使用無窮無盡的數據的時候,由于電腦機器的內存是有限的,不可能一次性存儲那么多的數據,我們就可以根據某種規律計算出下一個數據的值,我們只需保存算法,這樣就節省大量的空間,而不需要保存真實的海量數據,再在循環中不斷推算下一個數據值的思想就誕生了生成器 ( generator )。 **生成器的創建常用方法** 方法一:把一個列表生成式的 [ ] 改成 ( ),就創建了一個生成器 ( generator )。 ~~~ >>> _list = [ i for i in range(3)] >>> _list [0, 1, 2] >>> gene = (i for i in range(3)) >>> gene <generator object <genexpr> at 0x7f495742a6d0> ~~~ 使用列表生成式生成的列表我們可以直接打印出列表中的每一個元素,但是生成的生成器對象我們卻只得到了一個內存地址,那如何獲取生成器對象中的元素呢? 通過 next() 方法打印生成器中的元素,直到最后拋出 StopIteration 錯誤表示無法繼續返回下一個值了。 ~~~ >>> next(gene) 0 >>> next(gene) 1 >>> next(gene) 2 >>> next(gene) #拋出 StopIteration 錯誤 Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration ~~~ 當然我們也可以使用 for 循環打印生成器中的元素 ~~~ #!/usr/bin/env python3 # -*- coding:utf-8 -*- gene = (i for i in range(3)) for i in gene: print(i) ~~~ 方法二:在函數定義中使用了 yield 關鍵字,那么這個函數就不再是一個普通函數,而是一個生成器 ( generator )。 生成器 ( generator ) 和普通函數的執行流程不一樣。函數是順序執行,遇到 return 語句或者最后一行函數語句就返回。而生成器 ( generator ) 的函數,在每次調用 next() 的時候執行,遇到 yield 語句返回,再次執行時從上次返回的 yield 語句處繼續執行 , 更簡單點理解生成器就是一個迭代器。 **實例說明** ~~~ >>>def info(): ... print('Python') ... yield 1 ... print('PHP') ... yield 2 ... print('Java') ... yield 3 ... ~~~ 調用時,首先要生成一個生成器 ( generator ) 對象,然后用 next() 函數不斷獲得下一個返回值: ~~~ >>> g = info() >>> next(g) #第一次調用 Python 1 >>> next(g) #第二次調用 PHP 2 >>> next(g) #第三次調用 Java 3 >>> next(g) #拋出 StopIteration 錯誤 Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration ~~~ 可以看出, info() 已經不是一個普通函數而是生成器,在調用過程中遇到 yield 就中斷,下次又在中斷出繼續執行。執行 3 次 yield 后,已經沒有 yield 可以執行了,所以,第 4 次調用 next(g) 就拋出 StopIteration 的錯誤。 實例使用 yield 實現斐波那契數列 ~~~ #!/usr/bin/env python3 # -*- coding:utf-8 -*- def fibonacci(n): # 斐波那契生成器函數 a, b, num = 0, 1, 0 while True: if (num > n): return yield a a, b = b, a + b num += 1 g = fibonacci(3) # g是一個由斐波那契生成器函數返回迭代器 while True: try: print (next(g), end=",") except StopIteration: break ~~~ 執行結果 ~~~ 0,1,1,2, ~~~ 當然在實際開發中我們很少使用 while 去循環迭代器,因為使用 for 進行迭代更方便。
                  <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>

                              哎呀哎呀视频在线观看