Python3的這些新特性很方便
概述
??隨著Python在機器學習和數據科學領域的應用越來越廣泛,相關的Python庫也增長的非常快。但是Python本身存在一個非常要命的問題,就是Python2和Python3,兩個版本互不兼容,而且Github上Python2的開源庫有很多不兼容Python3,導致大量的Python2的用戶不願意遷移到Python3。 ??Python3在很多方面都做出了改變,優化了Python2的很多不足,標準庫也擴充了很多內容,例如協程相關的庫。現在列舉一些Python3里提供的功能,跟你更好的從Python2遷移到Python3的理由。
系統文件路徑處理庫:pathlib
??使用Python2的同學,應該都用過os.path這個庫,來處理各種各樣的路徑問題,比如拼接文件路徑的函數:,用Python3,你可以使用pathlib很方便的完成這個功能:
相比與函數,pathlib更加安全、方便、可讀。pathlib還有很多其他的功能。
類型提醒: Type hinting
在Pycharm中,類型提醒是這個樣子的:
??類型提醒在複雜的項目中可以很好的幫助我們規避一些手誤或者類型錯誤,Python2的時候是靠IDE來識別,格式IDE識別方法不一致,並且只是識別,並不具備嚴格限定。例如有下面的代碼,參數可以是numpy.array , astropy.Table and astropy.Column, bcolz, cupy, mxnet.ndarray等等。
同樣上面的代碼,傳入pandas.Series類型的參數也是可以,但是運行時會出錯。
這還只是一個函數,對於大型的項目,會有好多這樣的函數,代碼很容易就跑飛了。所以確定的參數類型對於大型項目來說非常重要,而Python2沒有這樣的能力,Python3可以。
?目前,比如JetBrains家的PyCharm已經支持Type Hint語法檢查功能,如果你使用了這個IDE,可以通過IDE功能進行實現。如果你像我一樣,使用了SublimeText編輯器,那麼第三方工具mypy可以幫助到你。 ??PS:目前類型提醒對ndarrays/tensors支持不是很好。
運行時類型檢查:
正常情況下,函數的注釋處理理解代碼用,其他沒什麼用。你可以是用來強制運行時檢查類型。
使用@特殊字元表示矩陣乘法
如下代碼:
使用@符號,整個代碼變得更可讀和方便移植到其他如等庫。
**特殊字元來遞歸文件路徑
在Python2中,遞歸查找文件不是件容易的事情,即使使用glob庫,但是python3中,可以通過通配符簡單的實現。
和之前提到的一起使用,效果更好:
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,如下的代碼:
總結
python3提供了很多新的特性,方便我們編碼的同時,也帶來了更好的安全性和較高的性能。而且官方也一直推薦儘快遷移到python3。當然,遷移的代價因系統而異,希望這篇文章能對你遷移python2到python3有些幫助。
延伸推薦
※通俗易懂的分析如何用Python實現一隻小爬蟲,爬取拉勾網的職位信息
※Python你知多少?為什麼國家把它納入教學體系?
TAG:Python |