魔法函式 iter 和 next

2021-09-26 08:23:09 字數 1982 閱讀 6761

通過iter()函式可以將有迭代能力的物件轉化成迭代器

可以通過collections類判斷乙個物件是iterable還是iterator

from collections import iterable, iterator

# 常見的iterable: list, dict

a = [1, 2, 4, 5]

isinstance(a, iterable) # true

isinstance(a, iterator) # fasle

b = iter(a)

isinstance(b, iterable) # true

isinstance(b, iterator) # true

迭代器是乙個可以記住遍歷位置的物件。(只能向前迭代不能後退)

迭代器是乙個可以被next()函式呼叫並不斷返回下乙個值的物件

有迭代能力的物件從集合的第乙個元素開始訪問,真到所有元素訪問完畢

# 兩者都可用for語句迭代元素

for i in a:

print(i)

for i in b:

print(i)

# iterator物件可用next()函式迭代元素(一直向後)

next(b) # 1

next(b) # 2

# 到最後無元素時,丟擲stopiteration異常

iter()函式主要對映類中__iter__函式

next()函式主要對映類中__next__函式

class a(object):

def __iter__(self):

print("返回乙個類b物件")

return b()

class b(object):

def __next__(self):

print(" you got me!!!!!!")

obj_a = a() # 類a例項

obj_b = b() # 類b例項

iter(obj) # 返回乙個類b物件

next(iter(obj)) # 返回乙個類b物件 you got me!!!!!!

乙個類實現了__iter__, 我們認為它有迭代能力,稱其為iterable.

乙個類同時實現了__iter__和__next__,稱其為iterator.

modify(obj_a)  # 當前物件為iterable

modify(obj_b) # 什麼都不是

class myrange(object):

def __init__(self, end):

self.start = 0

self.end = end

def __iter__(self):

return self

def __next__(self):

if self.start < self.end:

ret = self.start

self.start += 1

return ret

else:

raise stopiteration

m = myrange(5)

modify(m) # iterable, iterator

# 利用for語句迭代元素,會捕獲stopiteration異常並自動結束for

for i in m:

print(i)

# 利用next()函式迭代元素

print(next(a))

print(next(a))

print(next(a))

print(next(a))

print(next(a))

print(next(a)) # 其實到這裡已經完成了,我們在執行一次檢視異常

python的iter 與next 函式

list tuple等都是可迭代物件,我們可以通過iter 函式獲取這些可迭代物件的迭代器。然後我們可以對獲取到的迭代器不斷使 next 函式來獲取下 條資料。iter 函式實際上就是調 了可迭代物件的iter 法。li 11 22,33 44,55 li iter iter li next li ...

python之 iter 函式與 next

容器是用來儲存元素的一種資料結構,容器將所有資料儲存在記憶體中,python中典型的容器有 list,set,dict,str等等。class test def init self,data 1 self.data data def iter self return self def next se...

可迭代物件 iter 和 next

如果乙個類想被用於for in迴圈,類似list或tuple那樣,就必須實現乙個 iter 和 next 方法,該方法返回乙個迭代物件 然後,python的for迴圈就會不斷呼叫該迭代物件的 next 方法拿到迴圈的下乙個值,直到遇到stopiteration錯誤時退出迴圈 class fib ob...