1. 程式人生 > >你應該知道的Python3.6、3.7、3.8新特性

你應該知道的Python3.6、3.7、3.8新特性

很多人在學習了基本的Python語言知識後,就轉入應用階段了,後期很少對語言本身的新變化、新內容進行跟蹤學習和知識更新,甚至連已經發布了好幾年的Python3.6的新特性都缺乏瞭解。 本文列舉了Python3.6、3.7、3.8三個版本的新特性,學習它們有助於提高對Python的瞭解,跟上最新的潮流。 ## 一、Python3.6新特性 ### 1、新的格式化字串方式 新的格式化字串方式,即在普通字串前新增 `f` 或 `F` 字首,其效果類似於`str.format()`。比如 ```python name = "red" print(f"He said his name is {name}.") # 'He said his name is red.' ``` 相當於: ```Python print("He said his name is {name}.".format(**locals())) ``` 此外,此特性還支援巢狀欄位,比如: ```python import decimal width = 10 precision = 4 value = decimal.Decimal("12.34567") print(f"result: {value:{width}.{precision}}") #'result: 12.35' ``` ### 2、變數宣告語法 可以像下面一樣宣告一個變數並指定型別: ```python from typing import List, Dict primes: List[int] = [] captain: str # 此時沒有初始值 class Starship: stats: Dict[str, int] = {} ``` ### 3、數字的下劃線寫法 允許在數字中使用下劃線,以提高多位數字的可讀性。 ```python a = 1_000_000_000_000_000 # 1000000000000000 b = 0x_FF_FF_FF_FF # 4294967295 ``` 除此之外,字串格式化也支援`_`選項,以打印出更易讀的數字字串: ``` '{:_}'.format(1000000) # '1_000_000' '{:_x}'.format(0xFFFFFFFF) # 'ffff_ffff' ``` ### 4、非同步生成器 在Python3.5中,引入了新的語法 async 和 await 來實現協同程式。但是有個限制,不能在同一個函式體內同時使用 yield 和 await。Python3.6中,這個限制被放開了,允許定義非同步生成器: ```python async def ticker(delay, to): """Yield numbers from 0 to *to* every *delay* seconds.""" for i in range(to): yield i await asyncio.sleep(delay) ``` ### 5、非同步解析器 允許在列表list、集合set 和字典dict 解析器中使用 async 或 await 語法。 ``` result = [i async for i in aiter() if i % 2] result = [await fun() for fun in funcs if await condition()] ``` ### 6、新增加模組 標準庫(The Standard Library)中增加了一個新的模組:`secrets`。該模組用來生成一些安全性更高的隨機數,用於管理passwords, account authentication, security tokens, 以及related secrets等資料。 ### 7、其他新特性 - 新的 PYTHONMALLOC 環境變數允許開發者設定記憶體分配器,以及註冊debug鉤子等。 - asyncio模組更加穩定、高效,並且不再是臨時模組,其中的API也都是穩定版的了。 - typing模組也有了一定改進,並且不再是臨時模組。 - datetime.strftime 和 date.strftime 開始支援ISO 8601的時間識別符號%G, %u, %V。 - hashlib 和 ssl 模組開始支援OpenSSL1.1.0。 - hashlib模組開始支援新的hash演算法,比如BLAKE2, SHA-3 和 SHAKE。 - Windows上的 filesystem 和 console 預設編碼改為UTF-8。 - json模組中的 json.load() 和 json.loads() 函式開始支援 binary 型別輸入。 更多內容參考官方文件:[What's New In Python 3.6](https://docs.python.org/3.6/whatsnew/3.6.html) ## 二、Python3.7新特性 Python 3.7於2018年6月27日釋出, 包含許多新特性和優化,增添了眾多新的類,可用於資料處理、針對指令碼編譯和垃圾收集的優化以及更快的非同步I/O,主要如下: - 用類處理資料時減少樣板程式碼的資料類。 - 一處可能無法向後相容的變更涉及處理生成器中的異常。 - 面向直譯器的“開發模式”。 - 具有納秒解析度的時間物件。 - 環境中預設使用UTF-8編碼的UTF-8模式。 - 觸發偵錯程式的一個新的內建函式。 ### 1、新增內建函式breakpoint() 使用該內建函式,相當於通過程式碼的方式設定了斷點,會自動進入Pbd除錯模式。 如果在環境變數中設定`PYTHONBREAKPOINT=0`會忽略此函式。並且,pdb 只是眾多可用偵錯程式之一,你可以通過設定新的 **PYTHONBREAKPOINT** 環境變數來配置想要使用的偵錯程式。 下面有一個簡單例子,使用者需要輸入一個數字,判斷它是否和目標數字一樣: ```python """猜數字遊戲""" def guess(target): user_guess = input("請輸入你猜的數 >>> ") if user_guess == target: return "你猜對了!" else: return "猜錯了" if __name__ == '__main__': a = 100 print(guess(a)) ``` 不幸的是,即使猜的數和目標數一樣,列印的結果也是‘猜錯了’,並且沒有任何異常或錯誤資訊。 為了弄清楚發生了什麼,我們可以插入一個斷點,來除錯一下。以往一般通過print大法或者IDE的除錯工具,但現在我們可以使用 **breakpoint()**。 ```python """猜數字遊戲""" def guess(target): user_guess = input("請輸入你猜的數 >>> ") breakpoint() //加入這一行 if user_guess == target: return "你猜對了!" else: return "猜錯了" if __name__ == '__main__': a = 100 print(guess(a)) ``` 在 pdb 提示符下,我們可以呼叫 **locals()** 來檢視當前的本地作用域的所有變數。(pdb 有大量的命令,你也可以在其中執行正常的Python 語句) ```bash 請輸入你猜的數 >>> 100 > d:\work\for_test\py3_test\test.py(7)guess() -> if user_guess == target: (Pdb) locals() {'target': 100, 'user_guess': '100'} (Pdb) type(user