通過重複執行的**處理相似的資料集的過程,並且本次迭代的處理資料要依賴上一次的結果繼續往下做,上一次產生的結果為下一次產生結果的初始狀態,如果中途有任何停頓,都不能算是迭代。
#1) 非迭代例子
loop =0
while loop < 3:
print("
hello world!")
loop += 1
#2) 迭代例子
loop =0
while loop < 3:
(loop)
loop += 1
容器僅僅只是用來存放資料的,我們平常看到的 l = [1,2,3,4]等等,好像我們可以直接從列表這個容器中取出元素,但事實上容器並不提供這種能力,而是可迭代物件賦予了容器這種能力。
實現了__iter__()就行;
可迭代物件並不是指某種具體的資料型別,它是指儲存了元素的乙個容器物件。
乙個可迭代物件是不能獨立進行迭代的,python中,迭代是通過for ... in來完成的。凡是可迭代物件都可以直接用for… in…迴圈訪問,這個語句其實做了兩件事:第一件事是呼叫__iter__()獲得乙個可迭代器,第二件事是迴圈呼叫__next__()。
常見的可迭代物件包括:a)集合資料型別,如list、tuple、dict、set、str等;b)生成器(generator)
迭代器可以看作是乙個特殊的物件,每次呼叫該物件時會返回自身的下乙個元素,從實現上來看,乙個迭代器物件必須是定義了__iter__()方法和next()方法的物件。
系統的for i in 可迭代器or可迭代物件:... 這個最後有個stopiteration 異常來檢驗是否結束迭代;
>>> a = [1,2,3]>>> b =iter(a)
>>>b
>>> b.__next__()1
>>> b.__next__()2
>>> b.__next__()3
>>> b.__next__
()traceback (most recent call last):
file
"", line 1, in
b.__next__
()stopiteration
原因如下:
classb(object):
def__next__
(self):
raise
stopiteration
class
a(object):
def__iter__
(self):
pass
return b()#
return b()
#a這個類實現了乙個__iter__函式,返回的是b()的例項物件,其中b裡面實現了__next__這個函式。
from collections.abc import *a =a()
b =b()
print(isinstance(a, iterable))#
因為有__iter__ 所以其是乙個可迭代物件iterable
print(isinstance(a, iterator))#
因為沒有__next__ 所以不是乙個迭代器iterator
print(isinstance(b, iterable))#
因為沒有__iter__,所以不是乙個可迭代物件
print(isinstance(b, iterator))#
因為沒有__iter__ ,所以不是乙個迭代器
#output
true
false
false
false
>>>
這樣b就行了:
classb(object):
def__next__
(self):
raise
stopiteration
def__iter__
(self):
return
none
class
a(object):
def__iter__
(self):
return
b()from collections.abc import *a =a()
b =b()
(isinstance(a, iterable))#使用
isinstance(obj, iterable)
可以檢測乙個類是否已經註冊到了
iterable
或者實現了
__iter__()
函式,print
(isinstance(a, iterator))
(isinstance(b, iterable))
print(isinstance(b, iterator))
#output:
true
false
true
true
raise:
try: a = input("
輸入乙個數:")
#判斷使用者輸入的是否為數字
if(not
a.isdigit()):
raise valueerror("
a 必須是數字")
except
valueerror as e:
print("
引發異常:
",repr(e)) #repr() 函式將物件轉化為供直譯器讀取的形式。
#任何python序列都可迭代的原因是,他們都實現了__getitem__方法。其實,標準的序列也都實現了 __iter__方法。
>>>dir(list)['__add__
', '
__class__
', '
__contains__
', '
__delattr__
', '
__delitem__
', '
__dir__
', '
__doc__
', '
__eq__
', '
__format__
', '
__ge__
', '
__getattribute__
', '
__getitem__
', '
__gt__
', '
__hash__
', '
__iadd__
', '
__imul__
', '
__init__
', '
__init_subclass__
', '
__iter__
', '
__le__
', '
__len__
', '
__lt__
', '
__mul__
', '
__ne__
', '
__new__
', '
__reduce__
', '
__reduce_ex__
', '
__repr__
', '
__reversed__
', '
__rmul__
', '
__setattr__
', '
__setitem__
', '
__sizeof__
', '
__str__
', '
__subclasshook__
', '
', '
clear
', '
copy
', '
count
', '
extend
', '
index
', '
insert
', '
pop', '
remove
', '
reverse
', '
sort
']
raise:
repr:
__getitem__():
python迭代 可迭代物件與迭代器物件
問題舉例 某軟體要求,從網路抓取各個城市的氣溫資訊,並依次顯示 北京 15 22 上海 18 23 如果一次抓取所有城市氣溫資訊再顯示,顯示第乙個城市的氣溫時會由很長的延時,並且浪費儲存空間,我們期望以 用時訪問 的策略,並且把所有城市的氣溫資訊封裝 到乙個物件裡,可用for語句進行迭代。來個栗子 ...
迭代器 可迭代物件 迭代器物件
今天的學習內容有 迭代器 可迭代物件 迭代器物件 for迴圈內部原理 生成器和生成器表示式 面向過程程式設計 迭代就是指更新換代的過程,要重複進行,而且每次的迭代都必須基於上一次的結果。我們使用for迴圈的時候就是把元素從容器裡乙個個取出來,這種過程其實就是迭代。迭代器 迭代取值的工具。迭代器的作用...
可迭代物件 迭代器
一 可以直接作用於for迴圈的資料型別 1.可迭代物件 iterable 1 整合資料型別 list tuple dict set str 2 生成器 generator 3 帶yield的generator函式 2.迭代器 iterator 可以被next 函式呼叫並不斷返回下乙個值的物件。二 如...