python迭代器與生成器

2022-08-11 16:27:13 字數 4232 閱讀 8336

以下都是我自學python整理的筆記,以便幫助學習。

1.容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個的迭代獲取,可以用in,not in關鍵字判斷元素是否在容器中。通常這類資料結構把所有的元素儲存在記憶體中(也有一些特例並不是把所有的元素存在記憶體,比如迭代器和生成器物件)在python中,常見的容器物件有:list,set,dict,tuple,str...

2.儘管絕大多數容器都提供了某種方式來獲取其中的每乙個元素,但這並不是容器本身提供的能力,而是**可迭代物件**賦予了容器這種能力,當然並不是所有的容器都是可迭代的,比如:[bloom filter],雖然bloom filter可以用來檢測某個元素是否包含在容器中,但是並不能從容器中獲取其中的每乙個值,因為bloom filter壓根就沒把元素儲存在容器中,而是通過乙個雜湊函式對映成乙個值儲存在陣列中。

1.許多容器都是可迭代物件,但也有很多不是容器的物件也是可迭代物件,比如處於開啟狀態的files,socket等。

2.可迭代物件都具有__iter__函式,並且可迭代物件通過iter()函式會返回乙個迭代器,迭代器內部具有乙個狀態,該狀態用於記錄當前迭代所在的位置方便下一次迭代。

3.迭代器有一種具體的迭代器型別,比如list_iterator,set_iterator。可迭代物件實現了__iter__方法,該方法返回乙個迭代器物件。

1.迭代器是一種帶狀態的物件,它能在你呼叫next()方法的時候返回容器中的下乙個值,任何實現了__iter__和__next__方法的物件都是迭代器,__iter__返回迭代器本身,__next__返回容器中的下乙個值,當遍歷到最後乙個值,沒有元素的時候會丟擲stopiteration異常。

2. itertools函式返回的都是迭代器物件。

3.迭代器不會一次性把所有元素載入到記憶體,而是需要的時候才生成返回結果。迭代器就像乙個懶載入的工廠,等到有人需要的時候才給它生成值返回,沒呼叫的時候就處於休眠狀態等待下一次呼叫。

4.三種常見的迭代器:

(1)無限迭代器,

這個可以理解成一條無限延長的直線。

itertools模組下的count(start)函式,star為起點。

help(itertools.count)#檢視幫助文件 

count(start=0, step=1) -->count object

| return a count object whose .__next__

() method returns consecutive values.

def count(firstval=0, step=1):

| x =firstval

| while 1:

| yield

x | x += step

例子:

import

itertools

>>> counter = itertools.count(start=2)

>>>next(counter)

2>>>next(counter)

3>>>next(counter)

4

(2)通過乙個有限序列生成無限迭代器,這個可以理解為是乙個圓,無限遍歷。

itertools下的cycle(iterable)函式,引數是乙個可迭代物件。

help(itertools.cycle)

cycle(iterable) -->cycle object

| return elements from the iterable until it is

exhausted.

|then repeat the sequence indefinitely. #

從可迭代物件取出所有的元素然後無限迴圈

例子:

>>> from itertools import

cycle

>>> colors = cycle(['

red','

white

','blue'])

>>>next(colors)

'red

'>>>next(colors)

'white

'>>>next(colors)

'blue

'>>>next(colors)

'red

'>>>next(colors)

'white

'

(3)有限迭代器,其實就是無限迭代器中擷取一段序列。

itertools下的islice(iterable, start, stop[, step])

iterable為可迭代物件,start為起點,不給start值時,預設從0開始,給值時會預設從起點的下乙個元素開始遍歷,stop為終點,step為步長。

help(itertools.islice)

class

islice(builtins.object)

| islice(iterable, stop) -->islice object

| islice(iterable, start, stop[, step]) -->islice object

#返回乙個迭代器,iterable可迭代物件,start如果不設定為0,設定了會預設從start下乙個元素開始遍歷,stop終止,step步長。

例子:

>>> from itertools import

islice

>>> num = cycle((1,2,3))

>>> limited = islice(num,0,4)

>>>next(limited)

1>>>next(limited)

2>>>next(limited)

3>>>next(limited)

1>>>next(limited)

traceback (most recent call last):

file

"", line 1, in

stopiteration

1.生成器是一種特殊的迭代器,不過這種迭代器更加優雅。需要乙個yiled關鍵字。 生成器一定是迭代器(反之不成立),因此任何生成器也是以一種懶載入的模式生成值。

2.生成器有延遲作用,就是有需要的時候才會生產資料,不是立即產生結果。

生成器只能遍歷一次。

4.兩種方法得到生成器:

(1)定義生成器函式,返回值用yield而不是return,yield和return最本質的區別在於return會終止函式,不會保留函式中的變數,再次如果再次呼叫函式時從頭開始;而yield相當於在是凍結函式,給了函式乙個狀態,讓他暫時掛起保留此次呼叫的變數,下一次繼續這個位置呼叫。

看例子:

#用return

deffunc(var):

while var >0:

print

(var)

return

var var -= 1d = func(10)

print

(type(d))

10'int

'>

#

用yield

deffunc(var):

while var >0:

yield

var

#return var

var -= 1d = func(10)

print

(type(d))

'generator

'>#type看到d是乙個生成器

#所以我們可以對d進行for迴圈遍歷

for i in

d:print

(i)

1098

7654

321

(2)生成器表示式:把列表推導式的[ ]改成( )

使用生成器表示式取代列表推導式可以同時節省 cpu 和 記憶體(ram)。

gen = (i for i in range(10))

gen = (i for i in range(10))

print

(type(gen))

for var in

gen:

print

(var)

'generator

'>012

3456

789

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關鍵字判斷元素是否...