本文來自異步社群,作者xiaochao,名稱: Python3的這些新特性很友善
概述
随着Python在機器學習和資料科學領域的應用越來越廣泛,相關的Python庫也增長的非常快。但是Python本身存在一個非常要命的問題,就是Python2和Python3,兩個版本互不相容,而且Github上Python2的開源庫有很多不相容Python3,導緻大量的Python2的使用者不願意遷移到Python3。 Python3在很多方面都做出了改變,優化了Python2的很多不足,标準庫也擴充了很多内容,例如協程相關的庫。現在列舉一些Python3裡提供的功能,跟你更好的從Python2遷移到Python3的理由。 系統檔案路徑處理庫:pathlib 使用Python2的同學,應該都用過os.path這個庫,來處理各種各樣的路徑問題,比如拼接檔案路徑的函數:os.path.join(),用Python3,你可以使用pathlib很友善的完成這個功能:
類型提醒在複雜的項目中可以很好的幫助我們規避一些手誤或者類型錯誤,Python2的時候是靠IDE來識别,格式IDE識别方法不一緻,并且隻是識别,并不具備嚴格限定。例如有下面的代碼,參數可以是numpy.array , astropy.Table and astropy.Column, bcolz, cupy, mxnet.ndarray等等。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SN0MTO0YTNyMzNjBDO3Q2MyYzX2MjNwYTM1IzLcNDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
同樣上面的代碼,傳入pandas.Series類型的參數也是可以,但是運作時會出錯。
這還隻是一個函數,對于大型的項目,會有好多這樣的函數,代碼很容易就跑飛了。是以确定的參數類型對于大型項目來說非常重要,而Python2沒有這樣的能力,Python3可以。
目前,比如JetBrains家的PyCharm已經支援Type Hint文法檢查功能,如果你使用了這個IDE,可以通過IDE功能進行實作。如果你像我一樣,使用了SublimeText編輯器,那麼第三方工具mypy可以幫助到你。 PS:目前類型提醒對ndarrays/tensors支援不是很好。
運作時類型檢查:
正常情況下,函數的注釋處理了解代碼用,其他沒什麼用。你可以是用enforce來強制運作時檢查類型。
使用@特殊字元表示矩陣乘法
如下代碼:
使用@符号,整個代碼變得更可讀和友善移植到其他如numpy、tensorflow等庫。
**特殊字元來遞歸檔案路徑
在Python2中,遞歸查找檔案不是件容易的事情,即使使用glob庫,但是python3中,可以通過通配符簡單的實作。
和之前提到的pathlib一起使用,效果更好:
Print函數
列印到指定檔案
不使用join函數拼接字元串
重寫print函數
再比如下面的代碼
雖然上面這段代碼也能達到重寫print函數的目的,但是不推薦使用。
字元串格式化
python2提供的字元串格式化系統還是不夠好,太冗長麻煩,通常我們會寫這樣一段代碼來輸出日志資訊:
輸出的結果是:
python3.6的f-strings功能實作起來就簡單多了。
而且,在編寫查詢或生成代碼片段時非常友善:
嚴格排序
下面這些比較操作在python3裡是非法的
不同類型的資料無法排序
NLP Unicode問題
下面這段代碼在Python2裡運作失敗但是Python3會成功運作,Python3的字元串都是Unicode編碼,是以這樣對NLP來說很友善,再比如:
字典
CPython3.6+裡的dict預設的行為和orderdict很類似
同樣的,**kwargs字典内容的資料和傳入參數的順序是一緻的。
Iterable unpacking
更高性能的預設pickle engine
縮短到Python2時間的1/3
更安全的清單推導
更簡易的super()
Multiple unpacking
合并兩個Dict
Python3.5+不僅僅合并dict很友善,合并list等也很友善
整數類型
python2提供了兩個整數類型:int和long,python3隻提供有個整數類型:int,如下的代碼:
總結