5 迭代器和生成器

2022-08-02 08:57:14 字數 3685 閱讀 9112

目錄

二、生成器

三、推導式

可迭代物件:內部含有'__iter__' 方法的物件。

# 獲取乙個物件的所有方法:dir()

s1 = 'asdsad'

print(dir(s1))

print('__iter__' in dir(s1))

優點:儲存資料能直接顯示,比較直觀,

缺點:佔記憶體,不能直接取值(除去索引,key以外)

通過for迴圈取值的時候,先將可迭代物件轉換成迭代器,然後進行取值。

迭代器:內部含有'iter'方法並且含有'next'方法的物件就是迭代器。

str list tuple dict set range 檔案控制代碼 中只有檔案控制代碼是迭代器,剩下的那些資料型別都是可迭代物件。

# 可通過,下列2個print的結果都返回true時才是迭代器

l1 = [1,2,3,4]

print('__iter__' in l1 )

print('__next__' in l1)

l1 = [1, 2, 3, 4, 5, 6]

obj = l1.__iter__()

# 或者 obj=iter(l1) print(obj)

可迭代物件是不可以一直迭代取值的(除去用索引,切片以及key),轉化成迭代器就可以利用__next__()進行取值

l1 = [1, 2, 3,]

obj = l1.__iter__() # 或者 iter(l1)

# print(obj) # 返回乙個位址

ret = obj.__next__()

print(ret)

ret = obj.__next__()

print(ret)

ret = obj.__next__()

print(ret)

ret = obj.__next__() # stopiteration

迭代器利用next取值,乙個next對應乙個值,如果迭代器裡的值取完了,還要next就會報stopiteration錯誤。

l1 = [1, 2, 3, 4, 5]

# 1 將可迭代物件轉化成迭代器

obj = iter(l1)

# 2,利用while迴圈,next進行取值

while 1:

# 3,利用異常處理終止迴圈

try:

print(next(obj))

except stopiteration:

break

迭代器的優點:

迭代器缺點:

生成器本質就是迭代器,不同的是迭代器是python提供的,生成器要自己寫。

構造生成器的三種方式:

生成器函式:

return和yield的區別

def get_func():

li =

for i in range(1, 5001):

# 節省記憶體

def get_func():

for i in range(1, 5001):

yield f''

ret = get_func()

for i in range(222):

print(next(ret))

# 把列表變成迭代器

def func():

l1 = [1, 2, 3, 4, 5]

yield from l1 # 將l1變成了迭代器

ret1 = func()

print(next(ret1))

print(next(ret1))

yield from的簡單應用:他後面可以加可迭代物件也可以是迭代器或生成器。

# 使用yield

s1 = 'an'

li = [1,2,3,4]

dic =

dict1 =

def get_yield(*args):

for item in args:

for i in item:

yield i

print(list(get_yield(s1, li, dic)))

# ['a', 'n', 1, 2, 3, 4, 'name', 'age']

# 使用yield from

這裡的g1和g2是空的。

def func():

print(111)

yield 222

g = func() # 生成器

g1 = (i for i in g)

g2 = (i for i in g1)

print(list(g)) # 回取出func中的資料,列印111,獲取222

print(list(g1)) # 獲取g1的資料,g1的資料**是g,但是g已經取完了,g1也就沒有資料了

print(list(g2)) # 和g1同理

生成器函式() -->返回的是乙個位址

# 列表推導式習題

# 求(x,y)其中x是0-5之間的偶數,y是0-5之間的奇數組成的元祖列表

# 輸出[(0, 1), (0, 3), (0, 5), (2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)]

# print([(x, y) for x in range(0,6,2) for y in range(1,6,2)])

優點:

#  迴圈模式

l1 = [i for i in rang(1, 11)]

l2 = [i**2 for i in range(10)]

# 篩選模式

# 30以內的被3整除

# print([i for i in range(0, 31) if i%3 == 0])

# 過濾掉長度小於3的字串列表,並將剩下的轉換成大寫字母

l1 = ['barry', 'ab', 'an', 'qwers', 'qwepopo']

# print([i.upper() for i in l1 if len(i) >= 3 ])

與列表推導式的寫法幾乎一模一樣,也有篩選模式,迴圈模式,多層迴圈構建。寫法上只有乙個不同:

換成 ()

列表的推導式和生成器的區別

生成器表示式和列表推導式的區別:

字典推導式

lst1 = ['an','bn','cn']

lst2 = ['aa','bb','cc']

dic =

print(dic) # -->

集合推導式

lst = [1,2,3,4,5,6,7]

s =

print(s)

集合推導式可以幫我們直接生成乙個集合,集合的特點;無序,不重複 所以集合推導式自帶去重功能

生成器和迭代器

可以直接作用於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...

生成器和迭代器

1.iterator 迭代器 舉例 我們對list使用for for i in 1,2,3,4 print i 12 34對string物件使用for for ch in python print ch py thon對字典物件使用for for k in print k yx對檔案使用for fo...