淺顯理解生成器與迭代器,等我期末考試結束回來深入了解一下
2020.12.19
生成器本質上就是乙個函式,它記住了上一次返回時在函式體中的位置。構造乙個生成器:對生成器函式的第二次(或第n次)呼叫,跳轉到函式上一次掛起的位置。
記錄了程式執行的上下文。
生成器不僅「記住」了它的資料狀態,還記住了程式執行的位置
生成器一定是可迭代的,也一定是迭代器物件
使用yield關鍵字把乙個函式變成乙個生成器, 帶有yield的函式不再是乙個普通的函式。python直譯器會將其視為乙個generator。yield類似return的作用,每次執行函式遇到yield即返回,下次呼叫函式時候從函式上次掛起的位置開始執行。
def
fib(
max)
: n =
0 b =
1while n <
max:
yield b
b +=
1 n = n +
1return
100a = fib(3)
print
(type
(a))
print
(list
(a))
for item in fib(3)
:print
(item)
結果:
注意:最後return的100沒有儲存到
迭代是訪問集合元素的一種方式。可迭代的物件:迭代器是乙個可以記住遍歷的位置的物件。
迭代器物件從集合的第一 個元素開始訪問,直到所有的元素被訪問完結束。
迭代器只能往前不會後退。
集合資料型別:如 list 、 tuple 、 dict 、 set 、 str 等;generator :包括生成器和帶 yield 的generator function。
這些可以直接作用於 for 迴圈的物件統稱為可迭代物件:iterable。
from collections.abc import iterable, iterator
print
(isinstance
(, iterable)
)# true
print
(isinstance([
], iterable)
)# true
print
(isinstance((
), iterable)
)# true
print
(isinstance
("abc"
, iterable)
)# true
print
(isinstance
((x for x in
range(5
)), iterable)
)# true
迭代器:可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器:iterator。可以使用 isinstance() 判斷乙個物件是否是 iterator 物件注意迭代物件不一定都是迭代器,集合型別就不是迭代器
from collections.abc import iterable, iterator
print
(isinstance
(, iterator)
)# false
print
(isinstance([
], iterator)
)# false
print
(isinstance((
), iterator)
)# false
print
(isinstance
("abc"
, iterator)
)# false
print
(isinstance
((x for x in
range(5
)), iterator)
)# true
next函式next(iterobject,defalt)第乙個引數是可迭代的物件,第二個引數可以寫也可以不寫,不寫的時候,如果可迭代的元素取出完畢,會返回stopiteration異常,第二個引數寫的時候,當可迭代物件迭代完後,會返回一直返回第二個引數寫的那個元素。
from collections import iterator
deffib
(max):
n =0 b =
1while n <
max:
yield b
b +=
1 n = n +
1return
100a = fib(2)
print
(next
(a))
# 1print
(next
(a))
# 2print
(isinstance
(fib(2)
, iterator)
)# true
from collections.abc import iterable, iterator
print
(isinstance
(iter()
, iterator)
)# true
print
(isinstance
(iter([
]), iterator)
)# true
print
(isinstance
(iter((
)), iterator)
)# true
print
(isinstance
(iter
("abc"
), iterator)
)# true
print
(isinstance
((x for x in
range(5
)), iterator)
)# true
題目:使用生成器編寫**,**實現功能:不斷生成楊輝三角的每一行
def
********s()
: array =[1
]while
true
:yield array
array =[0
]+ array +[0
] array =
[(array[i]
+ array[i +1]
)for i in
range
(len
(array)-1
)]a = ********s(
)i =
0while i <10:
print
(next
(a))
i +=
1
結果:
Python迭代器和生成器
先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...
Python迭代器和生成器
迭代器是訪問集合元素的一種方法 是可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問 他有兩個基本的方法,iter 和next 字串,列表或遠足物件都可以用於建立迭代器 list1 1,2,3,4 it1 iter list1 建立迭代器物件 print next ...
python 迭代器和生成器
迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退,不過這也沒什麼,因為人們很少在迭代途中往後退。另外,迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可...