摘要:所以如果像上述這樣引入模塊的時(shí)候,調(diào)用函數(shù)必須加上模塊名通常情況下鼓勵(lì)每個(gè)語(yǔ)句只導(dǎo)入一個(gè)包方便理解和閱讀代碼。
今天我們學(xué)習(xí)Python的高級(jí)特性、模塊和IO操作,通過(guò)學(xué)習(xí)這些,我們可以更快的了解Python,使用Python。
高級(jí)特性中會(huì)講述列表生成式、生成器、和一些高級(jí)函數(shù),學(xué)習(xí)這些方便我們快速的生成列表,節(jié)省我們使用Python的時(shí)間,更快的使用Python達(dá)成我們的目的。
模塊是我們調(diào)用包含函數(shù)和變量的文件,我們可以通過(guò)學(xué)習(xí)Python中的模塊,明白如何使用和安裝Python系統(tǒng)中的內(nèi)置模塊、自定義的模塊以及第三方開源的模塊。
IO操作是在Python中對(duì)文件進(jìn)行讀取,寫入,和關(guān)閉的操作,我們可以在Python中通過(guò)IO操作快速的對(duì)文件進(jìn)行操作。
高級(jí)特性
1.列表生成式
相信通過(guò)之前的學(xué)習(xí),大家對(duì)列表已經(jīng)比較熟悉了,在Python中,我們可以通過(guò)一些列表生成式來(lái)快速的生成我們需要的列表,用來(lái)節(jié)省時(shí)間,下面我們就介紹一些簡(jiǎn)單快捷的列表生成式。
1.1生成1-10的列表
range函數(shù)的作用是創(chuàng)建一個(gè)整數(shù)列表,一般呢是用在 for 循環(huán)中。Range的參數(shù)為range(start, stop[, step]),也就是range(開始參數(shù)(真包含),結(jié)束參數(shù)(假包含),步長(zhǎng)),其中假包含和真包含的意思咱們?cè)谥耙呀?jīng)解釋過(guò)了,這里也就不再解釋了,不明白的可以去看前面的帖子。
1.2生成一個(gè)20以內(nèi)為奇數(shù)的列表
公式的意思為生成一個(gè)長(zhǎng)度為20,當(dāng)x/2的余數(shù)為1的列表,其中%的意思為取余數(shù),之前也講過(guò),這里也就不再重復(fù)。
1.3生成一個(gè)長(zhǎng)度為10,取每個(gè)值得平方的列表
同理將xx改為x*2也可以生成相同的列表。
1.4生成一個(gè)對(duì)應(yīng)元素依次相加的列表
首先定義兩個(gè)列表,然后x從a中取值,y從b中取值,取出值后,x內(nèi)的值在對(duì)應(yīng)加上字符串格式的y,最終結(jié)果就取出了對(duì)應(yīng)元素相加依次的列表。
1.5生成對(duì)應(yīng)元素相加的列表
這個(gè)生成式和上面的生成式差不多,但是上面那個(gè)是依次相加,這個(gè)為對(duì)應(yīng)相加,其中 zip函數(shù)用于將可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)元組,然后返回由這些元組組成的對(duì)象,也就是每一個(gè)的多帶帶的對(duì)象去相加,這樣做的好處是節(jié)約了不少的內(nèi)存。如果要使用列表可以使用 list 轉(zhuǎn)換來(lái)輸出列表。如果各個(gè)迭代器的元素個(gè)數(shù)不一致,則返回列表長(zhǎng)度與最短的對(duì)象相同,利用 * 號(hào)操作符,可以將元組解壓為列表。
2.生成器
我們可以通過(guò)上面學(xué)到的生成式,直接創(chuàng)建一個(gè)列表,但是受到內(nèi)存的限制,列表的容量肯定是有限的,但是生成器在循環(huán)的過(guò)程中不斷推算出后續(xù)的元素,沒(méi)有必要?jiǎng)?chuàng)建完整的list。也就是直接將列表賦值給一個(gè)值,然后在調(diào)用就好。
或者也可以通過(guò)創(chuàng)建函數(shù)的方式來(lái)創(chuàng)建生成器,在Python中,使用了yield 的函數(shù)被稱為生成器(generator)。跟普通函數(shù)不同的是,生成器是一個(gè)返回迭代器的函數(shù),只能用于迭代操作,更簡(jiǎn)單點(diǎn)理解生成器就是一個(gè)迭代器。在調(diào)用生成器運(yùn)行的過(guò)程中,每次遇到y(tǒng)ield時(shí)函數(shù)會(huì)暫停并保存當(dāng)前所有的運(yùn)行信息,返回 yield 的值, 并在下一次執(zhí)行 next 方法時(shí)從當(dāng)前位置繼續(xù)運(yùn)行。調(diào)用一個(gè)生成器函數(shù),返回的是一個(gè)迭代器對(duì)象。
3.Python中的一些高級(jí)函數(shù)
雖然我們現(xiàn)在是有關(guān)Python基礎(chǔ)的教學(xué),但是我們還是要講一點(diǎn)高級(jí)的東西的,不然怎么才能上檔次呢,接下來(lái)我們就介紹一下有關(guān)Python中的一些常用的高級(jí)函數(shù)。
3.1 map函數(shù)
Map函數(shù)的作用是接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)lterable0,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并且把結(jié)果作為新的lterator返回。
由于結(jié)果呢是一個(gè)lterator,lterator是一個(gè)惰性的序列,因此通過(guò)list函數(shù)讓它把整個(gè)序列都計(jì)算出來(lái),并返回一個(gè)list
3.2 reduce函數(shù)
reduce 函數(shù)會(huì)對(duì)參數(shù)序列中元素進(jìn)行累積,函數(shù)將一個(gè)數(shù)據(jù)集合(鏈表,元組等)中的所有數(shù)據(jù)進(jìn)行下列操作:用傳給 reduce 中的函數(shù) function(有兩個(gè)參數(shù))先對(duì)集合中的第 1、2 個(gè)元素進(jìn)行操作,得到的結(jié)果再與第三個(gè)數(shù)據(jù)用 function 函數(shù)運(yùn)算,最后得到一個(gè)結(jié)果。Function有三個(gè)參數(shù), Function(函數(shù)function,iterable可迭代對(duì)象,initializer初始參數(shù)(可選))
Reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1,x2,x3,…]上,這個(gè)函數(shù)需要接受兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累計(jì)計(jì)算。
當(dāng)然也可以手動(dòng)指定初始的值
3.3 filter函數(shù)
Python中內(nèi)建的filter函數(shù)是用于過(guò)濾序列。和map比較類似,filter也是接受一個(gè)函數(shù)和一個(gè)序列。但是和map不同的是,filter把傳入的函數(shù)依次作用于每個(gè)函數(shù),然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。
跟Map相同,filter函數(shù)返回的是一個(gè)lterator,也就是一個(gè)惰性的xulie,所以我們?yōu)榱俗宖ilter完成計(jì)算結(jié)果,就必須用list函數(shù)獲得所有結(jié)果并返回list。
3.4 zip函數(shù)
Zip函數(shù)我們?cè)谏厦嬉呀?jīng)講了原理,這里也就不再擴(kuò)展開來(lái)講了。
3.5 sorted函數(shù)
Sorted函數(shù)也是一個(gè)高階函數(shù),可以按照方式進(jìn)行排序
它還可以通過(guò)接受參數(shù)來(lái)進(jìn)行自定義的排序
Sort(iTerable(可迭代對(duì)象),key(進(jìn)行比較的元素,只有一個(gè)參數(shù)),reverse(排序規(guī)則=True是降序 =False是升序,默認(rèn)為升序))
比如按照絕對(duì)值大小排序:
模塊
上面就是我們的一些經(jīng)常用到的有關(guān)Python的一些高級(jí)特性,下面我們進(jìn)入有關(guān)模塊的知識(shí),如果我們從Python的解釋器中退出在進(jìn)入,那么已經(jīng)定義的所有方法和變量都已經(jīng)消失了,所以為了方便代碼的多次使用,Python提供了一個(gè)辦法,把這些定義放在了文件之中,為一些降本或者互相交互的解釋器示例使用,那么這些文件就被稱為了模塊。
模塊是一個(gè)包含所有定義的函數(shù)和變量的文件,它的后綴名為.py。模塊是可以被其他的程序引用,然后使用這個(gè)模塊的函數(shù)的功能,這也是使用Python標(biāo)準(zhǔn)庫(kù)的方法。比如想要在Python中調(diào)用sqrt函數(shù),必須用import關(guān)鍵字引入math這個(gè)模塊,說(shuō)的簡(jiǎn)單一點(diǎn),模塊就是工具包,要想使用這個(gè)工具包中的工具,就需要導(dǎo)入這個(gè)模塊。
在Python中模塊分為以下幾種:
系統(tǒng)內(nèi)置的模塊,列入:sys、time、json模塊等等;
自定義模塊,自定義模塊是自己寫的模塊,對(duì)某段邏輯或某些函數(shù)進(jìn)行封裝后供其他函數(shù)調(diào)用。注意:自定義模塊的命名一定不能和系統(tǒng)內(nèi)置的模塊重名了,否則將不能再導(dǎo)入系統(tǒng)的內(nèi)置模塊了。例如:自定義了一個(gè)sys.py模塊后,再想使用系統(tǒng)的sys模塊是不能使用的;
第三方的開源模塊:這部分模塊可以通過(guò)pip install進(jìn)行安裝,有開源的代碼;
1.import
在Python中用關(guān)鍵字import來(lái)引入模塊,比如要用模塊math’,就可以在文件最開始的地方用import math來(lái)引入,當(dāng)解釋器遇到import語(yǔ)句,如果模塊在當(dāng)前的搜索路徑就會(huì)被導(dǎo)入。在調(diào)用math模塊中的函數(shù)時(shí),必須這樣引用:
模塊名 函數(shù)名
Import module1
我們?yōu)槭裁丛谡{(diào)用的時(shí)候必須加上模塊名進(jìn)行調(diào)用呢?
因?yàn)榭赡艽嬖谶@樣一種情況:在多個(gè)模塊中含有相同名稱的函數(shù),此時(shí)如果只是通過(guò)函數(shù)名來(lái)調(diào)用,解釋器無(wú)法知道到底要調(diào)用哪個(gè)函數(shù)。所以如果像上述這樣引入模塊的時(shí)候,調(diào)用函數(shù)必須加上模塊名
通常情況下,鼓勵(lì)每個(gè)import語(yǔ)句只導(dǎo)入一個(gè)包方便理解和閱讀代碼。需要注意的是一個(gè)模塊只會(huì)被導(dǎo)入一次,不管執(zhí)行了幾次import。這樣是為了防止導(dǎo)入模塊一遍又一遍的執(zhí)行。所以一個(gè)包被導(dǎo)入后源文件被修改是不會(huì)立即生效的,可以通過(guò)重啟Python的方式或者顯式的重載包。
除了使用import之外也可以使用from import語(yǔ)句
比如form pandas import DataFrame,series, 通過(guò)這種方式引入的時(shí)候,調(diào)用函數(shù)時(shí)只能給出函數(shù)名,不能給出模塊名,但是當(dāng)兩個(gè)模塊中含有相同名稱函數(shù)的時(shí)候,后面一次引入會(huì)覆蓋前一次引入。也就是說(shuō)假如模塊A中有函數(shù)function,在模塊B中也有函數(shù)function,如果引入A中的function在先、B中的function在后,那么當(dāng)調(diào)用function函數(shù)的時(shí)候,是去執(zhí)行模塊B中的function函數(shù)。除此之外,還有一個(gè)from 模塊名 import * 是把一個(gè)模塊的所有內(nèi)容全部導(dǎo)入到當(dāng)前的命名空間中去,但是具不推薦使用,因?yàn)檫@樣的話就不知道那些命名被導(dǎo)入到當(dāng)前的空間了。
2.第三方包的管理
在Python中還有一些非內(nèi)置的包,比如pandas等,需要自己額外安裝。(如果安裝的Anaconda的話就不用安裝了,因?yàn)锳naconda已經(jīng)給我們提前安裝了常用的數(shù)據(jù)分析的包,這也是Anaconda的好處。)
如何安裝非內(nèi)置的包呢,在Cmd命令行下執(zhí)行:
Conda install packagename(包名稱)
或者
Pip install packagename(包名稱)
第一個(gè)的話如果是在使用conda的管理工具優(yōu)先選擇的,因?yàn)樗懈玫陌南嗷ヒ蕾嚨墓芾頇C(jī)制。
如果在conda內(nèi)找不到相對(duì)應(yīng)的包,那么則使用下面的pip工具,pip工具的安裝包來(lái)源是PyPl – the python package index
(https://pypi.python.org/pypi(...://pypi.python.org/pypi))
3.導(dǎo)入自己編寫的模塊內(nèi)容
在安裝了第三方庫(kù)的情況下,可以直接使用import packagename(模塊名)來(lái)導(dǎo)入使用,但是有些情況下,我們需要導(dǎo)入自己編寫的一些文件作為包使用。
當(dāng)我們使用import語(yǔ)句的時(shí)候,python的解釋器是如何找到對(duì)應(yīng)的文件呢?這里邊就涉及到了Python的搜索路徑,搜索路徑是由一系列的目錄名組成的,python解釋器就依次從這些目錄中去尋找所引入的模塊,看起來(lái)很像環(huán)境變量,事實(shí)上,也可以通過(guò)定義環(huán)境變量的方式來(lái)確定搜索路徑。
Sys.path輸出的是一個(gè)列表,其中第一項(xiàng)是空串”,代表當(dāng)前目錄,就是我們執(zhí)行Python解釋器的目錄(對(duì)于腳本的話就是運(yùn)行的腳本所在的目錄)。所以在使用自己編寫的文件最方便的方式就是把文件放在當(dāng)前路徑下,小編在這里并不建議將自己編寫的模塊放入到一些系統(tǒng)默認(rèn)的相關(guān)路徑下,最好是把自己所有編寫的文件放入到一個(gè)固定的文件夾下,方便管理與查看,運(yùn)行代碼前把這個(gè)文件夾的路徑放入到sys.path中。
這個(gè)文件在當(dāng)前路徑下被導(dǎo)入
這個(gè)文件是從被添加的路徑中直接導(dǎo)入,而不是當(dāng)前的路徑。
需要注意,添加的sys.path只在當(dāng)前生效,下次運(yùn)行需要重新導(dǎo)入。
講了這么多,大家應(yīng)該也明白了模塊了吧,那么模塊的優(yōu)點(diǎn)有哪些呢:
提高了代碼的可維護(hù)性;
一個(gè)模塊編寫完畢之后,其他模塊直接調(diào)用,不用再?gòu)牧汩_始寫代碼了,節(jié)約了工作時(shí)間;
避免函數(shù)名稱和變量名稱重復(fù),在不同的模塊中可以存在相同名字的函數(shù)名和變量名,但是,切記,不要和系統(tǒng)內(nèi)置的模塊名稱重復(fù);
IO操作
IO在計(jì)算機(jī)中值input/output,也就是輸入和輸出。由于程序和運(yùn)行時(shí)數(shù)據(jù)是在個(gè)駐留,由CPU這個(gè)計(jì)算核心來(lái)執(zhí)行,涉及到數(shù)據(jù)交換的地方,通常是磁盤,網(wǎng)絡(luò)等,就需要到IO接口。
文件讀寫
文件讀寫是最常見(jiàn)的IO操作。Python內(nèi)置了讀寫文件的函數(shù),用法和C是兼容的。在讀寫文件之前,我們首先需要了解一點(diǎn)知識(shí),那就是在磁盤上讀寫文件的功能都是由操作系統(tǒng)提供的,現(xiàn)代的操作系統(tǒng)不允許普通的程序直接操作磁盤,所以,讀寫文件就是請(qǐng)求操作系統(tǒng)打開一個(gè)文件對(duì)象(通常呢成為文件描述符),然后通過(guò)操作系統(tǒng)提供的接口從這個(gè)文件對(duì)象中讀取數(shù)據(jù)(讀文件),或者把數(shù)據(jù)寫入到這個(gè)文件對(duì)象(寫文件)。
1.1讀文件
要讀文件呢,就要以讀文件的模式打開一個(gè)文件對(duì)象,使用Python內(nèi)置的open函數(shù),傳入文件名和標(biāo)識(shí)符:
其中標(biāo)識(shí)符:
“r”表示只讀.就是讀取文件,如果不設(shè)置標(biāo)識(shí)符的話就是默認(rèn)為只讀。
“w”表示寫入.以覆蓋的方式寫入文件。
“x”表示創(chuàng)建一個(gè)新的文件,打開并寫入
“a”表示打開并在文件的尾部追加內(nèi)容(如果文件存在),與add類似
“b”表示二進(jìn)制模式
“t”表示文本模式(默認(rèn)值)
“+”表示讀取并寫入
系統(tǒng)的默認(rèn)值為”rt”也就是文本模式讀取。如果文件打開成功,接下來(lái)調(diào)用Read方法可以一次性讀取文件的全部?jī)?nèi)容。
最后一步是調(diào)用Close方法關(guān)閉文件。文件使用完畢后必須關(guān)閉!!!!
由于文件讀寫時(shí)都有可能出現(xiàn)錯(cuò)誤,那么后面的f.close就不會(huì)調(diào)用。所以為了保證無(wú)論是否出錯(cuò)都能正確的關(guān)閉文件,我們可以使用try...finally來(lái)實(shí)現(xiàn):
其中調(diào)用的Readline每次會(huì)讀取文件的一行,如果調(diào)用Readlines一次性讀取所有內(nèi)容并按行返回list。為了文件的打開關(guān)閉更方便,我們也可以使用with語(yǔ)句來(lái)自動(dòng)幫我們調(diào)用Close方法:
1.2字符編碼
如果我們要讀取非UTF-8編碼的文本文件,那么需要給open函數(shù)傳入Encoding參數(shù),例如上面的文件是有亂碼的:
對(duì)于這種情況應(yīng)該怎么辦呢,我們可以使用一個(gè)針對(duì)文本類文件專門用來(lái)做編碼推斷的包:Chardet
打開文件需要使用二進(jìn)制的方式,才能推斷文本類的文件編碼。
1.3寫文件
寫文件呢和讀文件其實(shí)是一樣的,唯一的區(qū)別就是調(diào)用open函數(shù)時(shí),傳入標(biāo)識(shí)符”w”或者”wb”表示寫文本文件或?qū)懚M(jìn)制文件:
可以反復(fù)的使用Write來(lái)寫入文件,但是需要使用f.close來(lái)關(guān)閉文件,當(dāng)我們寫文件時(shí),操作系統(tǒng)并不會(huì)立刻把文件寫入磁盤,而是先放到內(nèi)存里邊緩存起來(lái),空閑的時(shí)候在慢慢寫入。只有調(diào)用close方法時(shí),操作系統(tǒng)才會(huì)馬上將沒(méi)有寫入的數(shù)據(jù)寫入磁盤,忘記調(diào)用close的后果是數(shù)據(jù)可能就只寫入了一步分到磁盤,剩下的就丟掉了。
所以這個(gè)時(shí)候使用with語(yǔ)句就是很保險(xiǎn)的方式,使用with語(yǔ)句操作文件IO是一個(gè)特別好的習(xí)慣。
1.4文件的刪除重命名
有時(shí)候,需要對(duì)文件進(jìn)行重命名、刪除等一些的操作,在Python的os模塊中都有這些功能
Os模塊中的rename可以完成對(duì)文件的重命名操作,rename(需要修改的文件名,新的文件名)
Os模塊中的remove可以完成對(duì)文件的刪除操作,remove(待刪除的文件名)
2.操作文件和目錄
要獲取某個(gè)環(huán)境變量的值,可以調(diào)用os.environ.get(‘key’)
獲取當(dāng)前的路徑
3.JSON數(shù)據(jù)解析
JSON(JavaScript Object Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式。它基于ECMAscript的一個(gè)子集。
Python3中可以使用json模塊對(duì)JSON數(shù)據(jù)進(jìn)行編解碼,它包含了兩個(gè)函數(shù):
Json.dumps:對(duì)數(shù)據(jù)進(jìn)行編碼
Josn.loads:對(duì)數(shù)據(jù)進(jìn)行解碼
Python內(nèi)置的json模塊提供了非常完善的Python對(duì)象到JSON格式的轉(zhuǎn)換。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43614.html
摘要:具有以下基本同步原語(yǔ)子進(jìn)程提供了通過(guò)創(chuàng)建和管理子進(jìn)程的。雖然隊(duì)列不是線程安全的,但它們被設(shè)計(jì)為專門用于代碼。表示異步操作的最終結(jié)果。 Python的asyncio是使用 async/await 語(yǔ)法編寫并發(fā)代碼的標(biāo)準(zhǔn)庫(kù)。通過(guò)上一節(jié)的講解,我們了解了它不斷變化的發(fā)展歷史。到了Python最新穩(wěn)定版 3.7 這個(gè)版本,asyncio又做了比較大的調(diào)整,把這個(gè)庫(kù)的API分為了 高層級(jí)API和...
摘要:常規(guī)的使用來(lái)統(tǒng)計(jì)一段代碼運(yùn)行時(shí)間的例子輸出結(jié)果總結(jié)其實(shí)是一門特別人性化的語(yǔ)言,但凡在工程中經(jīng)常遇到的問(wèn)題,處理起來(lái)比較棘手的模式基本都有對(duì)應(yīng)的比較優(yōu)雅的解決方案。 python的高級(jí)特性 名詞與翻譯對(duì)照表 generator 生成器 iterator 迭代器 collection 集合 pack/unpack 打包/解包 decorator 裝飾器 context manager ...
摘要:蠎周刊年度最贊親俺們又來(lái)回顧又一個(gè)偉大的年份兒包去年最受歡迎的文章和項(xiàng)目如果你錯(cuò)過(guò)了幾期就這一期不會(huì)丟失最好的嗯哼還為你和你的準(zhǔn)備了一批紀(jì)念裇從這兒獲取任何時(shí)候如果想分享好物給大家在這兒提交喜歡我們收集的任何意見(jiàn)建議通過(guò)來(lái)吧原文 Title: 蠎周刊 2015 年度最贊Date: 2016-01-09 Tags: Weekly,Pycoder,Zh Slug: issue-198-to...
閱讀 1255·2023-04-25 18:57
閱讀 2142·2023-04-25 16:28
閱讀 3947·2021-11-24 09:39
閱讀 3641·2021-11-16 11:45
閱讀 1831·2021-10-13 09:40
閱讀 1272·2019-08-30 15:52
閱讀 1725·2019-08-30 10:57
閱讀 671·2019-08-29 16:55