PYTHON 迭代器 可迭代物件

2022-06-05 20:30:10 字數 4471 閱讀 4159

通過重複執行的**處理相似的資料集的過程,並且本次迭代的處理資料要依賴上一次的結果繼續往下做,上一次產生的結果為下一次產生結果的初始狀態,如果中途有任何停頓,都不能算是迭代。

#

1) 非迭代例子

loop =0

while loop < 3:

print("

hello world!")

loop += 1

#2) 迭代例子

loop =0

while loop < 3:

print

(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

原因如下:

class

b(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就行了:

class

b(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()

print

(isinstance(a, iterable))#使用isinstance(obj, iterable)

可以檢測乙個類是否已經註冊到了iterable

或者實現了__iter__()

函式,print

(isinstance(a, iterator))

print

(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 函式呼叫並不斷返回下乙個值的物件。二 如...