今天咱們學習Python的高級特性、模塊和IO操做,經過學習這些,咱們能夠更快的瞭解Python,使用Python。python
高級特性中會講述列表生成式、生成器、和一些高級函數,學習這些方便咱們快速的生成列表,節省咱們使用Python的時間,更快的使用Python達成咱們的目的。json
模塊是咱們調用包含函數和變量的文件,咱們能夠經過學習Python中的模塊,明白如何使用和安裝Python系統中的內置模塊、自定義的模塊以及第三方開源的模塊。緩存
IO操做是在Python中對文件進行讀取,寫入,和關閉的操做,咱們能夠在Python中經過IO操做快速的對文件進行操做。網絡
高級特性函數
1.列表生成式工具
相信經過以前的學習,你們對列表已經比較熟悉了,在Python中,咱們能夠經過一些列表生成式來快速的生成咱們須要的列表,用來節省時間,下面咱們就介紹一些簡單快捷的列表生成式。學習
1.1生成1-10的列表編碼
range函數的做用是建立一個整數列表,通常呢是用在 for 循環中。Range的參數爲range(start, stop[, step]),也就是range(開始參數(真包含),結束參數(假包含),步長),其中假包含和真包含的意思我們在以前已經解釋過了,這裏也就再也不解釋了,不明白的能夠去看前面的帖子。spa
1.2生成一個20之內爲奇數的列表操作系統
公式的意思爲生成一個長度爲20,當x/2的餘數爲1的列表,其中%的意思爲取餘數,以前也講過,這裏也就再也不重複。
1.3生成一個長度爲10,取每一個值得平方的列表
同理將xx改成x*2也能夠生成相同的列表。
1.4生成一個對應元素依次相加的列表
首先定義兩個列表,而後x從a中取值,y從b中取值,取出值後,x內的值在對應加上字符串格式的y,最終結果就取出了對應元素相加依次的列表。
1.5生成對應元素相加的列表
這個生成式和上面的生成式差很少,可是上面那個是依次相加,這個爲對應相加,其中 zip函數用於將可迭代的對象做爲參數,將對象中對應的元素打包成一個個元組,而後返回由這些元組組成的對象,也就是每個的單獨的對象去相加,這樣作的好處是節約了很多的內存。若是要使用列表可使用 list 轉換來輸出列表。若是各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同,利用 * 號操做符,能夠將元組解壓爲列表。
2.生成器
咱們能夠經過上面學到的生成式,直接建立一個列表,可是受到內存的限制,列表的容量確定是有限的,可是生成器在循環的過程當中不斷推算出後續的元素,沒有必要建立完整的list。也就是直接將列表賦值給一個值,而後在調用就好。
或者也能夠經過建立函數的方式來建立生成器,在Python中,使用了yield 的函數被稱爲生成器(generator)。跟普通函數不一樣的是,生成器是一個返回迭代器的函數,只能用於迭代操做,更簡單點理解生成器就是一個迭代器。在調用生成器運行的過程當中,每次遇到yield時函數會暫停並保存當前全部的運行信息,返回 yield 的值, 並在下一次執行 next 方法時從當前位置繼續運行。調用一個生成器函數,返回的是一個迭代器對象。
3.Python中的一些高級函數
雖然咱們如今是有關Python基礎的教學,可是咱們仍是要講一點高級的東西的,否則怎麼才能上檔次呢,接下來咱們就介紹一下有關Python中的一些經常使用的高級函數。
3.1 map函數
Map函數的做用是接收兩個參數,一個是函數,一個lterable0,map將傳入的函數依次做用到序列的每一個元素,而且把結果做爲新的lterator返回。
因爲結果呢是一個lterator,lterator是一個惰性的序列,所以經過list函數讓它把整個序列都計算出來,並返回一個list
3.2 reduce函數
reduce 函數會對參數序列中元素進行累積,函數將一個數據集合(鏈表,元組等)中的全部數據進行下列操做:用傳給 reduce 中的函數 function(有兩個參數)先對集合中的第 一、2 個元素進行操做,獲得的結果再與第三個數據用 function 函數運算,最後獲得一個結果。Function有三個參數, Function(函數function,iterable可迭代對象,initializer初始參數(可選))
Reduce把一個函數做用在一個序列[x1,x2,x3,…]上,這個函數須要接受兩個參數,reduce把結果繼續和序列的下一個元素作累計計算。
固然也能夠手動指定初始的值
3.3 filter函數
Python中內建的filter函數是用於過濾序列。和map比較相似,filter也是接受一個函數和一個序列。可是和map不一樣的是,filter把傳入的函數依次做用於每一個函數,而後根據返回值是True仍是False決定保留仍是丟棄該元素。
跟Map相同,filter函數返回的是一個lterator,也就是一個惰性的xulie,因此咱們爲了讓filter完成計算結果,就必須用list函數得到全部結果並返回list。
3.4 zip函數
Zip函數咱們在上面已經講了原理,這裏也就再也不擴展開來說了。
3.5 sorted函數
Sorted函數也是一個高階函數,能夠按照方式進行排序
它還能夠經過接受參數來進行自定義的排序
Sort(iTerable(可迭代對象),key(進行比較的元素,只有一個參數),reverse(排序規則=True是降序 =False是升序,默認爲升序))
好比按照絕對值大小排序:
模塊
上面就是咱們的一些常常用到的有關Python的一些高級特性,下面咱們進入有關模塊的知識,若是咱們從Python的解釋器中退出在進入,那麼已經定義的全部方法和變量都已經消失了,因此爲了方便代碼的屢次使用,Python提供了一個辦法,把這些定義放在了文件之中,爲一些降本或者互相交互的解釋器示例使用,那麼這些文件就被稱爲了模塊。
模塊是一個包含全部定義的函數和變量的文件,它的後綴名爲.py。模塊是能夠被其餘的程序引用,而後使用這個模塊的函數的功能,這也是使用Python標準庫的方法。好比想要在Python中調用sqrt函數,必須用import關鍵字引入math這個模塊,說的簡單一點,模塊就是工具包,要想使用這個工具包中的工具,就須要導入這個模塊。
在Python中模塊分爲如下幾種:
系統內置的模塊,列入:sys、time、json模塊等等;
自定義模塊,自定義模塊是本身寫的模塊,對某段邏輯或某些函數進行封裝後供其餘函數調用。注意:自定義模塊的命名必定不能和系統內置的模塊重名了,不然將不能再導入系統的內置模塊了。例如:自定義了一個sys.py模塊後,再想使用系統的sys模塊是不能使用的;
第三方的開源模塊:這部分模塊能夠經過pip install進行安裝,有開源的代碼;
1.import
在Python中用關鍵字import來引入模塊,好比要用模塊math’,就能夠在文件最開始的地方用import math來引入,當解釋器遇到import語句,若是模塊在當前的搜索路徑就會被導入。在調用math模塊中的函數時,必須這樣引用:
模塊名 函數名
Import module1
咱們爲何在調用的時候必須加上模塊名進行調用呢?
由於可能存在這樣一種狀況:在多個模塊中含有相同名稱的函數,此時若是隻是經過函數名來調用,解釋器沒法知道到底要調用哪一個函數。因此若是像上述這樣引入模塊的時候,調用函數必須加上模塊名
一般狀況下,鼓勵每一個import語句只導入一個包方便理解和閱讀代碼。須要注意的是一個模塊只會被導入一次,無論執行了幾回import。這樣是爲了防止導入模塊一遍又一遍的執行。因此一個包被導入後源文件被修改是不會當即生效的,能夠經過重啓Python的方式或者顯式的重載包。
除了使用import以外也可使用from import語句
好比form pandas import DataFrame,series, 經過這種方式引入的時候,調用函數時只能給出函數名,不能給出模塊名,可是當兩個模塊中含有相同名稱函數的時候,後面一次引入會覆蓋前一次引入。也就是說假如模塊A中有函數function,在模塊B中也有函數function,若是引入A中的function在先、B中的function在後,那麼當調用function函數的時候,是去執行模塊B中的function函數。除此以外,還有一個from 模塊名 import * 是把一個模塊的全部內容所有導入到當前的命名空間中去,可是具不推薦使用,由於這樣的話就不知道那些命名被導入到當前的空間了。
2.第三方包的管理
在Python中還有一些非內置的包,好比pandas等,須要本身額外安裝。(若是安裝的Anaconda的話就不用安裝了,由於Anaconda已經給咱們提早安裝了經常使用的數據分析的包,這也是Anaconda的好處。)
如何安裝非內置的包呢,在Cmd命令行下執行:
Conda install packagename(包名稱)
或者
Pip install packagename(包名稱)
第一個的話若是是在使用conda的管理工具優先選擇的,由於他有更好的包的相互依賴的管理機制。
若是在conda內找不到相對應的包,那麼則使用下面的pip工具,pip工具的安裝包來源是PyPl – the python package index
(https://pypi.python.org/pypi(...://pypi.python.org/pypi))
3.導入本身編寫的模塊內容
在安裝了第三方庫的狀況下,能夠直接使用import packagename(模塊名)來導入使用,可是有些狀況下,咱們須要導入本身編寫的一些文件做爲包使用。
當咱們使用import語句的時候,python的解釋器是如何找到對應的文件呢?這裏邊就涉及到了Python的搜索路徑,搜索路徑是由一系列的目錄名組成的,python解釋器就依次從這些目錄中去尋找所引入的模塊,看起來很像環境變量,事實上,也能夠經過定義環境變量的方式來肯定搜索路徑。
Sys.path輸出的是一個列表,其中第一項是空串」,表明當前目錄,就是咱們執行Python解釋器的目錄(對於腳本的話就是運行的腳本所在的目錄)。因此在使用本身編寫的文件最方便的方式就是把文件放在當前路徑下,小編在這裏並不建議將本身編寫的模塊放入到一些系統默認的相關路徑下,最好是把本身全部編寫的文件放入到一個固定的文件夾下,方便管理與查看,運行代碼前把這個文件夾的路徑放入到sys.path中。
這個文件在當前路徑下被導入
這個文件是從被添加的路徑中直接導入,而不是當前的路徑。
須要注意,添加的sys.path只在當前生效,下次運行須要從新導入。
講了這麼多,你們應該也明白了模塊了吧,那麼模塊的優勢有哪些呢:
提升了代碼的可維護性;
一個模塊編寫完畢以後,其餘模塊直接調用,不用再從零開始寫代碼了,節約了工做時間;
避免函數名稱和變量名稱重複,在不一樣的模塊中能夠存在相同名字的函數名和變量名,可是,切記,不要和系統內置的模塊名稱重複;
IO操做
IO在計算機中值input/output,也就是輸入和輸出。因爲程序和運行時數據是在個駐留,由CPU這個計算核心來執行,涉及到數據交換的地方,一般是磁盤,網絡等,就須要到IO接口。
文件讀寫
文件讀寫是最多見的IO操做。Python內置了讀寫文件的函數,用法和C是兼容的。在讀寫文件以前,咱們首先須要瞭解一點知識,那就是在磁盤上讀寫文件的功能都是由操做系統提供的,現代的操做系統不容許普通的程序直接操做磁盤,因此,讀寫文件就是請求操做系統打開一個文件對象(一般呢成爲文件描述符),而後經過操做系統提供的接口從這個文件對象中讀取數據(讀文件),或者把數據寫入到這個文件對象(寫文件)。
1.1讀文件
要讀文件呢,就要以讀文件的模式打開一個文件對象,使用Python內置的open函數,傳入文件名和標識符:
其中標識符:
「r」表示只讀.就是讀取文件,若是不設置標識符的話就是默認爲只讀。
「w」表示寫入.以覆蓋的方式寫入文件。
「x」表示建立一個新的文件,打開並寫入
「a」表示打開並在文件的尾部追加內容(若是文件存在),與add相似
「b」表示二進制模式
「t」表示文本模式(默認值)
「+」表示讀取並寫入
系統的默認值爲」rt」也就是文本模式讀取。若是文件打開成功,接下來調用Read方法能夠一次性讀取文件的所有內容。
最後一步是調用Close方法關閉文件。文件使用完畢後必須關閉!!!!
因爲文件讀寫時都有可能出現錯誤,那麼後面的f.close就不會調用。因此爲了保證不管是否出錯都能正確的關閉文件,咱們可使用try...finally來實現:
其中調用的Readline每次會讀取文件的一行,若是調用Readlines一次性讀取全部內容並按行返回list。爲了文件的打開關閉更方便,咱們也可使用with語句來自動幫咱們調用Close方法:
1.2字符編碼
若是咱們要讀取非UTF-8編碼的文本文件,那麼須要給open函數傳入Encoding參數,例如上面的文件是有亂碼的:
對於這種狀況應該怎麼辦呢,咱們可使用一個針對文本類文件專門用來作編碼推斷的包:Chardet
打開文件須要使用二進制的方式,才能推斷文本類的文件編碼。
1.3寫文件
寫文件呢和讀文件實際上是同樣的,惟一的區別就是調用open函數時,傳入標識符」w」或者」wb」表示寫文本文件或寫二進制文件:
能夠反覆的使用Write來寫入文件,可是須要使用f.close來關閉文件,當咱們寫文件時,操做系統並不會馬上把文件寫入磁盤,而是先放到內存裏邊緩存起來,空閒的時候在慢慢寫入。只有調用close方法時,操做系統纔會立刻將沒有寫入的數據寫入磁盤,忘記調用close的後果是數據可能就只寫入了一步分到磁盤,剩下的就丟掉了。
因此這個時候使用with語句就是很保險的方式,使用with語句操做文件IO是一個特別好的習慣。
1.4文件的刪除重命名
有時候,須要對文件進行重命名、刪除等一些的操做,在Python的os模塊中都有這些功能
Os模塊中的rename能夠完成對文件的重命名操做,rename(須要修改的文件名,新的文件名)
Os模塊中的remove能夠完成對文件的刪除操做,remove(待刪除的文件名)
2.操做文件和目錄
要獲取某個環境變量的值,能夠調用os.environ.get(‘key’)
獲取當前的路徑
3.JSON數據解析
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。它基於ECMAscript的一個子集。
Python3中可使用json模塊對JSON數據進行編解碼,它包含了兩個函數:
Json.dumps:對數據進行編碼
Josn.loads:對數據進行解碼
Python內置的json模塊提供了很是完善的Python對象到JSON格式的轉換。