Python – Iterable __getitem__() method

測試環境為 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

下面範例使用 __getitem__() method (方法) 來實作 Iterable 的物件 (Object).

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

    def __getitem__(self, key):
        print('__getitem__')
        if key <= self.max_num:
            return key
        else:
            raise IndexError

my_iterator = MyIterator(3)

for item in my_iterator:
    print(item)

執行結果

[root@localhost ~]# python3 iter3.py
__init__
__getitem__
0
__getitem__
1
__getitem__
2
__getitem__
3
__getitem__

說明:
__getitem__(self, key) 有二個 參數,第二參數為 傳入停止 key 值,程式用來判斷迴圈在哪裡停止.當觸發欲終止條件時透過 raise IndexError (或是 StopIteration) 皆可終止 iteration.
這邊應該會好奇 key 值,我沒輸入是誰定義的,這個會由 for loop 自動生成從 0 開始到無窮的整數(累加 1)

for item in my_iterator:
    print(item)
    def __getitem__(self, key):
        print('__getitem__')
        if key <= self.max_num:
            return key
        else:
            raise IndexError

執行結果

__getitem__
0
__getitem__
1
__getitem__
2
__getitem__
3
__getitem__

透過 __getitem__ 的 方法 (Method) 可以透過 for 迴圈多次使用.

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

    def __getitem__(self, key):
        if key <= self.max_num:
            return key
        else:
            raise IndexError

my_iterator = MyIterator(3)

for item in my_iterator:
    print(item)

for item in my_iterator:
    print(item)

執行結果

[root@localhost ~]# [root@localhost ~]# python3 iter4.py
0
1
2
3
0
1
2
3
沒有解決問題,試試搜尋本站其他內容

發佈留言

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

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