python生成器和迭代器

2021-10-12 09:59:54 字數 4033 閱讀 7206

淺顯理解生成器與迭代器,等我期末考試結束回來深入了解一下

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 迭代器和生成器

迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退,不過這也沒什麼,因為人們很少在迭代途中往後退。另外,迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可...