摘要:所以如果像上述這樣引入模塊的時候,調用函數必須加上模塊名通常情況下鼓勵每個語句只導入一個包方便理解和閱讀代碼。
今天我們學習Python的高級特性、模塊和IO操作,通過學習這些,我們可以更快的了解Python,使用Python。
高級特性中會講述列表生成式、生成器、和一些高級函數,學習這些方便我們快速的生成列表,節省我們使用Python的時間,更快的使用Python達成我們的目的。
模塊是我們調用包含函數和變量的文件,我們可以通過學習Python中的模塊,明白如何使用和安裝Python系統中的內置模塊、自定義的模塊以及第三方開源的模塊。
IO操作是在Python中對文件進行讀取,寫入,和關閉的操作,我們可以在Python中通過IO操作快速的對文件進行操作。
高級特性
1.列表生成式
相信通過之前的學習,大家對列表已經比較熟悉了,在Python中,我們可以通過一些列表生成式來快速的生成我們需要的列表,用來節省時間,下面我們就介紹一些簡單快捷的列表生成式。
1.1生成1-10的列表
range函數的作用是創建一個整數列表,一般呢是用在 for 循環中。Range的參數為range(start, stop[, step]),也就是range(開始參數(真包含),結束參數(假包含),步長),其中假包含和真包含的意思咱們在之前已經解釋過了,這里也就不再解釋了,不明白的可以去看前面的帖子。
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(有兩個參數)先對集合中的第 1、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格式的轉換。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43614.html
摘要:具有以下基本同步原語子進程提供了通過創建和管理子進程的。雖然隊列不是線程安全的,但它們被設計為專門用于代碼。表示異步操作的最終結果。 Python的asyncio是使用 async/await 語法編寫并發代碼的標準庫。通過上一節的講解,我們了解了它不斷變化的發展歷史。到了Python最新穩定版 3.7 這個版本,asyncio又做了比較大的調整,把這個庫的API分為了 高層級API和...
摘要:常規的使用來統計一段代碼運行時間的例子輸出結果總結其實是一門特別人性化的語言,但凡在工程中經常遇到的問題,處理起來比較棘手的模式基本都有對應的比較優雅的解決方案。 python的高級特性 名詞與翻譯對照表 generator 生成器 iterator 迭代器 collection 集合 pack/unpack 打包/解包 decorator 裝飾器 context manager ...
摘要:蠎周刊年度最贊親俺們又來回顧又一個偉大的年份兒包去年最受歡迎的文章和項目如果你錯過了幾期就這一期不會丟失最好的嗯哼還為你和你的準備了一批紀念裇從這兒獲取任何時候如果想分享好物給大家在這兒提交喜歡我們收集的任何意見建議通過來吧原文 Title: 蠎周刊 2015 年度最贊Date: 2016-01-09 Tags: Weekly,Pycoder,Zh Slug: issue-198-to...
閱讀 1244·2023-04-25 18:57
閱讀 2127·2023-04-25 16:28
閱讀 3926·2021-11-24 09:39
閱讀 3631·2021-11-16 11:45
閱讀 1816·2021-10-13 09:40
閱讀 1260·2019-08-30 15:52
閱讀 1715·2019-08-30 10:57
閱讀 657·2019-08-29 16:55