成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > python學(xué)習(xí)之可迭代對象、迭代器、生成器

python學(xué)習(xí)之可迭代對象、迭代器、生成器

熱門標(biāo)簽:電話外呼系統(tǒng)招商代理 佛山通用400電話申請 電話機(jī)器人貸款詐騙 廣東旅游地圖標(biāo)注 蘇州人工外呼系統(tǒng)軟件 京華圖書館地圖標(biāo)注 淮安呼叫中心外呼系統(tǒng)如何 看懂地圖標(biāo)注方法 打印谷歌地圖標(biāo)注

Iterable – 可迭代對象

能夠逐一返回其成員項(xiàng)的對象。 可迭代對象的例子包括所有序列類型 (例如 list, str 和 tuple) 以及某些非序列類型例如 dict, 文件對象以及定義了__iter__()方法或是實(shí)現(xiàn)了序列語義的__getitem__() 方法的任意自定義類對象。

可迭代對象可用于 for 循環(huán)以及許多其他需要一個(gè)序列的地方(zip()、map() …)。當(dāng)一個(gè)可迭代對象作為參數(shù)傳給內(nèi)置函數(shù) iter() 時(shí),它會返回該對象的迭代器。這種迭代器適用于對值集合的一次性遍歷。在使用可迭代對象時(shí),你通常不需要調(diào)用 iter() 或者自己處理迭代器對象。for 語句會為你自動處理那些操作,創(chuàng)建一個(gè)臨時(shí)的未命名變量用來在循環(huán)期間保存迭代器

判斷對象是否為可迭代對象:可以使用isinstance與collections模塊的Iterable類型

#分別對python的各種數(shù)據(jù)類型進(jìn)行判斷
from collections import Iterable
a = 123
isinstance(a,Iterable) >>> False
a = 'abc'
isinstance(a,Iterable) >>> True
a = (1,2,3)
isinstance(a,Iterable) >>> True
a = [1,2,3]
isinstance(a,Iterable) >>> True
a = {'name':'wwl','age':24,'sex':'男'}
isinstance(a,Iterable) >>> True
a = {1,2,3}
isinstance(a,Iterable) >>> True
#可以看到字符串,元組,列表,字典,集合是可迭代對象;數(shù)字不是

通過上面我們得到可迭代對象有:字符串,元組,列表,字典,集合
我們可以使用內(nèi)置的dir()函數(shù)對python數(shù)據(jù)類型進(jìn)行操作,會發(fā)現(xiàn)可迭代對象(str,tuple,list,dict,set)均實(shí)現(xiàn)了__iter__方法,而不是可迭代對象的int類型則沒有__iter__方法

dir(int)
['...(省略)', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__','...(省略)' ]
dir(str)
['...(省略)', '__iter__', '...(省略)']
dir(tuple)
['...(省略)', '__iter__', '...(省略)']
dir(list)
['...(省略)', '__iter__', '...(省略)']
dir(dict)
['...(省略)', '__iter__', '...(省略)']
dir(set)
['...(省略)', '__iter__', '...(省略)']

到底是不是__iter__方法決定對象是否是可迭代對象呢?我們可以驗(yàn)證一下:

#自定義兩個(gè)類:A類和B類,其中B類實(shí)現(xiàn)__iter__方法,A類則沒有
from collections import Iterable
class A():
... def __init__(self):
... pass
... 
class B():
 def __init__(self):
 pass
 def __iter__(self):
 return self
#生成兩個(gè)實(shí)例化對象:a和b 
a = A()
b = B()
#可以看到實(shí)現(xiàn)__iter__方法的b對象是可迭代對象,而a對象不是
isinstance(a,Iterable) >>> False
isinstance(b,Iterable) >>> True

特殊情況:實(shí)現(xiàn)了__getitem__方法的序列也是可迭代對象

sequence – 序列
一種 iterable,它支持通過__getitem__() 特殊方法來使用整數(shù)索引進(jìn)行高效的元素訪問,并定義了一個(gè)返回序列長度的__len__() 方法。內(nèi)置的序列類型有l(wèi)ist、str、tuple 和 bytes。注意雖然 dict 也支持__getitem__() 和__len__(),但它被認(rèn)為屬于映射而非序列,因?yàn)樗檎視r(shí)使用任意的 immutable 鍵而非整數(shù)。

#自定義一個(gè)實(shí)現(xiàn)__getitem__方法的序列
class A():
 def __init__(self,*args):
 self.args = args 
 def __getitem__(self,i): 
 return self.args[i]
 def __len__(self):
 num = 0
 while True:
 try:
 self.args[num]
 num += 1
 except:
 return num
 
a = A(1,2,3,'ss','dd')
#可以看到實(shí)例化后的對象是可以通過for...in進(jìn)行循環(huán)訪問的,表示其是可迭代對象。
for i in range(len(a)):
 print(a[i]) >>> 1 2 3 ss dd 
#我們使用collections模塊的Iterable進(jìn)行判斷:
from collections import Iterable,Iterator
isinstance(a,Iterable) >>> False
#結(jié)果出乎意料,判定對象a不是可迭代對象,為什么呢?
#因?yàn)閏ollections模塊的Iterable自動忽略了對象的__getitem__方法,只根據(jù)對象是否有__iter__方法進(jìn)行判斷。一般來說,標(biāo)準(zhǔn)的序列均實(shí)現(xiàn)了__iter__方法。
#既然上面方法無法判斷具有__getitem__方法的序列是否是可迭代對象,那又該如何判斷呢?
#可以使用iter()函數(shù),如果不報(bào)錯(cuò),說明是可迭代對象,報(bào)錯(cuò)就不是
b = iter(a)
isinstance(b,Iterable) >>> True
isinstance(b,Iterator) >>> True

Iterator – 迭代器:內(nèi)部實(shí)現(xiàn)__iter__和__next__方法的對象

用來表示一連串?dāng)?shù)據(jù)流的對象。重復(fù)調(diào)用迭代器的 next() 方法(或?qū)⑵鋫鹘o內(nèi)置函數(shù) next())將逐個(gè)返回流中的項(xiàng)。當(dāng)沒有數(shù)據(jù)可用時(shí)則將引發(fā) StopIteration 異常。到這時(shí)迭代器對象中的數(shù)據(jù)項(xiàng)已耗盡,繼續(xù)調(diào)用其 next() 方法只會再次引發(fā) StopIteration 異常。迭代器必須具有 iter() 方法用來返回該迭代器對象自身,因此迭代器必定也是可迭代對象,可被用于其他可迭代對象適用的大部分場合。一個(gè)顯著的例外是那些會多次重復(fù)訪問迭代項(xiàng)的代碼。容器對象(例如 list)在你每次向其傳入 iter() 函數(shù)或是在 for 循環(huán)中使用它時(shí)都會產(chǎn)生一個(gè)新的迭代器。如果在此情況下你嘗試用迭代器則會返回在之前迭代過程中被耗盡的同一迭代器對象,使其看起來就像是一個(gè)空容器。

判斷對象是否為迭代器:使用isinstance與collections模塊的Iterator類型

from collections import Iterable,Iterator
#創(chuàng)建兩個(gè)類:B類和C類,B類實(shí)現(xiàn)了__iter__方法,C類實(shí)現(xiàn)了__iter__和__next__方法
class B():
 def __init__(self):
 pass
 def __iter__(self):
 return self
 
class C():
 def __init__(self):
 pass
 def __iter__(self):
 return self
 def __next__(self):
 return 123
#實(shí)例化兩個(gè)對象 
b = B()
c = C()
#可以看到b對象是可迭代對象,卻不是迭代器;c對象既是可迭代對象,又是迭代器.
isinstance(b,Iterable) >>> True
isinstance(b,Iterator) >>> False
isinstance(c,Iterator) >>> True
isinstance(c,Iterable) >>> True

生成迭代器有兩種方法:

1.使用內(nèi)置的iter(object[, sentinel])函數(shù);

返回迭代器對象。根據(jù)第二個(gè)參數(shù)的存在,第一個(gè)參數(shù)的解釋非常不同。如果沒有第二個(gè)參數(shù),對象必須是支持迭代協(xié)議的集合對象(iter()方法),或者必須支持序列協(xié)議(getitem()方法,整數(shù)參數(shù)從0開始)。如果它不支持這兩個(gè)協(xié)議中的任何一個(gè),則會引發(fā)TypeError。如果給出了第二個(gè)參數(shù)sentinel,那么object必須是可調(diào)用的對象。在這種情況下創(chuàng)建的迭代器將調(diào)用對象,每次調(diào)用它的__next __()方法時(shí)都不帶參數(shù);如果返回的值等于sentinel,則將引發(fā)StopIteration,否則將返回該值。

iter()的第一種形式:不帶第二個(gè)參數(shù),第一個(gè)參數(shù)表示可迭代對象(具有__iter__()方法或者_(dá)_getitem__()方法)

#自定義兩個(gè)類,一個(gè)支持__iter__()方法,一個(gè)支持__getitem__()方法
#1.定義一個(gè)支持迭代協(xié)議的集合對象:
class A():
 def __init__(self):
 pass
 def __iter__(self):
 self.num = 0
 return self
 def __next__(self):
 if self.num  10:
 N = self.num
 self.num += 1
 return N
 else:
 raise StopIteration
 
a = A()
b = iter(a)
from collections import Iterable,Iterator
#由于A類中我們定義的__iter__()函數(shù)是返回自己,同時(shí)定義了自身的__next__()方法,所以對象a既是可迭代對象,又是迭代器。
isinstance(a,Iterable) >>> True
isinstance(a,Iterator) >>> True
#同時(shí)我們可以看到對象a經(jīng)過iter()方法后生成的b對象是迭代器。
isinstance(b,Iterator) >>> True
isinstance(b,Iterable) >>> True

#定義一個(gè)支持序列協(xié)議的對象
class B():
 def __init__(self,*args):
 self.args = args 
 def __getitem__(self,i): 
 return self.args[i]
 def __len__(self):
 num = 0
 while True:
 try:
 self.args[num]
 num += 1
 except:
 return num

b = B()
c = iter(b)

#由于b對象定義的是__getitem__()方法,所以無法使用collections模塊對b對象進(jìn)行判斷。
#這里我們只對使用了iter()方法后生成的c對象進(jìn)行判斷
isinstance(c,Iterable) >>> True
isinstance(c,Iterator) >>> True
#可以看到使用了iter()方法后生成的對象c是迭代器

iter()的第二種形式:帶第二個(gè)參數(shù),第一個(gè)參數(shù)表示可調(diào)用對象,當(dāng)返回值為第二個(gè)參數(shù)時(shí),觸發(fā)StopIteration

class A():
 def __init__(self):
 self.num = 1
 def __call__(self):
 x = self.num
 self.num += 1
 return x 
 
a = A()
b = iter(a,5)
from collections import Iterable,Iterator
#我們可以看到a對象既不是可迭代對象也不是迭代器,但通過iter()方法返回的對象b確實(shí)迭代器
isinstance(a,Iterable) >>> False
isinstance(a,Iterator) >>> False
isinstance(b,Iterator) >>> True
isinstance(b,Iterable) >>> True
#通過for...in循環(huán)遍歷打?。看窝h(huán)都調(diào)用__call__()方法,直至返回值等于5,觸發(fā)StopIteration停止迭代)
for i in b:
 print(i) >>> 1 2 3 4
 
#iter()的第二種形式的一個(gè)有用的應(yīng)用是構(gòu)建塊讀取器。例如,從二進(jìn)制數(shù)據(jù)庫文件中讀取固定寬度的塊,直到到達(dá)文件結(jié)尾:
from functools import partial
with open('mydata.db', 'rb') as f:
 for block in iter(partial(f.read, 64), b''):
 process_block(block)

2.直接調(diào)用可迭代對象的__iter__方法;

#定義__iter__()方法,可以返回自己,但自己要定義__next__()方法;也可以返回其他對象的迭代器
#第一種:返回自身,同時(shí)定義自身的__next__()方法
class A():
 def __init__(self):
 pass
 def __iter__(self):
 self.num = 0
 return self
 def __next__(self):
 if self.num  10:
 N = self.num
 self.num += 1
 return N
 else:
 raise StopIteration
a = A()
b = a.__iter__()
from collections import Iterable,Iterator
#由于A類中我們定義的__iter__()函數(shù)是返回自己,同時(shí)定義了自身的__next__()方法,所以對象a既是可迭代對象,又是迭代器。
isinstance(a,Iterable) >>> True
isinstance(a,Iterator) >>> True
#同時(shí)我們可以看到對象a經(jīng)過iter()方法后生成的b對象是迭代器。
isinstance(b,Iterable) >>> True
isinstance(b,Iterator) >>> True

#第二種:返回其他對象的迭代器
class A():
 def __init__(self):
 pass
 def __iter__(self):
 self.num = 0
 return b

class B(A):
 def __next__(self):
 if self.num  10:
 N = self.num
 self.num += 1
 return N
 else:
 raise StopIteration
 
#實(shí)例化兩個(gè)對象:a和b,當(dāng)調(diào)用對象a的__iter__()方法時(shí),返回對象b,B繼承于A類,所以b對象是一個(gè)迭代器。
a = A()
b = B()
#調(diào)用a的__iter__()方法
c = a.__iter__()
from collections import Iterable,Iterator
#由于對象a不具備__next__()方法,因此僅僅是一個(gè)可迭代對象
isinstance(a,Iterable) >>> True
isinstance(a,Iterator) >>> False
#但是調(diào)用對象a的__iter()方法生成的c,同時(shí)具備__iter__()和__next__()方法,是一個(gè)迭代器。
isinstance(c,Iterable) >>> True
isinstance(c,Iterator) >>> True

上面兩種方式表示可以生成迭代器,但并不是使用這兩個(gè)函數(shù)就一定生成迭代器,這取決于運(yùn)行這兩個(gè)函數(shù)返回的是什么

#iter()函數(shù):其運(yùn)行機(jī)制是尋找對象中的__iter__()方法,運(yùn)行并返回結(jié)果,如果__iter__()方法返回的不是迭代器,則此方法會報(bào)錯(cuò);如果沒有此方法,則尋找__getitem__()方法。
class A():
 def __init__(self):
 pass
 def __iter__(self):
 return 1 #我們知道數(shù)字1不是迭代器,此函數(shù)返回的是一個(gè)非迭代器 
a = A()
b = iter(a)
Traceback (most recent call last):
 File "input>", line 10, in module>
TypeError: iter() returned non-iterator of type 'int'

#直接調(diào)用__iter__()方法:如果想通過調(diào)用此方法生成迭代器,只能定義在此函數(shù)下返回一個(gè)迭代器;如果定義返回的不是迭代器,調(diào)用此方法是不會生成迭代器的。
class A():
 def __init__(self):
 pass
 def __iter__(self):
 return 1 
a = A()
#直接調(diào)用__iter__()方法
b = a.__iter__()
#我們可以看到返回的是1,而不是迭代器,只有當(dāng)你定義返回迭代器時(shí),調(diào)用此方法才會返回迭代器
print(b) >>> 1

判斷對象是否是可迭代對象:

1.collections模塊的Iterable類型,使用isinstance()判斷(此方法不太準(zhǔn))

#我們定義一個(gè)類:具有__iter__()方法,但返回的不是迭代器
class A():
 def __init__(self):
 pass
 def __iter__(self):
 return 1 
a = A()
from collections import Iterable
#我們使用isinstance()結(jié)合collections看一下:會發(fā)現(xiàn)此方法認(rèn)為他是一個(gè)可迭代對象
isinstance(a,Iterable) >>> True
#我們使用for...in進(jìn)行循環(huán)訪問,發(fā)現(xiàn)并不能
for i in a:
 print(i) 
Traceback (most recent call last):
 File "input>", line 1, in module>
TypeError: iter() returned non-iterator of type 'int'
#接下來,我們再定義一個(gè)類:具有__iter__()方法和__next__()方法,但返回的不是迭代器
class A():
 def __init__(self):
 pass
 def __iter__(self):
 pass
 def __next__(self):
 pass

a = A()
from collections import Iterator
#我們使用isinstance()結(jié)合collections看一下:會發(fā)現(xiàn)此方法認(rèn)為他是一個(gè)迭代器
isinstance(a,Iterator) >>> True
#我們使用for...in進(jìn)行循環(huán)訪問,發(fā)現(xiàn)并不能
for i in a:
 print(a) 
Traceback (most recent call last):
 File "input>", line 1, in module>
TypeError: iter() returned non-iterator of type 'NoneType'

2.使用iter()內(nèi)置函數(shù)進(jìn)行判斷:

class A():
 def __init__(self):
 pass
 def __iter__(self):
 return 1 
a = A()
#使用iter()函數(shù)如果報(bào)錯(cuò),則不是可迭代對象,如果不報(bào)錯(cuò),則是可迭代對象
b = iter(a)
Traceback (most recent call last):
 File "input>", line 1, in module>
TypeError: iter() returned non-iterator of type 'int'

3.使用for…in方法進(jìn)行遍歷,如果可以遍歷,即為可迭代對象

#for...in循環(huán)的實(shí)質(zhì)是:先調(diào)用對象的__iter__()方法,返回一個(gè)迭代器,然后不斷的調(diào)用迭代器的__next__()方法。
class A():
 def __init__(self):
 pass
 def __iter__(self):
 self.num = 0
 return self
 def __next__(self):
 if self.num  10:
 N = self.num
 self.num += 1
 return N
 else:
 raise StopIteration
a = A()
for i in a:
 print(i) >>> 0 1 2 3 4 5 6 7 8 9

#等同于:先調(diào)用對象的__iter__()方法,返回一個(gè)迭代器,然后不斷的調(diào)用迭代器的__next__()方法,調(diào)用完返回StopIteration,結(jié)束迭代
b = iter(a)
while True:
 try:
 next(b)
 except:
 raise StopIteration

0 1 2 3 4 5 6 7 8 9
Traceback (most recent call last):
 File "stdin>", line 3, in module>
 File "stdin>", line 13, in __next__
StopIteration

經(jīng)過上面三種判斷方法的分析,我們可以得出一些結(jié)論:
1.collection模塊的Iterable,Iterator類型并不能準(zhǔn)確的判斷對象是否是可迭代對象,或者是否是迭代器,它的判斷原理只是檢查對象內(nèi)部是否定義了__iter__()和__next__()方法,而不注重這兩個(gè)函數(shù)所返回的內(nèi)容。
2.相比于collections模塊,iter()函數(shù)則與其不同,它更注重__iter__()函數(shù)返回的內(nèi)容,如果返回的是迭代器,則iter()的參數(shù)即為可迭代對象,否則,使用iter()函數(shù)會報(bào)錯(cuò)。此方法比較常用,也相對好用。
3.for…in循環(huán)方法,也可以用來判斷對象是否是可迭代對象,此方法本質(zhì)就是調(diào)用對象__iter__()和__next__()方法,他同樣注重函數(shù)的返回內(nèi)容。

經(jīng)過以上種種實(shí)例的分析,我們發(fā)現(xiàn)僅僅具有__iter__()和__next__方法并不能算真正意義上的可迭代對象或者迭代器,如果不注重方法返回的內(nèi)容,實(shí)例化的對象卻不能進(jìn)行迭代訪問,又怎么能稱為可迭代對象和迭代器呢?因此我們在這里對可迭代對象和迭代器進(jìn)行重新定義

類型 定義 判斷方法
-     可迭代對象 內(nèi)部定義了__iter__()方法且返回迭代器,可以返回自己也可以返回其他迭代器,如果返回自己,則自己還必須定義__next__()方法;也可以是定義__getitem__()方法的序列,整數(shù)參數(shù)可以從0進(jìn)行索引,一般來說,標(biāo)準(zhǔn)的序列均定義了__iter__()方法,所以序列也是符合可迭代對象的要求的 可以使用iter()方法進(jìn)行判斷,將對象作為參數(shù)輸入,如果不報(bào)錯(cuò)則為可迭代對象;反之,則不是。除此之外,使用for循環(huán)進(jìn)行遍歷,也可以識別;還有就是能夠看到對象的源碼,直接根據(jù)定義進(jìn)行判斷
迭代器 內(nèi)部定義了__iter__()方法,與可迭代對象不同的是,對象的__iter__()方法必須返回的是自己,同時(shí)自己定義了__next__()方法 如果是迭代器,是可以調(diào)用__next__()方法的,調(diào)用所有元素后,拋出StopIteration錯(cuò)誤;判斷Iterator最好是能夠看到源碼,直接根據(jù)定義判斷。

generator – 生成器:

生成器是一個(gè)用于創(chuàng)建迭代器的簡單而強(qiáng)大的工具。它們的寫法類似于標(biāo)準(zhǔn)的函數(shù),但當(dāng)它們要返回?cái)?shù)據(jù)時(shí)會使用yield 語句。每次在生成器上調(diào)用next() 時(shí),它會從上次離開的位置恢復(fù)執(zhí)行(它會記住上次執(zhí)行語句時(shí)的所有數(shù)據(jù)值)。

可以用生成器來完成的操作同樣可以用基于類的迭代器來完成。 但生成器的寫法更為緊湊,因?yàn)樗鼤詣觿?chuàng)建 iter() 和 next() 方法。

另一個(gè)關(guān)鍵特性在于局部變量和執(zhí)行狀態(tài)會在每次調(diào)用之間自動保存。 這使得該函數(shù)相比使用 self.index 和 self.data 這種實(shí)例變量的方式更易編寫且更為清晰。

除了會自動創(chuàng)建方法和保存程序狀態(tài),當(dāng)生成器終結(jié)時(shí),它們還會自動引發(fā) StopIteration。 這些特性結(jié)合在一起,使得創(chuàng)建迭代器能與編寫常規(guī)函數(shù)一樣容易。

def A():
 yield 1
 yield 2
 
a = A()
print(a)
#可以看出a顯示的是一個(gè)生成器對象
generator object A at 0x7f4f94409eb8>
#我們使用dir()函數(shù)看一下生成器的方法:
dir(a)
['省略', '__iter__', '省略', '__next__', 'send', 'throw','省略']
#可以看到生成器里面自動完成了對__iter__()和__next__()方法的定義
#我們調(diào)用對象的__iter__()方法
print(iter(a)) >>> generator object A at 0x7f4f94409eb8>
print(a) >>> generator object A at 0x7f4f94409eb8>
#可以看到,調(diào)用__iter__()方法,返回的是對象自己
#我們調(diào)用對象的__next__()方法
next(a) >>> 1
#可以看到,再次調(diào)用next()方法,是在上次的基礎(chǔ)上繼續(xù)運(yùn)行的,返回的是2,而不是像普通函數(shù)一樣,從頭開始重新運(yùn)行
next(a) >>> 2
next(a)
Traceback (most recent call last):
 File "stdin>", line 1, in module>
StopIteration
#可以看到生成器a調(diào)用next()方法后生成下一個(gè)元素,同時(shí)當(dāng)元素耗盡時(shí),拋出StopIteration錯(cuò)誤,這和迭代器完全相似
#生成器完全符合迭代器的要求,所以生成器也屬于迭代器

除了定義一個(gè)yield函數(shù)外,還可以利用推導(dǎo)式生成一個(gè)生成器

#一般的推導(dǎo)式有列表推導(dǎo)式和字典推導(dǎo)式,與兩者不同,生成器的推導(dǎo)式是寫在小括號中的,而且只能是比較簡單的生成器,比較復(fù)雜的生成器一般是寫成yield函數(shù)的形式.
a = (i for i in range(5))
print(a)
generator object genexpr> at 0x03CFDE28>
類型 定義 判斷方法
生成器 使用yield的函數(shù),或者類似(i for i in range(5))這樣的推導(dǎo)式,自動實(shí)現(xiàn)__iter__()和__next__()方法 根據(jù)定義判斷

1.生成器是一種特殊的迭代器,其內(nèi)部自動實(shí)現(xiàn)__iter__()和__next__()方法,可用for循環(huán)遍歷輸出;
2.迭代器一定是可迭代對象,但可迭代對象不一定是迭代器。

迭代器存在的意義:

在說明迭代器之前,我們需要引入一個(gè)容器的概念。什么是容器?容器是眾多對象(在python中對象的抽象是類class)的集合,根據(jù)存儲方式不同,python可分為四種容器:

列表(list):對象以隊(duì)列方式進(jìn)行存儲 元組(tuple):對象以隊(duì)列方式進(jìn)行存儲,和列表一樣,只是存儲數(shù)據(jù)后,不可更改, 集合(set):對象以無序的方式進(jìn)行存儲 字典(dict):對象以鍵值對映射的方式存儲數(shù)據(jù)

在編程中,最常見的操作就是從這些容器中拿出數(shù)據(jù)。而容器一般是不具備取出數(shù)據(jù)的功能的。我們平時(shí)取出數(shù)據(jù)的操作實(shí)際上是先經(jīng)過__iter__()方法轉(zhuǎn)為迭代器,之后再通過__next__()方法拿取的(參考for循環(huán),map(),filter())??梢哉f迭代器賦予了容器取出數(shù)據(jù)的能力,但迭代器每次調(diào)用__next__()方法只能取出一個(gè)數(shù)據(jù),這種方法顯然是很笨拙的,于是引入for循環(huán),每次循環(huán)自動調(diào)用__next__()方法,這使得訪問容器中的對象變得十分方便。

個(gè)人理解:迭代器的存在類似指針。

迭代器具有__iter__()方法就好比具備存放指針的資格,而__next__()方法,表示指針調(diào)度的規(guī)則。每次訪問容器中的元素,首先調(diào)用__iter__()方法在容器元素頭部放一個(gè)指針,此指針不指向任何元素,位于所有元素前面,為待操作狀態(tài),隨時(shí)準(zhǔn)備被調(diào)用。然后通過__next__()方法制定的規(guī)則來調(diào)度這個(gè)指針,使其指向不同的對象,指針?biāo)钢幈闶撬L問對象。此指針默認(rèn)有一些屬性:只能向前,不能回退,當(dāng)沒有元素時(shí),拋出StopIteration,過程結(jié)束。

使用迭代器一個(gè)明顯的優(yōu)勢是:減少內(nèi)存占用

不使用迭代器:如果我們想訪問一個(gè)容器中的所有元素,就需要將所有的元素都加載到內(nèi)存中,然后一次性打印,對于少量元素來說,這無關(guān)緊要,但當(dāng)數(shù)據(jù)量非常大時(shí),這種做法將占用很大的內(nèi)存,影響程序性能。
使用迭代器:我們訪問一個(gè)容器中的所有元素,不會將所有元素都加載出來,而是一個(gè)一個(gè)的加載,然后打印,這樣會極大的減少內(nèi)存的占用。

生成器存在的意義:

生成器的存在,給我更多的感受是:簡化迭代器的生成。我們只需使用yield關(guān)鍵字,將數(shù)據(jù)處理的邏輯寫出,對象內(nèi)部將自動完成對__iter__()和__next__()方法的定義,使我們不用再耗費(fèi)精力處理實(shí)例變量,以及自己定義__iter__()和__next__()方法。

特性:

1.生成器中的成員并不存在,使用一個(gè)成員立刻用yield生成一個(gè)成員(按需計(jì)算)
2.生成器很節(jié)省內(nèi)存,因?yàn)槭橇⒖躺傻?,所以耗費(fèi)CPU進(jìn)行計(jì)算;

到此這篇關(guān)于python學(xué)習(xí)之可迭代對象、迭代器、生成器的文章就介紹到這了,更多相關(guān)python可迭代對象、迭代器、生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python基礎(chǔ)語法之容器詳解
  • python可迭代對象去重實(shí)例
  • Python編程如何在遞歸函數(shù)中使用迭代器
  • 一篇文章帶你了解python迭代器和生成器
  • 穩(wěn)扎穩(wěn)打?qū)WPython之容器 可迭代對象 迭代器 生成器專題講解

標(biāo)簽:畢節(jié) 江蘇 駐馬店 衡水 湖州 呼和浩特 股票 中山

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python學(xué)習(xí)之可迭代對象、迭代器、生成器》,本文關(guān)鍵詞  python,學(xué),習(xí)之,可,迭代,對象,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python學(xué)習(xí)之可迭代對象、迭代器、生成器》相關(guān)的同類信息!
  • 本頁收集關(guān)于python學(xué)習(xí)之可迭代對象、迭代器、生成器的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    网站一区二区三区| 成人97人人超碰人人99| 国产精品天美传媒入口| 毛片在线播放视频| 亚洲 精品 综合 精品 自拍| 国产无遮挡呻吟娇喘视频| 九九九九久久久久| 强伦女教师2:伦理在线观看| 手机av在线网| 成人无码精品1区2区3区免费看| 久久婷婷一区二区| 99久久无色码| 欧美性猛交xxxxbbb| 性一交一乱一伧老太| 国产性猛交普通话对白| 极品美女扒开粉嫩小泬| 国产精品欧美久久久久一区二区| 99久久免费精品国产72精品九九| 黄色一级片网址| 亚洲国产成人av好男人在线观看| 国产一区深夜福利| 91嫩草精品| 国产成人夜间影院在线观看| 97久久人人超碰| 国产欧美日本在线| www.超级碰| 日韩精品不卡一区二区| 风间由美中文字幕在线看视频国产欧美| 国产在线高潮| 免费 成 人 黄 色| 日本亚洲精品| 亚洲美女毛片| 精品国产凹凸成av人导航| 亚洲美女性囗交| 国产精品国产三级国产aⅴ原创| 在线视频手机国产| 亚洲黄色一区二区三区| 国产+高潮+白浆+无码| 午夜亚洲福利在线老司机| 国模人体一区二区| 草草地址线路①屁屁影院成人| 黄色av免费网站| 精品一区二区三区中文字幕| 黄色成人在线| www国产精品av| 国产亚洲精品久久久久久打不开| 欧美一卡2卡3卡4卡无卡免费观看水多多| 又黄又爽在线观看| 在线观看国产福利视频| 66精品视频在线观看| 欧洲在线视频一区| 最近中文字幕mv免费高清视频8| 日韩第一页在线| 国产自产v一区二区三区c| 精品精品国产毛片在线看| 日韩美女av在线免费观看| 国内精品视频在线播放| 九九大香尹人视频免费| 中文字幕欧美日韩在线不卡| 中文天堂在线播放| 一个人看的视频www| 波多野结衣在线观看一区二区三区| 欧美极品视频在线观看| 99精品国产在热久久婷婷| 欧美午夜片欧美片在线观看| 九九九视频在线观看| a天堂资源在线观看| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 欧美a在线视频| 国产资源在线视频| 福利在线国产| 日韩电影免费| 毛片在线播放网址| 成人午夜免费av| 91成人午夜| 91文字幕巨乱亚洲香蕉| 中文字幕亚洲二区| 黄色网战在线观看| 日本乱码一区二区三区不卡| 四虎永久在线精品无码视频| 久久久夜色精品亚洲| 色偷偷综合网| caoporn视频在线| 免费黄漫在线观看| 日本一区二区三区播放| 欧美一性一交| 午夜免费看毛片| 9l视频自拍蝌蚪9l视频| 日本一级淫片演员| 欧美三级视频| 日韩精品免费在线视频观看| 精品国产99久久久久久宅男i| 日韩精品五月天| 999视频在线免费观看| 一区二区不卡视频| 日韩中文综合网| 日韩国产精品亚洲а∨天堂免| 亚洲成年人专区| 亚洲毛片在线免费| 日韩欧美亚洲国产另类| av在线免费播放网址| 91精品国产欧美日韩| 亚洲成av人**亚洲成av**| 黄色小说在线播放| 久久久久久久蜜桃| 成人一级片网站| 亚洲一区免费看| 国产欧美精品aaaaaa片| av不卡一区二区三区| 亚洲欧洲美洲综合色网| 99久久免费国产精品| 91丨porny丨户外露出| 高清日韩电视剧大全免费| 天天操天天干天天爽| 日本久久亚洲电影| 欧美xxx黑人xxx水蜜桃| 黄色国产网站在线播放| 国产精品久久久久久久久久久久久| 日韩av电影免费观看| 99久久国产免费看| 99re在线国产| 农村妇女一区二区| 国产美女免费网站| 欧美日韩综合另类| 2018国产精品视频| 国产女人18毛片水真多18| 日本性高潮视频| 免费成人在线影院| 成人精品国产福利| 国产精品免费福利| 99久久精品国产成人一区二区| 五月婷婷深深爱| 五月天婷婷色综合| 国产毛片久久| 久久天堂夜夜一本婷婷麻豆| 精品影片一区二区入口| 毛片在线不卡| 麻豆视频网站在线观看| 国产亚洲va综合人人澡精品| 免费在线看大片无需流量| 久久精品福利视频| 国产欧美三级| 日本视频在线观看一区二区三区| 成人毛片100部免费看| 色综合桃花网| www.久久久久久久| 久久久久国色av免费观看性色| 少妇高潮一区二区三区69| 久久久久久久久国产| 在线观看免费视频高清游戏推荐| 91最新地址在线播放| 手机看片福利在线观看| 黄色网址多少| 五码日韩精品一区二区三区视频| 亚洲国产中文在线二区三区免| 免费在线小视频| 欧美另类高清videos的特点| 国产精品后入内射日本在线观看| 一区二区久久久久久| 性欧美性free| 国产麻豆91精品| 肉肉av福利一精品导航| 久久久久久国产精品三级玉女聊斋| 欧美日韩国产系列| 四虎永久网址| 人人干人人草| 国产资源精品在线观看| 国产高清www| 日韩成人av影院| 国产一级特黄视频| 色老板亚洲精品一区| 亚洲一区二区三区| 少妇av一区二区三区无码| 91免费看国产| 中文天堂在线播放| 中文字幕在线免费| 亚洲аv电影天堂网| 国产伦精品一区二区三区在线| 护士精品一区二区三区| 一本在线高清不卡dvd| 国产黄网站在线观看| 中文字幕av一区二区三区| 男女激烈动态图| 怡红院av久久久久久久| 国产亚洲欧美精品久久久www| 亚洲美女综合网| 特黄毛片在线观看| 一区二区三区在线观看免费视频| 丁香六月久久综合狠狠色| 精品国产电影| 国产成人精品福利一区二区三区| 色猫咪免费人成网站在线观看| 在线成人超碰| 91精品国产全国免费观看| 99在线高清视频在线播放| 侵犯稚嫩小箩莉h文系列小说| 久久久99免费视频| 国产区一区二区三区| 欧美一级一级性生活免费录像| 亚洲一级一区| 色一情一乱一乱一区91| 1区2区在线| 亚洲色成人网站www永久四虎| 99re在线观看| 黄色短视频在线观看| 国产美女在线观看一区| 好吊妞www.84com只有这里才有精品| 一级一片免费视频| 国产成人一区二区三区影院在线| 1级黄色大片儿| 狠狠干天天爱| 欧美久久电影| 亚洲精品tv久久久久久久久久| 黄色成人影院| 天天干天天av| 丰满肥臀噗嗤啊x99av| 丝袜情趣国产精品| 欧美久久亚洲| 欧美人与性禽动交精品| 无码少妇一区二区三区芒果| 国产激情综合五月久久| 欧美 日韩 国产在线观看| 日韩午夜一区| 无线免费在线视频| 国产传媒一区| av先锋资源网| 欧美三级黄美女| 波多野结衣在线一区二区| 国产91精品一区二区| 国产精品剧情一区二区在线观看| 日韩欧美午夜| 久久久黄色av| 一级黄色毛毛片| 日韩av在线看免费观看| 国产一区在线视频观看| 精品少妇人妻av一区二区三区| 久久久不卡影院| 亚洲国产精品免费在线观看| 国产精品91一区| 久久资源中文字幕| 欧美不卡视频一区| 亚洲精品欧洲精品| 成人av免费在线观看| 午夜一区二区三区在线观看| 欧美激情精品久久久久久变态| 最新日韩一区| 伊人久久男人天堂| 最近中文字幕av| 亚洲精品套图| 久久精品一区二区不卡| 国产成人在线免费看| 99久久无色码| 最好看的中文字幕久久| 国产美女主播视频一区| 粉嫩嫩av羞羞动漫久久久| 亚洲欧美日本在线| 亚洲精品激情视频| 老司机精品视频一区二区| 国产chinese男男gaygay网站| 不卡av电影在线播放| 欧美三级华人主播| 中文字幕丰满乱子伦无码专区| 色婷婷精品久久二区二区蜜臀av| 欧美在线视频在线播放完整版免费观看| 午夜电影福利| 国产精品丝袜一区| 黄页大全在线免费观看| 欧美+亚洲+精品+三区| 久久中文亚洲字幕| 欧美大秀在线观看| 国产精品一区二区三区免费视频| 亚洲成av人片观看| 国产精品18久久久久久久网站| 凹凸日日摸日日碰夜夜爽1| 北条麻妃av高潮尖叫在线观看| 欧美成人久久| 国产精品免费观看久久| 国产精品免费人成网站酒店| 性欧美大胆高清视频| 国产成人午夜视频| 亚洲一区在线免费| 日韩av在线免费看| 国产亚洲精品久久久久婷婷瑜伽| 欧美激情一区二区在线| 国产成人精品亚洲男人的天堂| 久久精品国内一区二区三区水蜜桃| 香蕉视频网页版| 影视亚洲一区二区三区| 性娇小13――14欧美| 先锋音影av资源中文网| 人成网站免费观看| 宅男噜噜99国产精品观看免费| 在线免费不卡电影| 蜜臀av性久久久久av蜜臀妖精| 欧美午夜视频一区二区| 精品人妻一区二区三区免费看| 久久99国产精品久久| 五月天亚洲色图| 国产黄色美女视频| 久久国产精品色| 免费观看成人高潮| 欧美激情一级欧美精品| 天天综合网在线| 日韩欧美亚洲国产精品字幕久久久| 国产精品免费一区二区三区| 久久精品亚洲精品国产欧美kt∨| 亚洲色图13p| 黄污网站在线观看| 欧美xxxx做受欧美护士| 国产精品无码永久免费888| 91视频免费播放| 自拍偷拍亚洲欧美| 在这里有精品| 国产露出视频在线观看| 中文字幕在线观看视频网站| 一区在线免费观看| 国产高清视频免费观看| 国精产品一区一区三区mba下载| 欧美综合一区二区三区| 国产一区美女在线| 香蕉人人精品| 一级中文字幕一区二区| 粗暴蹂躏中文一区二区三区| 欧产日产国产精品98| 亚洲精品大片www| 欧美性猛交xxxx黑人| 欧美日韩伦理在线免费| 久久99最新地址|