迭代
迭代是重復反饋程序的活動,其目的通常是為了逼近所需目標或結果,每一次對程序的重復稱為一次“迭代”,而每一次迭代得到的結果會作為下一次迭代的初始值,
重復執行一系列運算步驟,從前面的量依次求出后面的量的程序,此程序的每一次結果,都是由對前一次所得結果施行相同的運算步驟得到的,例如利用迭代法*求某一數學問題的解,
對計算機特定程式中需要反復執行的子程式*(一組指令),進行一次重復,即重復執行程式中的回圈,直到滿足某條件為止,亦稱為迭代
(以上內容來自百度百科)
可迭代物件
我們已經知道,可以直接作用于for回圈的資料型別有以下幾種:
一類是集合資料型別,如list、tuple、dict、set、str等;
一類是generator(生成器),包括生成器和帶yield的generator function(生成器函式),
這些可以直接作用于for回圈的物件統稱為可迭代物件:Iterable,
可以使用isinstance()判斷一個物件是否是Iterable:
from collections.abc import Iterable
print(isinstance([], Iterable))
# True
print(isinstance({}, Iterable))
# True
print(isinstance('abc', Iterable))
# True
print(isinstance((x for x in range(10)), Iterable))
# True
print(isinstance(100, Iterable))
# False
迭代器
而生成器不但可以作用于for回圈,還可以被next()函式不斷呼叫并回傳下一個值,直到最后拋出StopIteration錯誤表示無法繼續回傳下一個值了,
可以被next()函式呼叫并不斷回傳下一個值的物件稱為迭代器:Iterator,
可以使用isinstance()判斷一個物件是否是Iterator:
from collections.abc import Iterator
print(isinstance((x for x in range(10)), Iterator))
# True
print(isinstance([], Iterator))
# False
print(isinstance({}, Iterator))
# False
print(isinstance('abc', Iterator))
# False
生成器都是Iterator物件,但list、dict、str雖然是Iterable,卻不是Iterator,
iter()函式
把list、dict、str等Iterable變成Iterator可以使用iter()函式:
from collections.abc import Iterator
print(isinstance(iter([]), Iterator))
# True
print(isinstance(iter('abc'), Iterator))
# True
你可能會問,為什么list、dict、str等資料型別不是Iterator?
這是因為Python的Iterator物件表示的是一個資料流,Iterator物件可以被next()函式呼叫并不斷回傳下一個資料,直到沒有資料時拋出StopIteration錯誤,可以把這個資料流看做是一個有序序列,但我們卻不能提前知道序列的長度,只能不斷通過next()函式實作按需計算下一個資料,所以Iterator的計算是惰性的,只有在需要回傳下一個資料時它才會計算,
__iter__()和__next__()
# 迭代器 擁有__iter__()和__next__()方法
# 先將可迭代物件賦值一個新的變數轉成迭代器
# 每次都回傳一個值
# 一個__next__()對應一個輸出結果
s = "1234"
new_s = s.__iter__()
print(new_s.__next__())# 輸出1
print(new_s.__next__())# 輸出2
# 變數名 = 可迭代物件
# 新賦值的變數名 = 變數名.__iter__() # 裝成迭代器
# print(新賦值的變數名.__next__())
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/276927.html
標籤:其他
上一篇:Go語言開發筆記
