測試環境為 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
使用 __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
沒有解決問題,試試搜尋本站其他內容