python迭代器
1. 可迭代對象
可以利用 for 循環的對象,都叫可迭代對象。
列表、元組、字典、字符串等都是可迭代對象。
# 以列表為例
>>> alist = [0, 1, 2, 3, 4, 5]
>>> for i in alist:
... print(i)
...
0
1
2
3
4
5
2. 是否可迭代?
對 Python 比較熟悉的朋友,肯定知道哪些數據類型是可迭代的,哪些是不可迭代的。
但是對新手來說,可能需要借助一些函數來判別,比如 Python 內置的 collections.abc
模塊,這個模塊只有在 Python 中才有噢,在這個模塊中提供了一個 Iterable 類,可以用 isinstance 來判斷。
>>> from collections.abc import Iterable
>>>
>>> isinstance([0, 1, 2], Iterable) # 列表
True
>>> isinstance({"name": "張三"}, Iterable) # 字典
True
>>> isinstance((1,2,3), Iterable) # 元組
True
>>> isinstance("hello", Iterable) # 字符串
True
但是這種方法并不是百分百準確(具體下面會說到),最準確的方法,還是應該使用 for 循環。
3. 可迭代協議
可迭代對象內部是如何實現在你對其進行 for 循環時,可以一個一個元素的返回出來呢?
這就要談到迭代器協議。
第一種場景:如果一個對象內部實現了 __iter__()
方法 ,并返回一個迭代器實例,那么該對象就是可迭代對象
class Array:
mylist = [0,1,2]
# 返回迭代器類的實例
def __iter__(self):
return iter(self.mylist)
# 得到可迭代對象
my_list = Array()
print(isinstance(my_list, Iterable)) # True
for i in my_list:
print(i)
第二種場景:假設一個對象沒有實現 __iter__()
,Python 解釋器 __getitem__()
方法獲取元素,如果可行,那么該對象也是一個可迭代對象。
from collections.abc import Iterable
class Array:
mylist = [0,1,2]
def __getitem__(self, item):
return self.mylist[item]
# 得到一個可迭代對象
my_list = Array()
print(isinstance(my_list, Iterable)) # False
for i in my_list:
print(i)
此時如果你使用 isinstance(my_list, Iterable)
去判斷是否是可迭代,就會返回 False,因為 isinstance 這種方法就是檢查對象是否有 __iter__
方法。這也論證了使用 isinstance(my_list, Iterable)
去判斷是否可迭代是不準確的。
4. 什么是迭代器
當你對一個可迭代對象使用 iter 函數后,它會返回一個迭代器對象,對于迭代器對象,我們可以使用 next 函數,去獲取元素,每執行一次,獲取一次,等到全部獲取完畢,會拋出 StopIteration 提示無元素可取。
>>> alist = [0, 1, 2, 3]
>>> gen = iter(alist)
>>> gen
>>> next(gen)
0
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
>>> next(gen)
Traceback (most recent call last):
File "", line 1, in
StopIteration
5. 迭代器協議
對比可迭代對象,迭代器
的內部只是多了一個函數而已 – __next__()
正因為有了它,我們才可以用 next 來獲取元素。
迭代器,是在可迭代的基礎上實現的。要創建一個迭代器,我們首先,得有一個可迭代對象。 現在就來看看,如何創建一個可迭代對象,并以可迭代對象為基礎創建一個迭代器。
from collections.abc import Iterator
class Array:
index = 0
mylist = [0,1,2]
# 返回該對象的迭代器類的實例
# 因為自己就是迭代器,所以返回self
def __iter__(self):
return self
# 當無元素時,必要拋出 StopIteration
def __next__(self):
if self.index <= len(self.mylist)-1:
value = self.mylist[self.index]
self.index += 1
return value
raise StopIteration
my_iterator = iter(Array())
print(isinstance(my_iterator, Iterator)) # output: True
print(next(my_iterator)) # output: 0
print(next(my_iterator)) # output: 1
print(next(my_iterator)) # output: 2
print(next(my_iterator)) # StopIteration
審核編輯:符乾江
-
python
+關注
關注
56文章
4823瀏覽量
86125 -
迭代器
+關注
關注
0文章
45瀏覽量
4435
發布評論請先 登錄
永磁同步電機二階迭代學習控制
Python中的迭代器與生成器
Python Connector for InterBase連接解決方案
使用Python實現xgboost教程
適用于MySQL和MariaDB的Python連接器:可靠的MySQL數據連接器和數據庫

評論