點擊上方“Python數據科學”,星標公衆號
重磅乾貨,第一時間送達
來源:.python.org
編輯:肖琴,轉自:新智元
Python 官網靜悄悄地發佈了一則大消息:正式發佈 Python 3.8.0!新版本較3.7版增加了一大波新功能和優化,來與 AI 大咖一起參與討論吧~
今天,Python 官網宣佈,正式發佈 Python 3.8.0!
Python 3.8.0 現已推出。
代表 Python 開發社區和 Python 3.8 發佈團隊,我們很高興地宣佈 Python 3.8.0 現在已經可以使用。
Python 3.8.0 是 Python 語言的最新正式版,包含許多新功能和優化。
Python 的大多數第三方庫也應該很快就會支持 3.8.0 軟件包。
有關 3.8 版本功能的更多信息,請參閱 “Python 3.8 新特性” 文檔。所有更改的詳細信息都可以在更改日誌中找到。
從 2019 年 12 月開始,3.8 系列的維護版本將定期每兩個月發佈一次。
我們希望您喜歡 Python 3.8!
感謝所有幫助 Python 開發和這些發佈的志願者!歡迎通過志願或組織捐贈支持 Python 軟件基金會的工作。
那麼,這次新發布的 Python 3.8.0 有哪些重要的改進呢?以下是是 Python 3.8 相比 3.7 的新增特性。
PEP 572,賦值表達式
PEP 570,僅限位置形參
PEP 587,Python 初始化配置(改進的嵌入)
PEP 590,Vectorcall:用於 CPython 的快速調用協議
PEP 578, Python Runtime Audit Hooks
PEP 574,具有外部數據緩衝區的 pickle 協議 5
與打字相關:PEP 591(最終限定詞),PEP 586(文學類型)和 PEP 589(TypedDict)
用於已編譯字節碼文件的並行文件系統緩存
調試構建使用與發佈構建相同的 ABI
f - 字符串支持 = 用於自動記錄表達式和調試文檔
在 Windows 上,默認 asyncio 事件循環現在是 ProactorEventLoop
在 macOS 上,spawn 啓動方法默認使用 multiprocessing
multiprocessing 現在可以使用共享內存段來避免進程之間的酸洗成本
typed_ast 被合併回 CPython
LOAD_GLOBAL 速度加快了 40%
pickle 現在默認使用協議 4,提高了性能
接下來,我們重點來看幾個(來自Python 3.8 文檔)。
賦值表達式
Python 3.8.0 有一個新的語法 :=,它將值賦給一個更大的表達式中的變量。它被親切地稱爲 “海象運算符”(walrus operator),因爲它長得像海象的眼睛和象牙。
海象
這個 “海象運算符” 在某些時候可以讓你的代碼更整潔,比如:
在這個示例中,賦值表達式可以避免調用 len () 兩次:
if (n := len(a)) > 10:
print(f"List is too long ({n} elements, expected <= 10)")
類似的益處還可出現在正則表達式匹配中需要使用兩次匹配對象的情況中,一次檢測用於匹配是否發生,另一次用於提取子分組:
discount = 0.0
if (mo := re.search(r'(\d+)% discount', advertisement)):
discount = float(mo.group(1)) / 100.0
此運算符也適用於配合 while 循環計算一個值來檢測循環是否終止,而同一個值又在循環體中再次被使用的情況:
# Loop over fixed length blocks
while (block := f.read(256)) != '':
process(block)
另一個值得介紹的用例出現於列表推導式中,在篩選條件中計算一個值,而同一個值又在表達式中需要被使用:
[clean_name.title() for name in names
if (clean_name := normalize('NFC', name)) in allowed_names]
請儘量將海象運算符的使用限制在清晰的場合中,以降低複雜性並提升可讀性。
瞭解詳情:https://www.python.org/dev/peps/pep-0572
(由 Morehouse 在 bpo-35224 中貢獻。)
僅限位置形參
新增了一個函數形參語法 / 用來指明某些函數形參必須使用僅限位置而非關鍵字參數的形式。這種標記語法與通過 help () 所顯示的使用 Larry Hastings 的 Argument Clinic 工具標記的 C 函數相同。
在下面的例子中,形參 a 和 b 爲僅限位置形參,c 或 d 可以是位置形參或關鍵字形參,而 e 或 f 要求爲關鍵字形參:
def f(a, b, /, c, d, *, e, f):
print(a, b, c, d, e, f)
以下均爲合法的調用:
f(10, 20, 30, d=40, e=50, f=60)
但是,以下均爲不合法的調用:
f(10, b=20, c=30, d=40, e=50, f=60) # b cannot be a keyword argument
f(10, 20, 30, 40, 50, f=60) # e must be a keyword argument
這種標記形式的一個用例是它允許純 Python 函數完整模擬現有的用 C 代碼編寫的函數的行爲。例如,內置的 pow () 函數不接受關鍵字參數:
def pow(x, y, z=None, /):
"Emulate the built in pow() function"
r = x ** y
return r if z is None else r%z
另一個用例是在不需要形參名稱時排除關鍵字參數。例如,內置的 len () 函數的簽名爲 len (obj, /)。這可以排除如下這種笨拙的調用形式:
len(obj='hello') # The "obj" keyword argument impairs readability
另一個益處是將形參標記爲僅限位置形參將允許在未來修改形參名而不會破壞客戶的代碼。例如,在 statistics 模塊中,形參名 dist 在未來可能被修改。這使得以下函數描述成爲可能:
def quantiles(dist, /, *, n=4, method='exclusive')
...
由於在 / 左側的形參不會被公開爲可用關鍵字,其他形參名仍可在 **kwargs 中使用:
>>> def f(a, b, /, **kwargs):
... print(a, b, kwargs)
...
>>> f(10, 20, a=1, b=2, c=3) # a and b are used in two ways
10 20 {'a': 1, 'b': 2, 'c': 3}
這極大地簡化了需要接受任意關鍵字參數的函數和方法的實現。例如,下面是 collections 模塊中的代碼摘錄:
class Counter(dict):
def __init__(self, iterable=None, /, **kwds):
# Note "iterable" is a possible keyword argument
瞭解詳情:https://www.python.org/dev/peps/pep-0570
(由 Pablo Galindo 在 bpo-36540 中貢獻。)
用於已編譯字節碼文件的並行文件系統緩存
新增的 PYTHONPYCACHEPREFIX 設置 (也可使用 -X pycache_prefix) 可將隱式的字節碼緩存配置爲使用單獨的並行文件系統樹,而不是默認的每個源代碼目錄下的 __pycache__ 子目錄。
緩存的位置會在 sys.pycache_prefix 中報告 (None 表示默認位置即 __pycache__ 子目錄)。
(由 Carl Meyer 在 bpo-33499 中貢獻。)
調試構建使用與發佈構建相同的 ABI
發佈構建和調試構建現在都是 ABI 兼容的:定義 Py_DEBUG 宏不會再啓用 Py_TRACE_REFS 宏,它引入了唯一的 ABI 不兼容性。Py_TRACE_REFS 宏添加了 sys.getobjects () 函數和 PYTHONDUMPREFS 環境變量,它可以使用新的 ./configure --with-trace-refs 構建選項來設置。(由 Victor Stinner 在 bpo-36465 中貢獻。)
f - 字符串支持 = 用於自動記錄表達式和調試文檔
增加 = 說明符用於 f-string。形式爲 f'{expr=}' 的 f - 字符串將擴展表示爲表達式文本,加一個等於號,再加表達式的求值結果。例如:
>>> user = 'eric_idle'
>>> member_since = date(1975, 7, 31)
>>> f'{user=} {member_since=}'
"user='eric_idle' member_since=datetime.date(1975, 7, 31)"
通常的 f - 字符串格式說明符 允許更細緻地控制所要顯示的表達式結果:
>>> delta = date.today() - member_since
>>> f'{user=!s} {delta.days=:,d}'
'user=eric_idle delta.days=16,075'
= 說明符將輸出整個表達式,以便詳細演示計算過程:
>>> print(f'{theta=} {cos(radians(theta))=:.3f}')
theta=30 cos(radians(theta))=0.866
(由 Eric V. Smith 和 Larry Hastings 在 bpo-36817 中貢獻。)
PEP 587: Python 初始化配置
PEP 587 增加了一個新的 C API 用來配置 Python 初始化,提供對整個配置過程的更細緻控制以及更好的錯誤報告。
Vectorcall: 用於 CPython 的快速調用協議
添加 "vectorcall" 協議到 Python/C API。它的目標是對已被應用於許多類的現有優化進行正式化。任何實現可調用對象的擴展類型均可使用此協議。
此特性目前爲暫定狀態,計劃在 Python 3.9 將其完全公開。
瞭解詳情:https://www.python.org/dev/peps/pep-0590
(由 Jeroen Demeyer 和 Mark Shannon 在 bpo-36974 中貢獻。)
具有外部數據緩衝區的 pickle 協議 5
當使用 pickle 在 Python 進程間傳輸大量數據以充分發揮多核或多機處理的優勢時,非常重要一點是通過減少內存拷貝來優化傳輸效率,並可能應用一些定製技巧例如針對特定數據的壓縮。
pickle 協議 5 引入了對於外部緩衝區的支持,這樣 PEP 3118 兼容的數據可以與主 pickle 流分開進行傳輸,這是由通信層來確定的。
瞭解詳情:https://www.python.org/dev/peps/pep-0574
(由 Antoine Pitrou 在 bpo-36785 中貢獻。)
更多詳細特性,請查閱Python 3.8.0文檔:
https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html
Python 已經成爲最受歡迎的編程語言。
在2019年度 IEEE Spectrum 編程語言排行榜中,Python 不負衆望,穩居榜首,而且連續三年奪冠。
IEEE Spectrum 2019 十大編程語言排行如下
Python 的流行在很大程度上是受了大量可用專用庫的驅動,特別是在人工智能領域中。事實上,Keras 庫對深度學習開發人員影響很大。但深度學習並不是 Python 產生巨大的影響的唯一領域,微處理器計算能力的顯著提高意味着嵌入式版本的 Python:如 CircuitPython 和 MicroPython,正越來越受製造商的歡迎。
而 Python 爲何能連續三年奪冠?
Python 的高速發展主要原因是軟件工程的蓬勃發展,它吸引了許多零基礎的初學者。Java 的編程方法對於初學者來說太冗長了,單單想要完全理解和運行在 Java 中的 “hello world” 這樣的簡單程序,你就需要去了解類、靜態方法和包。在 C 語言中,這要簡單一些,但是在內存管理上還是會出現一些問題。但在 Python 這裏,就只是一行代碼的事。所以,Python 越來越流行,被越來越多的開發者使用。
對初學者友好,是 Python 用戶快速增加的原因之一。如果你還不瞭解Python,那麼最近微軟推出的一套免費入門教程是很好的選擇。
視頻地址:
https://www.youtube.com/playlist?list=PLlrxD0HtieHhS8VzuMCfQD4uJ9yne1mE6
這套視頻教程名爲 Python for Beginners,由微軟高級項目經理 Christopher Harrison、以及微軟 AI Gaming 的商業開發經理 Susan Ibach 共同講解,在課程中加入了他們對 Python 的見解,一共有 44 個視頻。
這套課程最大的特定是輕鬆簡潔,一上線就很受歡迎,5 天視頻播放量超 25 萬,更一度登上 GitHub 趨勢榜第一名。
很簡單,如果你想嘗試前面介紹的 Python 3.8 的任何新功能,那麼就應該升級到 Python 3.8。像 pyenv 和 Anaconda 這樣的工具可以很容易地並排安裝多個版本的 Python。或者,你也可以運行官方的 Python 3.8 Docker 容器。嘗試使用一下 Python 3.8,肯定會眼前一亮~
不過,是否應該將生產環境升級到 Python 3.8 呢?這需要考慮你的項目是否依賴 Python 3.8 的新功能。升級環境以運行 Python 3.8 是非常安全的,而且也能利用新版本中的優化。不過,如果你想保守一點,可以堅持到第一個維護版本(Python 3.8.1)發佈時再升級。
如何評價 Python 3.8?歡迎來與大咖一起討論~
參考鏈接:
https://docs.python.org/zh-cn/3.8/whatsnew/3.8.html
如果喜歡本篇文章,歡迎轉發、點贊。關注訂閱號「Python數據科學」,回覆「進羣」即可進入無廣告技術交流。
推薦閱讀
3、
5、
喜歡文章,點個在看