可迭代物件:內部含有『__iter__』方法的物件
優點:儲存的資料可以直接顯示,比較直觀
擁有的方法比較多
缺點:占用記憶體
不能直接for迴圈取值,是通過內部轉化成迭代器
#dir():獲取乙個物件的所有方法
s1 = '
abcde
'print(dir(s1)) #
輸出乙個list,內容是s1物件的所有方法,每個方法以字串形式輸出
print('
__iter__
'in dir(s1)) #
判斷乙個物件是否是可迭代物件
'''迭代器:內部含有'__iter__'並且含有'__next__'方法的物件就是迭代器
因為迭代器的內部含有'__next__'方法,所有可以通過for迴圈取值
判斷乙個物件是否是迭代器:'__iter__' in dir(f1) and '__next__' in dir(f1)
利用iter(object)/object.__iter__()形成乙個迭代器,對迭代器進行操作可以節省記憶體
利用next(object)/object.__next__()取值,一次只取乙個
迭代就是資料處理的基石,掃瞄記憶體中放不下的資料集時,我們要找到一種惰性獲取資料項的方式,即按需一次獲取乙個資料項,這就是迭代器模式
優點: 節省記憶體
缺點: 不能直觀的檢視裡面的資料
速度慢取值不能回頭
'''
可迭代物件轉化成迭代器
s = [11,22,33,44]obj = s.__iter__() #
等同於iter(s),利用s形成乙個迭代器,賦值給obj
print(s) #
[11, 22, 33, 44]
print(obj) #
s = [11,22,33,44]
obj = s.__iter__
()print(obj.__next__()) #
11,等同於next(obj),迭代器利用 '__next__()'方法取值,一次只取乙個值
print(next(obj)) #
22print(obj.__next__()) #33#
利用while迴圈 模擬for迴圈對可迭代物件取值
s = [11,22,33,44,55,66,77,88]
obj =iter(s)
while 1:
try:
(next(obj))
except
stopiteration:
break
s = [11,22,33,44,55,66,77,88,99]
obj =iter(s)
for i in range(4):
(next(obj))
for j in range(4):
print(obj.__next__())
生成器:可以用迭代器看著是一種, 生成器的本質就是迭代器
生成是我們自己用python**構建的資料結構,迭代器是python提供的,或者轉化來的
獲取生成器三種方式:
通過生成器函式自己寫
通過生成器表示式自己寫
python內部提供
#只要函式中有 yield,那麼它就是生成器函式,乙個生成器函式可以存在多個yield
#yield不會結束函式的執行,只是暫停函式
deffun():
print(111)
yield 3 #
乙個next(),**就會執行到這裡,並且將3返回,後面的**不執行,直到下乙個next()
print(222)
yield 4ret = func() #
因為函式中有yield,所以是生成器函式,所以這裡並不會執行函式中的**
print(ret) #
生成器物件
print(next(ret)) #
111 3 生成器中乙個next,對應乙個yield,
print(next(ret)) #
第乙個yield執行完,就會執行這裡的next,接著執行函式中第乙個yield後面的**
#吃包子例子
deffunc():
for i in range(1,50):
yield f'
號包子'
ret =func()
for i in range(10):
print(next(ret))
deffunc():
l1 = [1,2,3,4,5]
yield
l1ret =func()
print(ret) #
print(next(ret)) #
[1, 2, 3, 4, 5]
deffunc1():
l2 = [1,2,3,4,5]
yield
from l2 #
yield from 將list 變成乙個生成器
ret = func1() #
返回乙個生成器物件賦值給ret
for i in ret: #
利用for迴圈對生成器物件直接取值,
(i)
deffunc():
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,0]
yield
from
list1
yield
from
list2
ret =func()
for i in
ret:
print(i) #
1 2 3 4 5 6 7 8 9 0
生成器表示式 獲取生成器
ret = (i for i in range(1,11))print(ret) #
at 0x00000000023e8570>
for i in
ret:
print(i)
讓生成器產出值的三種方式:next(),for迴圈,list(),本質都是呼叫next()
#list(generator) ,將生成器物件轉化成list
def chain(*iterables):
for it in
iterables:
for i in
it: yiled i
ret = chain('
abc',(1,2,3))
print(ret) #
print(list(ret)) #
['a', 'b', 'c', 0, 1, 2]
def chain(*iterables):
for it in
iterables:
yield
from
itret = chain('
abc',(1,2,3))
print(list(ret)) #
['a', 'b', 'c', 0, 1, 2]
Python 迭代器 生成器
可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...
python 迭代器,生成器
什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...
python 迭代器 生成器
知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...