迭代器 生成器 列舉物件的用法

2022-06-24 17:39:13 字數 4168 閱讀 6262

def

my_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__

()

print

(ele)

except

stopiteration:

print('

取完了'

)

break

自帶異常處理的while迴圈,自動獲取被迭代物件的迭代器物件

ls = [100,200,300,400,500]

iter_obj = ls.__iter__

()for ele in

iter_obj:

print

(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:

print

(v)

if v == 200:

break

#結果為

100200

obj = [100, 200, 300].__iter__

()print(obj.__iter__().__iter__().__iter__() is obj) #

true

可迭代物件.__iter__()得到的是該物件的迭代器物件

迭代器物件.__iter__().__iter__()得到的就是迭代器物件本身

1、生成器:就是乙個迭代器物件

包含yield關鍵字的函式就是生成器

該函式名()得到的是生成器物件,不會執行函式體

def

fn():

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:

print

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

print

(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...