defmy_generator():
print(1111)
yield
'結果1
'print(2222)
yield
'結果2
'print(3333)
yield
'結果3
'print(4444)
yield
'結果4
'g_obj = my_generator() #
my_generator()並不會執行函式體,得到的返回值就是生成器物件,生成器物件就是迭代器物件
r1 = g_obj.__next__
()print(r1) #
在函式內部執行一次,在遇到下乙個yield時停止,且可以拿到yield的返回值
r2 = g_obj.__next__
()print(r2) #
#生成器可以被for迴圈迭代
for v in
g_obj:
print(v)
ls = [100, 200, 300, 400, 500] #被遍歷的物件必須是有序容器
i =0
while i print
(ls[i])
i += 1通過迭代器取值優缺點:
優點:不依賴索引完成取值
缺點:不能計算長度,不能指定位置取值(只能從前往後逐一取值)
有哪些:str、list、tuple、dict、set、range()、file、迭代器物件、enmerate()、生成器
.__iter__()().__iter__()
{}.__iter__()
{}1,}.__iter__()
可迭代物件通過__iter__方法得到迭代器物件
通過該方法獲得容器中的值,獲取規則,從前往後,一次乙個。
迭代器物件可以做到不依賴索引取值(一次從容器中取出乙個值)
有哪些:file、ensumerate()、生成器
從迭代器物件中取元素,取乙個少乙個,如果要從頭開始取,需要重新獲得擁有所有元素的迭代器物件
迭代器物件也有__iter__()方法,呼叫後得到的是自己本身
(當前含有幾個元素,得到的就只有幾個元素的迭代器物件)
#可迭代物件
ls = [1,2,3,4,5]
#迭代器物件
iter_obj = ls.__iter__
()print(iter_obj) #
print([1,2,3,4,5].__iter__()) #
結果為
#迭代器物件取乙個值就少乙個值
ls = [100, 200, 300, 400, 500]
iter_obj = ls.__iter__
()print(iter_obj.__next__()) #
100print(iter_obj.__next__()) #
200print(iter_obj.__next__()) #
300print(iter_obj.__next__()) #
400print(iter_obj.__next__()) #
500#
print(iter_obj.__next__()) # 值取完了就拋異常stopiteration,可以通過try對異常捕獲並處理
#上乙個迭代器物件迭代取值完畢後,就取空了,如果要再次取值,要重新生成迭代器物件
#iter_obj =ls.__iter__()
#迭代器物件不能求長度(內部值的個數)
ls = [100,200,300,400,500]
iter_obj = ls.__iter__
()while
true:
try:
ele = iter_obj.__next__
()
(ele)
except
stopiteration:
print('
取完了'
)
break
自帶異常處理的while迴圈,自動獲取被迭代物件的迭代器物件
ls = [100,200,300,400,500]iter_obj = ls.__iter__
()for ele in
iter_obj:
(ele)
for ele in ls: #
1.自動完成 for ele in st1.__iter__(): 2.自動完成異常處理
print(ele)
①可迭代物件:有__iter__()方法的物件,採用該方法可以得到迭代器物件
②迭代器物件:有__next__()方法的物件,用該方法可以從可迭代物件中一次獲取乙個值,取出乙個少乙個
③for迴圈迭代器:
自動獲取被迭代物件的迭代器物件
在內部一次次呼叫__next__()方法取值
自動完成異常處理
obj = [100, 200, 300].__iter__()for v in
obj:
(v)
if v == 200:
break
#結果為
100200
obj = [100, 200, 300].__iter__
()print(obj.__iter__().__iter__().__iter__() is obj) #
true
可迭代物件.__iter__()得到的是該物件的迭代器物件
迭代器物件.__iter__().__iter__()得到的就是迭代器物件本身
1、生成器:就是乙個迭代器物件
包含yield關鍵字的函式就是生成器
該函式名()得到的是生成器物件,不會執行函式體
deffn():
print('
我是生成器')
yield
'god
'generator_obj =fn()
print(generator_obj) #
結果為
print(type(generator_obj)) #
結果為
generator_obj.
__iter__() #
可迭代物件
generator_obj.__next__() #
迭代器物件
當訪問的資料資源過大,可以將資料用生成器處理,一次只獲取所有內容的一條資源
def my_range(min,max=0,step=1):tag =min
while
true:
if tag >=max:
break
yield
tag tag +=step
range_obj = my_range(5, 10,1)
for i in
range_obj:
print(i)
通過for迭代器,迴圈遍歷可迭代物件,需要知道迭代的索引
ls = [100, 200, 300, 400, 500]count =0
for v in
ls:
(count,v)
count +=1
#結果為
0 100
1 200
2 300
3 400
4 500
ls = [100,200,300,400,500]
for count, v in
enumerate(ls):
(count, v)
#結果為
0 100
1 200
2 300
3 400
4 500
4 3(迭代器,迭代器物件,生成器,列舉物件)
器 包含多個值的容器。迭代 迴圈反饋 一次從容器中取出乙個值 迭代器 從裝有多個值的容器中一次取出乙個值給外界。迴圈反饋的容器,不同於索引取值,但也可以從容器物件從前往後逐個返回內部的值。迭代是乙個重複的過程,每次重複就為一次迭代,每次迭代的結果都是下一次迭代的初始值。優點 不能依賴索引,完成取值。...
可迭代物件 迭代器,生成器
可迭代物件 iterator 列表 集合 元組 字典 字串 生成器 我們可以使用isintance 判斷乙個物件是否是iterator物件 生成器 通過列表生成式,我們可以直接建立乙個列表,但是,受到記憶體限制,列表容量肯定是有限的,如果我們僅僅需要訪問前面幾個元素,如果列表元素可以按照某種演算法推...
可迭代物件 迭代器 生成器
可迭代物件 for迴圈機制 迭代器生成器 總結type所返回的型別是例項物件的類物件,而isinstance所進行的判斷則包含了例項物件的類物件及其父類。如圖 可迭代物件 迭代器 生成器所屬的型別分別為collections包裡的iterable,iterator,generator.實現了 ite...