
來源:麥?zhǔn)寰幊?
作者:麥?zhǔn)?
2021年6月9號(hào),Python官方發(fā)布了3.10的新功能介紹。
以往每次有新的版本,我都替Python開發(fā)者叫苦:又有新的版本,又要學(xué)新的東西,又要修改程序,命苦??!
但這次看了以后,我禁不住連聲叫好:這個(gè)太棒了!福音!
先簡(jiǎn)單說一下3.10的幾項(xiàng)核心改進(jìn):
1. 在with ... as語(yǔ)法中支持小括號(hào),可以一行創(chuàng)建多個(gè)環(huán)境管理器。
with (
CtxManager1() as example1,
CtxManager2() as example2,
CtxManager3() as example3,
):
關(guān)于環(huán)境管理器,后面可以單獨(dú)發(fā)文討論細(xì)節(jié)。
2. 更好的錯(cuò)誤提示
這就是讓我連連叫好的功能,這也是本文后面討論的重點(diǎn)。
3. 支持match ... case功能,也就是其他編程語(yǔ)言的swith ... case:
match status:
case 400:
return "Bad request" case 404:
return "Not found" case 418:
return "I'm a teapot" case _:
return "Something's wrong with the Internet"
這個(gè)后面可以單獨(dú)發(fā)文討論細(xì)節(jié)。
4. 其他功能
還有一些其他小的功能改進(jìn):
這些細(xì)節(jié)基本不會(huì)影響你現(xiàn)有的代碼,有興趣的同學(xué)可以點(diǎn)本文的閱讀原文,查看完整的英文原文。
讓我拍手叫絕的這個(gè)功能就是更好的錯(cuò)誤提示。
編程學(xué)習(xí)者,尤其是新手,會(huì)碰到各種各樣的編程錯(cuò)誤,
而這些錯(cuò)誤的提示又不友好,甚至有些誤導(dǎo)!
錯(cuò)誤就在我們面前,我們瞪著眼睛卻看不見,這種情況我稱為眼瞎問題。
就算我這樣的老司機(jī),也時(shí)不時(shí)的會(huì)碰到瞎眼問題。
3.10對(duì)錯(cuò)誤提示有了很大的改進(jìn),可以說在一定程度上能挽救我們眼瞎問題。
這個(gè)改進(jìn)涵蓋了:語(yǔ)法錯(cuò)誤,縮進(jìn)錯(cuò)誤,屬性錯(cuò)誤,名稱錯(cuò)誤等。
我們一個(gè)個(gè)看,建議先肉眼看一下,錯(cuò)誤在哪里,我們來一個(gè)找錯(cuò)誤游戲。
1. 語(yǔ)法錯(cuò)誤
代碼1:
expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, 38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6, some_other_code = foo()
以前的錯(cuò)誤提示:
有語(yǔ)法錯(cuò)誤。還把錯(cuò)誤的行數(shù)說錯(cuò)了,這個(gè)就很誤導(dǎo)了!
File "example.py", line 3 some_other_code = foo()
^ SyntaxError: invalid syntax
現(xiàn)在的提示要好多了:
大括號(hào)沒有關(guān)閉。這個(gè)就很自白了!
File "example.py", line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: '{' was never closed
代碼2:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1 foo(x, z for z in range(10), t, w)
^
SyntaxError: Generator expression must be parenthesized
這段代碼是因?yàn)?span style="color:#EF7060;">z for z in range(10)應(yīng)該加上括號(hào),提示也還比較正常。
但是3.10給出了更好的提示,直接把要加括號(hào)的代碼段給標(biāo)記出來了:
>>> foo(x, z for z in range(10), t, w)
File "<stdin>", line 1 foo(x, z for z in range(10), t, w)
^^^^^^^^^^^^^^^^^^^^
SyntaxError: Generator expression must be parenthesized
是不是很直白?到這里是不是應(yīng)該給本文點(diǎn)個(gè)贊?或者答應(yīng)我,看完以后點(diǎn)個(gè)贊,謝謝!
下面幾段我們就不作對(duì)比了,直接給出3.10中友好的錯(cuò)誤提示
>>> if rocket.position > event_horizon
File "<stdin>", line 1 if rocket.position > event_horizon
^ SyntaxError: expected ':'
>>> {x,y for x,y in zip('abcd', '1234')}
File "<stdin>", line 1 {x,y for x,y in zip('abcd', '1234')}
^ SyntaxError: did you forget parentheses around the comprehension target?
>>> items = { ... x: 1, ... y: 2 ... z: 3, File "<stdin>", line 3 y: 2 ^ SyntaxError: invalid syntax. Perhaps you forgot a comma?
>>> try:
... build_dyson_sphere()
... except NotEnoughScienceError, NotEnoughResourcesError:
File "<stdin>", line 3 except NotEnoughScienceError, NotEnoughResourcesError:
^
SyntaxError: multiple exception types must be parenthesized
>>> values = {
... x: 1,
... y: 2,
... z: ... }
File "<stdin>", line 4 z: ^ SyntaxError: expression expected after dictionary key and ':' >>> values = {x:1, y:2, z w:3}
File "<stdin>", line 1 values = {x:1, y:2, z w:3}
^ SyntaxError: ':' expected after dictionary key
>>> try ... x = 2 ... something = 3 File "<stdin>", line 3 something = 3 ^^^^^^^^^ SyntaxError: expected 'except' or 'finally' block
>>> if rocket.position = event_horizon: File "<stdin>", line 1 if rocket.position = event_horizon: ^ SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?
>>> f"Black holes {*all_black_holes} and revelations" File "<stdin>", line 1 (*all_black_holes)
^ SyntaxError: f-string: cannot use starred expression here
2. 縮進(jìn)錯(cuò)誤
縮進(jìn)錯(cuò)誤是小白常見錯(cuò)誤,現(xiàn)在有救啦,提示很友好:
>>> def foo():
... if lel: ... x = 2 File "<stdin>", line 3 x = 2 ^ IndentationError: expected an indented block after 'if' statement in line 2
3. 屬性錯(cuò)誤
用錯(cuò)了屬性,不光告訴你錯(cuò)誤,還給你一些可能的選擇,簡(jiǎn)直有點(diǎn)人工智能的味道了。
>>> collections.namedtoplo
Traceback (most recent call last):
File "<stdin>", line 1, in <module> AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?
4. 命名錯(cuò)誤
同樣的,命名錯(cuò)誤也會(huì)給出一個(gè)可能的選擇:
>>> schwarzschild_black_hole = None >>> schwarschild_black_hole
Traceback (most recent call last):
File "<stdin>", line 1, in <module> NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?
這是python 3.10中最讓我眼睛一亮的一項(xiàng)功能,相信可以解救很多和我一樣有瞎眼問題的同學(xué)。
Python 3.10的match..case功能也可以算是一大改進(jìn),另外context manager的功能也很重要,如果大家有興趣,請(qǐng)留言,點(diǎn)贊,后面我再專門發(fā)文介紹這兩個(gè)知識(shí)點(diǎn)。
最后建議:搜藏本文,認(rèn)真學(xué)些這些錯(cuò)誤提示。應(yīng)該可以節(jié)省你很多找錯(cuò)誤的時(shí)間。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03