產生器與記憶體

  • 產生器(generator)是一種 Python 序列建立物件
  • 使用產生器,可以迭代很大的序列,而不需要在記憶體中一次建立或儲存整個序列
  • 產生器通常是「迭代器的資料來源」,在之前已經用過,產生一系列整數程式的range()
    • Python 2:
      1. range()會回傳一個串列,這會讓它受限,無法放入記憶體內
      2. 也有產生 xrange()
    • Python 3: 已經變成一般的 range()

【範例】將 1 到 100 的所有整數加在一起

>>> sum(range(1, 101))
5050

迭代產生器 v.s. 一般函數

  • 迭代產生器:每次迭代產生器時,它都會記得「上次被呼叫時所在的位置」,並回傳下一個值
  • 一般函式:一般的函式不會記得之前的呼叫,且永遠都會從它的第一行,以相同的狀態開始

產生器函式:建立大序列、大程式、無法使用產生器生成式

  • 編寫產生器函式的目的:想要建立一個可能會很大的序列,而且程式很大,無法使用產生器生成式
  • 它是一種一般的函式,但它會用 yield 陳述式來「回傳值」,而「不是 return」

【範例】編寫自己的 range() 版本

>>> def 函式名稱(first = 數字1, last = 數字2, step = 數字3):
        number = first
        while number < last
            yield number    #會用 yield 陳述式來「回傳值」,而「不是 return」
            number += step
>>> def my_range(first=0, last=10, step=1):
    number = first
    while number < last:
        yield number
        number += step


# 它是一個普通的函式
>>> my_range
<function my_range at 0x10239c840>


#會回傳一個產生器物件
>>> ranger = my_range(1, 5)
>>> ranger
<generator object my_range at 0x102389b48>


#可以迭代產生器物件
>>> for x in ranger:
    print(x)

1
2
3
4

results matching ""

    No results matching ""