Python Iterable

要了解python 哪些對象是可以迭代的,

可以先了解兩個相似的名詞

  1. Iterable
  2. 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呢?



發表留言