要了解python 哪些對象是可以迭代的,
可以先了解兩個相似的名詞
- Iterable
- Iterator
Iterable
可以被迭代、遍歷(loop, iteration)的物件對象可以被稱為iterable,
從官方文件得知,要實現__iter__或是__getitem__的方法即可。
包含了常見的list、tuple、set、dict、str、range,
>>> dir(str())
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', ......]
但若是使用collection去檢查是否是iterable
只有實現
__getitem__的對象可以被迭代但不會是iterable
Iterator
https://docs.python.org/3.7/c-api/iter.html
從官方文件看出,含有__iter__和__next__的對象可稱為iterator,
iterator是iterable的子集合,
上述提到的幾種方式是iterable但都不是iterator,可以使用上面用到的isinstance或是dir來確認,
>>> from collections.abc import Iterable, Iterator
>>> for i in ([1,2,3], "123", (1,2,3)):
... print(f"{i} is iterable: {isinstance(i, Iterable)}")
... print(f"{i} is iterator: {isinstance(i, Iterator)}")
...
[1, 2, 3] is iterable: True
[1, 2, 3] is iterator: False
123 is iterable: True
123 is iterator: False
(1, 2, 3) is iterable: True
(1, 2, 3) is iterator: False
而文件則是iterator
>>> file_path = os.path.abspath("test.py")
>>> with open(file_path) as ifile:
... isinstance(ifile, Iterator)
...
True
結語
了解了iterable和iterator,以後開發時,
若想創造出可以被迭代的對象或是迭代器,
則要知道必須要包含哪些基礎功能
那麼Generator呢?
發表留言