一:什麼是迭代器協議
可迭代物件:實現了迭代器協議的物件(如何實現:物件內部定義乙個_iter_()方法)
協議是一種約定,可迭代物件實現了迭代器協議,python的內部工具(如for迴圈,sum,min函式等)使用迭代器協議訪問物件。
二:for迴圈機制
for迴圈機制的本質:迴圈所有物件,全部都是使用迭代器協議。
三:什麼是生成器
1. 生成器,可以理解為一種資料型別,這種資料型別自動實現了迭代器協議(其他的資料型別需要呼叫自己內建的_iter_方法),所以生成器就是可迭代物件。
2. 生成器分類:在python中有兩種表現形式(python有兩種不同的方式提供生成器)
生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結果,yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便於下次從它離開的地方繼續執行。
def
test()
:yield
1yield
2yield
3res=test(
)print
(res)
print
(res.__next__())
print
(res.__next__())
#結果:
# 1
# 2
生成器表示式:類似於列表推導,但是生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表。
laomuji=
('雞蛋%d'
%i for i in
range(10
))print
(laomuji)
print
(laomuji.__next__())
print
(laomuji.__next__())
print
(laomuji.__next__())
print
(next
(laomuji)
)print
(next
(laomuji)
)#結果:at 0x0000015f1262d8e0>
# 雞蛋0
# 雞蛋1
# 雞蛋2
# 雞蛋3
# 雞蛋4
3.列表解析:
'''
'''egg_list=
for i in
range(10
):'雞蛋%d'
%i)print
(egg_list)
#結果:['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4', '雞蛋5', '雞蛋6', '雞蛋7', '雞蛋8', '雞蛋9']
列表解析:l=[
'雞蛋%d'
%i for i in
range(10
)]print
(l)#結果:['雞蛋0', '雞蛋1', '雞蛋2', '雞蛋3', '雞蛋4', '雞蛋5', '雞蛋6', '雞蛋7', '雞蛋8', '雞蛋9']
#列表解析將即將生成的列表結果放前面,for迴圈放在後面
三元表示式:(三個操作,for迴圈前面是乙個,for迴圈是乙個,if條件這是乙個)
l1=[
'雞蛋%d'
%i for i in
range(10
)if i>5]
print
(l1)
#結果:['雞蛋6', '雞蛋7', '雞蛋8', '雞蛋9']
#沒有四元表示式
總結:
1.把列表解析的換成()得到的就是生成器表示式
2.列表解析與生成器表示式都是一種便利的變成方式,只不過生成器表示式更加節省記憶體
3.python不但使用迭代器協議讓for迴圈更加通用。大部分內建函式也是使用迭代器協議訪問物件的。例如,sum函式是python的內建函式,該函式使用迭代器協議訪問物件,而生成器實現了迭代器協議,所以,我們可以直接計算一系列值得和:
sum
(x**
2for x in
range(4
))
而不用多此一舉的先構造乙個列表:
sum
([x**
2for x in
range(4
)])
Python生成器與迭代器
生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...
python 迭代器與生成器
迭代器和生成器 print 1 in 1,2,3 print 1 not in 1,2,3 print 4 in print 4 not in 1,2,3 print x not in dlkjfxfei 可迭代物件 iterable 可以被next 函式呼叫並不斷返回下乙個值 知道沒有資料時丟擲s...
Python 迭代器與生成器
一 迭代器 理解迭代器需要搞清楚容器 container 迭代器協議 可迭代物件 iterable 迭代器 iterator 生成器 generator 1 容器 container 容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否...