迭代器和生成器的原理以及使用

2021-08-29 20:21:23 字數 2486 閱讀 4809

**

我們每次用for迴圈取值,具體for迴圈是是怎麼實現的呢?

我們知道列表、字典、集合、字串都可以用for迴圈取值,而乙個數字為什麼不行呢

for迴圈也是有要求的,首先能迴圈取值的必須是乙個可迭代物件,看下面例子:

from collections import iterable

a ="abc"

print

(isinstance

(a, iterable)

)# 判斷是不是乙個可迭代的物件,返回true就是可迭代物件,所以能用for迴圈

再看乙個例子:

a =

1234

for i in a:

# 這裡會報錯:typeerror: 'int' object is not iterable

print

(a)

意思就是int不是乙個可迭代物件

print(isinstance(a, iterable)) # 返回false,所以不能用for迴圈

下面有3個變數

iter=[

1,2,

3,4,

5,6]

iter_1 =[1

,2,3

,4,5

,6].__iter__(

)iter_3 =

.__iter__(

)print

(type

(iter))

# 發現型別是乙個列表

print

(type

(iter_1)

)# 發現型別是乙個列表迭代器list_iterator

print

(type

(iter_3)

)# 發現型別是乙個字典迭代器dict_keyiterator

所以後面加上__iter__就是將乙個可迭代的物件變成了乙個迭代器

for迴圈就是在執行之前可迭代物件加了__iter__,變成了迭代器,然後一一去取值,那麼怎麼取值呢,就是用__next__

#乙個乙個的取值

print

('---'

, iter_1.__next__())

print

('---'

, iter_1.__next__(

))

如果取值時超出了迭代器的值,就會報乙個stopiteration錯誤(比如迭代器有2個值,但是用了3個__next__),所以這裡要想取所有值並且不報錯,就可以死迴圈取值和斷言

iter

=.__iter__(

)while

true

:try

: item = l_iter.__next__(

)print

(item)

except stopiteration:

break

這樣其實就相當於模擬了for迴圈

python中提供的生成器:

1.生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行

2.生成器表示式:類似於列表推導,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表

def

fun1()

: a =

1print

('定義a變數'

)yield a

b =2print

('定義b變數'

)yield b

f1 = fun1(

)print

('f1 : '

, f1)

# 列印f1發現f1就是乙個生成器

print

('-'*20

)print

(next

(f1)

)#print(next(f1))

生成器表示式:

1、a = [「a%s」 % i for i in range(10)] # 如果range(100000),很占用記憶體

print(a)# 是生成乙個列表

結果:[『a0』, 『a1』, 『a2』, 『a3』, 『a4』, 『a5』, 『a6』, 『a7』, 『a8』, 『a9』]

2、a = (『a%s』 % i for i in range(10)) #生成器表示式, 如果range(100000),不占用記憶體,因為沒有生成,真正用時才會根據演算法生成。

print(a)

結果:# 返回的是乙個生成器的記憶體位址

print(next(a))

print(a.next())# 和next一樣,都是取值

把列表解析的換成()得到的就是生成器表示式

python迭代器以及生成器

iter 迭代器 每一次輸出下乙個值 a iter range 10 a.next a.next a.next 可以用捕獲異常來排除超出迭代範圍,或者判斷長度 try 1 0 except print error occur error occur 如 encoding utf 8 a iter r...

生成器和迭代器

可以直接作用於for迴圈的物件稱為可迭代物件 iterable.可以用isinstance 判斷乙個物件是否是iterable物件。isinstance iterable true isinstance iterable true isinstance 235,iterable false 而生成器...

迭代器和生成器

1 迭代器的概念 print dir 告訴我列表的所有用法 有雙下劃線的所有方法叫做雙下方法,是c語言已經寫好的方法。你可以用不止一種方法呼叫它。列表的用法變集合 set dir 求交集 set dir set dir set dir 求列表,字典,字串它們的用法的交集 他們共同的用法 iterab...