一、迭代器
現在已知的可迭代物件:
str list tuple dict set range和檔案控制代碼。
但是,什麼是可迭代物件?可迭代物件的測量方法。
方法一: dir(被測物件) 如果 他含有__iter__ ,那這個物件就叫做可迭代物件.
下面字串s就是可迭代物件:
s= 'abcdef'print('__iter__' in dir(s))
可迭代物件,iterable 與迭代器有什麼關係?可迭代物件可以轉換成迭代器(可迭代物件.__iter__()
)。
s1 = s.__iter__()print(s1) #iterator 遵循迭代器協議
迭代器的取值:(迭代器.__next__())
#迭代器取值:s2 = 'abcd'
s3 = s2.__iter__()
print(s3.__next__()) #a
print(s3.__next__()) #b
只含有__iter__方法的資料是可迭代物件,含有__iter__方法,並且含有__next__方法的資料是迭代器
#迭代器的判斷:有__iter__方法,並且含有__next__方法的資料是迭代器方法二:測量他是可迭代的還是迭代器:l = [1,2,3,4]
print('__iter__' in dir(l)) #true
print('__next__' in dir(l)) #false
liter = l.__iter__()
print('__next__' in dir(liter)) #true
print(liter.__next__()) #1
print(liter.__next__()) #2
print(liter.__next__()) #3
print(liter.__next__()) #4
# 方法二 測試他是迭代器還是可迭代物件迭代器的意義:l = [1,2,3]
l_iter = l.__iter__()
from collections import iterable
from collections import iterator
print(isinstance(l,iterable)) #true
print(isinstance(l,iterator)) #false
print(isinstance(l_iter,iterator)) #true
print(isinstance(l,list)) #true
1)、迭代器節省記憶體.
2)、迭代器惰性機制.
3)、迭代器不能反覆,一直向下執行.
for 迴圈的內部機制:
1)、內部含有__iter__方法,他會將可迭代物件先轉化成迭代器.
2)、然後在呼叫__next__方法.
3)、for迴圈有異常處理的方法.
#用迭代器來表示for迴圈的內部機制二、生成器for i in [1,2,3]:
print(i)
l = [1,2,3]
l_iter = l.__iter__()
while true:
try:
print(l_iter.__next__())
except stopiteration:
break
什麼是生成器?
生成器是一次生成乙個值的特殊型別函式。可以將其視為可恢復函式。呼叫該函式將返回乙個可用於生成連續 x 值的生成器【generator】
簡單的說就是在函式的執行過程中,yield語句會把你需要的值返回給呼叫生成器的地方,然後退出函式,下一次呼叫生成器函式的時候
又從上次中斷的地方開始執行,而生成器內的所有變數參 數都會被儲存下來供下一次使用。
生成器的本質就是迭代器,生成器是自己用python**寫的迭代器。
1)、可以用生成器函式;
2)、可以用各種推導式構建迭代器;
3)、可以通過資料轉化。
生成器函式:
#生成器函式 生成器return yield 區別:def gener():
print('aaa')
yield 222
print('bbb')
yield 333
print('ccc')
g = gener()
print(g) #print(g.__next__()) #aaa
#222
print(g.__next__()) #bbb
#333
return 返回給呼叫者值,並結束此函式.
yiled 返回給呼叫者值,並將指標停留著當前位置.
def func():send和next:for i in range(10):
yield i
g_func = func()
for i in range(3):
print(g_func.__next__()) #0 1 2
for i in range(3):
print(g_func.__next__()) #3 4 5
1)、send 具有和next一樣的功能;
2)、send給上乙個yiled 整體傳送乙個值;
3)、send不能給最後乙個yield傳送值;
4)、獲取第乙個值的時候,不能用send 只能用next。
def gener():列印結果:yield 222#aaa
count = yield 333
print('-------->',count)
yield 'aaa'#none
yield 'bbb'
g = gener()
print(g.__next__())#222
print(g.send('aaa'))
print(g.send(none))
print(g.send('aaaa'))
222列印結果333-------->none
aaabbb
Python迭代器和生成器
先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...
Python迭代器和生成器
迭代器是訪問集合元素的一種方法 是可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問 他有兩個基本的方法,iter 和next 字串,列表或遠足物件都可以用於建立迭代器 list1 1,2,3,4 it1 iter list1 建立迭代器物件 print next ...
python 迭代器和生成器
迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退,不過這也沒什麼,因為人們很少在迭代途中往後退。另外,迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可...