python學(xué)習(xí)之可迭代對象、迭代器、生成器
Iterable – 可迭代對象
能夠逐一返回其成員項的對象。 可迭代對象的例子包括所有序列類型 (例如 list, str 和 tuple) 以及某些非序列類型例如 dict, 文件對象以及定義了__iter__()方法或是實現(xiàn)了序列語義的__getitem__() 方法的任意自定義類對象。
可迭代對象可用于 for 循環(huán)以及許多其他需要一個序列的地方(zip()、map() …)。當(dāng)一個可迭代對象作為參數(shù)傳給內(nèi)置函數(shù) iter() 時,它會返回該對象的迭代器。這種迭代器適用于對值集合的一次性遍歷。在使用可迭代對象時,你通常不需要調(diào)用 iter() 或者自己處理迭代器對象。for 語句會為你自動處理那些操作,創(chuàng)建一個臨時的未命名變量用來在循環(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)均實現(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__方法決定對象是否是可迭代對象呢?我們可以驗證一下:
#自定義兩個類:A類和B類,其中B類實現(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 #生成兩個實例化對象:a和b a = A() b = B() #可以看到實現(xiàn)__iter__方法的b對象是可迭代對象,而a對象不是 isinstance(a,Iterable) >>> False isinstance(b,Iterable) >>> True
特殊情況:實現(xiàn)了__getitem__方法的序列也是可迭代對象
sequence – 序列
一種 iterable,它支持通過__getitem__() 特殊方法來使用整數(shù)索引進(jìn)行高效的元素訪問,并定義了一個返回序列長度的__len__() 方法。內(nèi)置的序列類型有l(wèi)ist、str、tuple 和 bytes。注意雖然 dict 也支持__getitem__() 和__len__(),但它被認(rèn)為屬于映射而非序列,因為它查找時使用任意的 immutable 鍵而非整數(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') #可以看到實例化后的對象是可以通過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不是可迭代對象,為什么呢? #因為collections模塊的Iterable自動忽略了對象的__getitem__方法,只根據(jù)對象是否有__iter__方法進(jìn)行判斷。一般來說,標(biāo)準(zhǔn)的序列均實現(xiàn)了__iter__方法。 #既然上面方法無法判斷具有__getitem__方法的序列是否是可迭代對象,那又該如何判斷呢? #可以使用iter()函數(shù),如果不報錯,說明是可迭代對象,報錯就不是 b = iter(a) isinstance(b,Iterable) >>> True isinstance(b,Iterator) >>> True
Iterator – 迭代器:內(nèi)部實現(xiàn)__iter__和__next__方法的對象
用來表示一連串?dāng)?shù)據(jù)流的對象。重復(fù)調(diào)用迭代器的 next() 方法(或?qū)⑵鋫鹘o內(nèi)置函數(shù) next())將逐個返回流中的項。當(dāng)沒有數(shù)據(jù)可用時則將引發(fā) StopIteration 異常。到這時迭代器對象中的數(shù)據(jù)項已耗盡,繼續(xù)調(diào)用其 next() 方法只會再次引發(fā) StopIteration 異常。迭代器必須具有 iter() 方法用來返回該迭代器對象自身,因此迭代器必定也是可迭代對象,可被用于其他可迭代對象適用的大部分場合。一個顯著的例外是那些會多次重復(fù)訪問迭代項的代碼。容器對象(例如 list)在你每次向其傳入 iter() 函數(shù)或是在 for 循環(huán)中使用它時都會產(chǎn)生一個新的迭代器。如果在此情況下你嘗試用迭代器則會返回在之前迭代過程中被耗盡的同一迭代器對象,使其看起來就像是一個空容器。
判斷對象是否為迭代器:使用isinstance與collections模塊的Iterator類型
from collections import Iterable,Iterator #創(chuàng)建兩個類:B類和C類,B類實現(xiàn)了__iter__方法,C類實現(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 #實例化兩個對象 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ù)第二個參數(shù)的存在,第一個參數(shù)的解釋非常不同。如果沒有第二個參數(shù),對象必須是支持迭代協(xié)議的集合對象(iter()方法),或者必須支持序列協(xié)議(getitem()方法,整數(shù)參數(shù)從0開始)。如果它不支持這兩個協(xié)議中的任何一個,則會引發(fā)TypeError。如果給出了第二個參數(shù)sentinel,那么object必須是可調(diào)用的對象。在這種情況下創(chuàng)建的迭代器將調(diào)用對象,每次調(diào)用它的__next __()方法時都不帶參數(shù);如果返回的值等于sentinel,則將引發(fā)StopIteration,否則將返回該值。
iter()的第一種形式:不帶第二個參數(shù),第一個參數(shù)表示可迭代對象(具有__iter__()方法或者_(dá)_getitem__()方法)
#自定義兩個類,一個支持__iter__()方法,一個支持__getitem__()方法 #1.定義一個支持迭代協(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ù)是返回自己,同時定義了自身的__next__()方法,所以對象a既是可迭代對象,又是迭代器。 isinstance(a,Iterable) >>> True isinstance(a,Iterator) >>> True #同時我們可以看到對象a經(jīng)過iter()方法后生成的b對象是迭代器。 isinstance(b,Iterator) >>> True isinstance(b,Iterable) >>> True #定義一個支持序列協(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()的第二種形式:帶第二個參數(shù),第一個參數(shù)表示可調(diào)用對象,當(dāng)返回值為第二個參數(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確實迭代器 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()的第二種形式的一個有用的應(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__()方法;也可以返回其他對象的迭代器 #第一種:返回自身,同時定義自身的__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ù)是返回自己,同時定義了自身的__next__()方法,所以對象a既是可迭代對象,又是迭代器。 isinstance(a,Iterable) >>> True isinstance(a,Iterator) >>> True #同時我們可以看到對象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 #實例化兩個對象:a和b,當(dāng)調(diào)用對象a的__iter__()方法時,返回對象b,B繼承于A類,所以b對象是一個迭代器。 a = A() b = B() #調(diào)用a的__iter__()方法 c = a.__iter__() from collections import Iterable,Iterator #由于對象a不具備__next__()方法,因此僅僅是一個可迭代對象 isinstance(a,Iterable) >>> True isinstance(a,Iterator) >>> False #但是調(diào)用對象a的__iter()方法生成的c,同時具備__iter__()和__next__()方法,是一個迭代器。 isinstance(c,Iterable) >>> True isinstance(c,Iterator) >>> True
上面兩種方式表示可以生成迭代器,但并不是使用這兩個函數(shù)就一定生成迭代器,這取決于運行這兩個函數(shù)返回的是什么
#iter()函數(shù):其運行機制是尋找對象中的__iter__()方法,運行并返回結(jié)果,如果__iter__()方法返回的不是迭代器,則此方法會報錯;如果沒有此方法,則尋找__getitem__()方法。 class A(): def __init__(self): pass def __iter__(self): return 1 #我們知道數(shù)字1不是迭代器,此函數(shù)返回的是一個非迭代器 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ù)下返回一個迭代器;如果定義返回的不是迭代器,調(diào)用此方法是不會生成迭代器的。 class A(): def __init__(self): pass def __iter__(self): return 1 a = A() #直接調(diào)用__iter__()方法 b = a.__iter__() #我們可以看到返回的是1,而不是迭代器,只有當(dāng)你定義返回迭代器時,調(diào)用此方法才會返回迭代器 print(b) >>> 1
判斷對象是否是可迭代對象:
1.collections模塊的Iterable類型,使用isinstance()判斷(此方法不太準(zhǔn))
#我們定義一個類:具有__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)為他是一個可迭代對象 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' #接下來,我們再定義一個類:具有__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)為他是一個迭代器 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 = 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)的實質(zhì)是:先調(diào)用對象的__iter__()方法,返回一個迭代器,然后不斷的調(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__()方法,返回一個迭代器,然后不斷的調(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__()方法,而不注重這兩個函數(shù)所返回的內(nèi)容。
2.相比于collections模塊,iter()函數(shù)則與其不同,它更注重__iter__()函數(shù)返回的內(nèi)容,如果返回的是迭代器,則iter()的參數(shù)即為可迭代對象,否則,使用iter()函數(shù)會報錯。此方法比較常用,也相對好用。
3.for…in循環(huán)方法,也可以用來判斷對象是否是可迭代對象,此方法本質(zhì)就是調(diào)用對象__iter__()和__next__()方法,他同樣注重函數(shù)的返回內(nèi)容。
經(jīng)過以上種種實例的分析,我們發(fā)現(xiàn)僅僅具有__iter__()和__next__方法并不能算真正意義上的可迭代對象或者迭代器,如果不注重方法返回的內(nèi)容,實例化的對象卻不能進(jìn)行迭代訪問,又怎么能稱為可迭代對象和迭代器呢?因此我們在這里對可迭代對象和迭代器進(jìn)行重新定義
類型 | 定義 | 判斷方法 |
---|---|---|
- 可迭代對象 | 內(nèi)部定義了__iter__()方法且返回迭代器,可以返回自己也可以返回其他迭代器,如果返回自己,則自己還必須定義__next__()方法;也可以是定義__getitem__()方法的序列,整數(shù)參數(shù)可以從0進(jìn)行索引,一般來說,標(biāo)準(zhǔn)的序列均定義了__iter__()方法,所以序列也是符合可迭代對象的要求的 | 可以使用iter()方法進(jìn)行判斷,將對象作為參數(shù)輸入,如果不報錯則為可迭代對象;反之,則不是。除此之外,使用for循環(huán)進(jìn)行遍歷,也可以識別;還有就是能夠看到對象的源碼,直接根據(jù)定義進(jìn)行判斷 |
迭代器 | 內(nèi)部定義了__iter__()方法,與可迭代對象不同的是,對象的__iter__()方法必須返回的是自己,同時自己定義了__next__()方法 | 如果是迭代器,是可以調(diào)用__next__()方法的,調(diào)用所有元素后,拋出StopIteration錯誤;判斷Iterator最好是能夠看到源碼,直接根據(jù)定義判斷。 |
generator – 生成器:
生成器是一個用于創(chuàng)建迭代器的簡單而強大的工具。它們的寫法類似于標(biāo)準(zhǔn)的函數(shù),但當(dāng)它們要返回數(shù)據(jù)時會使用yield 語句。每次在生成器上調(diào)用next() 時,它會從上次離開的位置恢復(fù)執(zhí)行(它會記住上次執(zhí)行語句時的所有數(shù)據(jù)值)。
可以用生成器來完成的操作同樣可以用基于類的迭代器來完成。 但生成器的寫法更為緊湊,因為它會自動創(chuàng)建 iter() 和 next() 方法。
另一個關(guān)鍵特性在于局部變量和執(zhí)行狀態(tài)會在每次調(diào)用之間自動保存。 這使得該函數(shù)相比使用 self.index 和 self.data 這種實例變量的方式更易編寫且更為清晰。
除了會自動創(chuàng)建方法和保存程序狀態(tài),當(dāng)生成器終結(jié)時,它們還會自動引發(fā) StopIteration。 這些特性結(jié)合在一起,使得創(chuàng)建迭代器能與編寫常規(guī)函數(shù)一樣容易。
def A(): yield 1 yield 2 a = A() print(a) #可以看出a顯示的是一個生成器對象 <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ù)運行的,返回的是2,而不是像普通函數(shù)一樣,從頭開始重新運行 next(a) >>> 2 next(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration #可以看到生成器a調(diào)用next()方法后生成下一個元素,同時當(dāng)元素耗盡時,拋出StopIteration錯誤,這和迭代器完全相似 #生成器完全符合迭代器的要求,所以生成器也屬于迭代器
除了定義一個yield函數(shù)外,還可以利用推導(dǎo)式生成一個生成器
#一般的推導(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)式,自動實現(xiàn)__iter__()和__next__()方法 | 根據(jù)定義判斷 |
1.生成器是一種特殊的迭代器,其內(nèi)部自動實現(xiàn)__iter__()和__next__()方法,可用for循環(huán)遍歷輸出;
2.迭代器一定是可迭代對象,但可迭代對象不一定是迭代器。
迭代器存在的意義:
在說明迭代器之前,我們需要引入一個容器的概念。什么是容器?容器是眾多對象(在python中對象的抽象是類class)的集合,根據(jù)存儲方式不同,python可分為四種容器:
列表(list):對象以隊列方式進(jìn)行存儲 元組(tuple):對象以隊列方式進(jìn)行存儲,和列表一樣,只是存儲數(shù)據(jù)后,不可更改, 集合(set):對象以無序的方式進(jìn)行存儲 字典(dict):對象以鍵值對映射的方式存儲數(shù)據(jù)
在編程中,最常見的操作就是從這些容器中拿出數(shù)據(jù)。而容器一般是不具備取出數(shù)據(jù)的功能的。我們平時取出數(shù)據(jù)的操作實際上是先經(jīng)過__iter__()方法轉(zhuǎn)為迭代器,之后再通過__next__()方法拿取的(參考for循環(huán),map(),filter())??梢哉f迭代器賦予了容器取出數(shù)據(jù)的能力,但迭代器每次調(diào)用__next__()方法只能取出一個數(shù)據(jù),這種方法顯然是很笨拙的,于是引入for循環(huán),每次循環(huán)自動調(diào)用__next__()方法,這使得訪問容器中的對象變得十分方便。
個人理解:迭代器的存在類似指針。
迭代器具有__iter__()方法就好比具備存放指針的資格,而__next__()方法,表示指針調(diào)度的規(guī)則。每次訪問容器中的元素,首先調(diào)用__iter__()方法在容器元素頭部放一個指針,此指針不指向任何元素,位于所有元素前面,為待操作狀態(tài),隨時準(zhǔn)備被調(diào)用。然后通過__next__()方法制定的規(guī)則來調(diào)度這個指針,使其指向不同的對象,指針?biāo)钢幈闶撬L問對象。此指針默認(rèn)有一些屬性:只能向前,不能回退,當(dāng)沒有元素時,拋出StopIteration,過程結(jié)束。
使用迭代器一個明顯的優(yōu)勢是:減少內(nèi)存占用
不使用迭代器:如果我們想訪問一個容器中的所有元素,就需要將所有的元素都加載到內(nèi)存中,然后一次性打印,對于少量元素來說,這無關(guān)緊要,但當(dāng)數(shù)據(jù)量非常大時,這種做法將占用很大的內(nèi)存,影響程序性能。
使用迭代器:我們訪問一個容器中的所有元素,不會將所有元素都加載出來,而是一個一個的加載,然后打印,這樣會極大的減少內(nèi)存的占用。
生成器存在的意義:
生成器的存在,給我更多的感受是:簡化迭代器的生成。我們只需使用yield關(guān)鍵字,將數(shù)據(jù)處理的邏輯寫出,對象內(nèi)部將自動完成對__iter__()和__next__()方法的定義,使我們不用再耗費精力處理實例變量,以及自己定義__iter__()和__next__()方法。
特性:
1.生成器中的成員并不存在,使用一個成員立刻用yield生成一個成員(按需計算)
2.生成器很節(jié)省內(nèi)存,因為是立刻生成的,所以耗費CPU進(jìn)行計算;
到此這篇關(guān)于python學(xué)習(xí)之可迭代對象、迭代器、生成器的文章就介紹到這了,更多相關(guān)python可迭代對象、迭代器、生成器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
蘋果Macbook Pro13 M1芯片安裝Pillow的方法步驟
Pillow作為python的第三方圖像處理庫,提供了廣泛的文件格式支持,本文主要介紹了蘋果Macbook Pro13 M1芯片安裝Pillow,具有一定的參考價值,感興趣的可以了解一下2021-11-11Python 運行.py文件和交互式運行代碼的區(qū)別詳解
這篇文章主要介紹了Python 運行.py文件和交互式運行代碼的區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07基于Python實現(xiàn)報表自動化并發(fā)送到郵箱
作為數(shù)據(jù)分析師,我們需要經(jīng)常制作統(tǒng)計分析圖表。但是報表太多的時候往往需要花費我們大部分時間去制作報表。本文將利用Python實現(xiàn)報表自動化并發(fā)送到郵箱,需要的可以參考一下2022-07-07Python過濾txt文件內(nèi)重復(fù)內(nèi)容的方法
今天小編就為大家分享一篇Python過濾txt文件內(nèi)重復(fù)內(nèi)容的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10sklearn和keras的數(shù)據(jù)切分與交叉驗證的實例詳解
這篇文章主要介紹了sklearn和keras的數(shù)據(jù)切分與交叉驗證的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06