Python – Iterable yield

Loading

測試環境為 CentOS 8 x86_64 (虛擬機)

原來一個 For 迴圈的知識量這麼大.

[root@localhost ~]# python3
Python 3.6.8 (default, Mar 25 2022, 11:15:52)
[GCC 8.5.0 20210514 (Red Hat 8.5.0-10)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> for i in range(1,4):
...     print(i)
...
1
2
3

先來看看什麼是 Iteration , Iterable 與 Iterator

參考文章 – https://medium.com/citycoddee/python%E9%80%B2%E9%9A%8E%E6%8A%80%E5%B7%A7-6-%E8%BF%AD%E4%BB%A3%E9%82%A3%E4%BB%B6%E5%B0%8F%E4%BA%8B-%E6%B7%B1%E5%85%A5%E4%BA%86%E8%A7%A3-iteration-iterable-iterator-iter-getitem-next-fac5b4542cf4

  • Iteration: 中文翻成迭代,其實就是可以存取 object 裡面的所有所有元素的過程或是機制.
  • Iterable:可以 Iteration 的 object 都稱為 Iterable , Iterable 的物件包含以下. 官方文件說明 – https://docs.python.org/3/glossary.html#term-iterable
    1. sequence types (序列類) 如 list , str 與 tuple.
    2. non-sequence types (非序列類型) 如 dict 與 file objects.
    3. Object (物件)有使用 __iter__() 或是 __getitem__() method (方法).

    基本上可以 被 for loop 存取 的 objects 都是 Iterable.

  • Iterator:只要有 __iter__ 與 __next__ 的 objects 都是 Iterator. 官方文件說明 – https://docs.python.org/3/glossary.html#term-iterable Iterable

使用 __iter__ method (方法) 透過 yield 產生 Iterable 的物件 (Object).


[root@localhost ~]# vi iter5.py
class MyIterator:
    def __init__(self, max_num):
        print('__init__')
        self.max_num = max_num

    def __iter__(self):
        print('__iter__')
        num = 1
        while num <= self.max_num:
            yield num
            num += 1

my_iterator = MyIterator(3)

for item in my_iterator:
    print(item)

執行結果

[root@localhost ~]# python3 iter5.py
__init__
__iter__
1
2
3

說明:
我們先來看一下 __iter__ 中的 yield

  • yield 官方網頁- https://docs.python.org/zh-tw/3/reference/expressions.html#yieldexpr
    在函數體中使用 yield 表達式會導致該函數成為生成器 (generator)函數
  • generator 官方網頁 – https://docs.python.org/zh-tw/3/glossary.html#term-generator
    一個會回傳 generator iterator(產生器疊代器)的函式.它看起來像一個正常的函式,但不同的是它包含了 yield 運算式,能產生一系列的值,這些值可用於 for 迴圈,或是以 next() 函式,每次檢索其中的一個值.
  • generator iterator 官方網頁 – https://docs.python.org/zh-tw/3/glossary.html#term-generator-iterator
    一個由 generator(產生器)函式所建立的物件.

yield 會自動回傳一個 Gerenator 的物件 ( object) 該 generator 回傳一個 Iterator, 透過 yield 運算式,能產生一系列的值,這些值可用於 for 迴圈,或是以 next() 函式,每次檢索其中的一個值.

for item in my_iterator:
    print(item)
    def __iter__(self):
        print('__iter__')
        num = 1
        while num <= self.max_num:
            yield num
            num += 1

執行結果

__iter__
1
2
3
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料