Python 中迭代器和生成器的區別

Jesse John 2023年1月30日
  1. Python 中的迭代器
  2. Python 中的生成器
  3. Python 中的迭代器和生成器示例
  4. まとめ
Python 中迭代器和生成器的區別

迭代器和生成器幫助我們生成一些輸出或迭代地處理一些程式碼,一次一位。在本文中,我們將通過一個簡單的示例瞭解 Python 的迭代器和生成器之間的一些基本區別。

Python 中的迭代器

迭代器的基本特徵如下:

  1. 迭代器是使用實現迭代器協議的類建立的物件。這意味著該類定義了 __iter____next__ 方法。
  2. __next__ 方法使用 return 語句返回一個值。由於 return 語句必須是該方法的最後一行,我們必須在 return 語句之前更新要在 __next__ 下一次執行中使用的變數。

在最簡單的情況下,我們將看到,__iter__ 返回 self

Python 中的生成器

生成器的基本特徵如下:

  1. 生成器是一個函式。
  2. 生成器函式使用 yield 關鍵字而不是 return 關鍵字。
    2.1 yield 關鍵字產生一個值並暫停函式的執行。
    2.2 對 next() 的下一次呼叫在 yield 語句之後恢復程式碼的執行。

生成器函式允許我們建立生成器迭代器,而無需使用類建立迭代器時所需的所有額外程式碼。

Python 中的迭代器和生成器示例

以下兩個示例突出了前兩節中提到的要點。這兩個示例都說明了如何生成從 1 開始的整數平方。

第一個示例顯示瞭如何使用迭代器完成它。第二個示例顯示了使用生成器的等效程式碼。

迭代器的示例程式碼:

# ITERATOR (Class)


class squares(object):
    def __init__(self, num1):
        self.nxt_sq_of = 1
        self.lim = num1

    def __iter__(self):
        return self

    def __next__(self):

        if self.nxt_sq_of <= self.lim:
            ret_sq_of = self.nxt_sq_of
            self.nxt_sq_of += 1
            return ret_sq_of * ret_sq_of
        else:
            raise StopIteration


# Iterator Object
a = squares(6)

# Next value of the iterator.
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)
next(a)


# Using the iterator in a loop.
a1 = squares(6)

while True:
    print(next(a1))

輸出:

next(a)
Out[3]: 1

next(a)
Out[4]: 4

next(a)
Out[5]: 9

next(a)
Out[6]: 16

next(a)
Out[7]: 25

next(a)
Out[8]: 36

next(a)
Traceback (most recent call last):

  File "<ipython-input-9-15841f3f11d4>", line 1, in <module>
    next(a)

  File "<ipython-input-1-9dbe8e565876>", line 17, in __next__
    raise StopIteration

StopIteration

生成器示例程式碼:

# GENERATOR FUNCTION


def gen_squares(num2):
    i = 1
    while i <= num2:
        yield i * i
        i += 1


# Generator iterator.
b = gen_squares(5)

# Next yield of the generator iterator.
next(b)
next(b)
next(b)
next(b)
next(b)
next(b)

輸出:

next(b)
Out[3]: 1

next(b)
Out[4]: 4

next(b)
Out[5]: 9

next(b)
Out[6]: 16

next(b)
Out[7]: 25

next(b)
Traceback (most recent call last):

  File "<ipython-input-8-adb3e17b0219>", line 1, in <module>
    next(b)

StopIteration

まとめ

我們發現 Python 的生成器允許我們編寫簡潔的程式碼來建立生成器迭代器。

另一方面,迭代器更強大,因為它們允許程式設計師為 __iter__ 方法編寫自定義程式碼。

有關詳細資訊,請參閱以下內容。

  1. 生成器的 Python Wiki 文章。
  2. 迭代器的 Python Wiki 文章。
作者: Jesse John
Jesse John avatar Jesse John avatar

Jesse is passionate about data analysis and visualization. He uses the R statistical programming language for all aspects of his work.

相關文章 - Python Iterator