python 迭代器,生成器

2022-08-23 00:36:13 字數 3748 閱讀 6134

可迭代物件:內部含有『__iter__』方法的物件

優點:儲存的資料可以直接顯示,比較直觀

擁有的方法比較多

缺點:占用記憶體

不能直接for迴圈取值,是通過內部轉化成迭代器

#

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

s1 = '

abcde

'print(dir(s1)) #

輸出乙個list,內容是s1物件的所有方法,每個方法以字串形式輸出

print('

__iter__

'in dir(s1)) #

判斷乙個物件是否是可迭代物件

'''

迭代器:內部含有'__iter__'並且含有'__next__'方法的物件就是迭代器

因為迭代器的內部含有'__next__'方法,所有可以通過for迴圈取值

判斷乙個物件是否是迭代器:'__iter__' in dir(f1) and '__next__' in dir(f1)

利用iter(object)/object.__iter__()形成乙個迭代器,對迭代器進行操作可以節省記憶體

利用next(object)/object.__next__()取值,一次只取乙個

迭代就是資料處理的基石,掃瞄記憶體中放不下的資料集時,我們要找到一種惰性獲取資料項的方式,即按需一次獲取乙個資料項,這就是迭代器模式

優點: 節省記憶體

缺點: 不能直觀的檢視裡面的資料

速度慢取值不能回頭

'''

可迭代物件轉化成迭代器

s = [11,22,33,44]

obj = s.__iter__() #

等同於iter(s),利用s形成乙個迭代器,賦值給obj

print(s) #

[11, 22, 33, 44]

print(obj) #

s = [11,22,33,44]

obj = s.__iter__

()print(obj.__next__()) #

11,等同於next(obj),迭代器利用 '__next__()'方法取值,一次只取乙個值

print(next(obj)) #

22print(obj.__next__()) #33#

利用while迴圈 模擬for迴圈對可迭代物件取值

s = [11,22,33,44,55,66,77,88]

obj =iter(s)

while 1:

try:

print

(next(obj))

except

stopiteration:

break

s = [11,22,33,44,55,66,77,88,99]

obj =iter(s)

for i in range(4):

print

(next(obj))

for j in range(4):

print(obj.__next__())

生成器:可以用迭代器看著是一種, 生成器的本質就是迭代器

生成是我們自己用python**構建的資料結構,迭代器是python提供的,或者轉化來的

獲取生成器三種方式:

通過生成器函式自己寫

通過生成器表示式自己寫

python內部提供

#

只要函式中有 yield,那麼它就是生成器函式,乙個生成器函式可以存在多個yield

#yield不會結束函式的執行,只是暫停函式

deffun():

print(111)

yield 3 #

乙個next(),**就會執行到這裡,並且將3返回,後面的**不執行,直到下乙個next()

print(222)

yield 4ret = func() #

因為函式中有yield,所以是生成器函式,所以這裡並不會執行函式中的**

print(ret) #

生成器物件

print(next(ret)) #

111 3 生成器中乙個next,對應乙個yield,

print(next(ret)) #

第乙個yield執行完,就會執行這裡的next,接著執行函式中第乙個yield後面的**

#

吃包子例子

deffunc():

for i in range(1,50):

yield f'

號包子'

ret =func()

for i in range(10):

print(next(ret))

def

func():

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

yield

l1ret =func()  

print(ret) #

print(next(ret)) #

[1, 2, 3, 4, 5]

deffunc1():

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

yield

from l2 #

yield from 將list 變成乙個生成器

ret = func1() #

返回乙個生成器物件賦值給ret

for i in ret: #

利用for迴圈對生成器物件直接取值,

print

(i)

deffunc():

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

list2 = [6,7,8,9,0]

yield

from

list1

yield

from

list2

ret =func()

for i in

ret:

print(i) #

1 2 3 4 5 6 7 8 9 0

生成器表示式 獲取生成器

ret = (i for i in range(1,11))

print(ret) #

at 0x00000000023e8570>

for i in

ret:

print(i)

讓生成器產出值的三種方式:next(),for迴圈,list(),本質都是呼叫next()

#

list(generator) ,將生成器物件轉化成list

def chain(*iterables):

for it in

iterables:

for i in

it: yiled i

ret = chain('

abc',(1,2,3))

print(ret) #

print(list(ret)) #

['a', 'b', 'c', 0, 1, 2]

def chain(*iterables):

for it in

iterables:

yield

from

itret = chain('

abc',(1,2,3))

print(list(ret)) #

['a', 'b', 'c', 0, 1, 2]

Python 迭代器 生成器

可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...

python 迭代器,生成器

什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...

python 迭代器 生成器

知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...