測試環境為 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
- sequence types (序列類) 如 list , str 與 tuple.
- non-sequence types (非序列類型) 如 dict 與 file objects.
- 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
沒有解決問題,試試搜尋本站其他內容