你應該知道的Python3.6、3.7、3.8新特性
阿新 • • 發佈:2020-05-12
很多人在學習了基本的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