引言
Python/ target=_blank class=infotextkey>Python已成為許多編程初學者的必備語言。
因為Python在機器學習、數據處理和其他領域的廣泛能力,
許多不同語言背景的人可能都會考慮改用Python。
Python的設計其實非常簡單。
但在某些情況下,可能會讓初學者感到困惑。
所以本文我想澄清一些令人困惑的Python特性。
圖源:Juan Pablo Donadías
??邏輯運算符:and, or
當我們構造if…else…語句時,通常需要給定一個求值的條件。
當條件返回為True時,執行if函數。
如果為False,則執行else函數。
如果某個條件是由多個部分組成的,就需要我們用邏輯運算符and和or進行連接。
在這里,每個部分都同時為True的時候,and才能成立;
但當任一條件為True時,or就能成立。
有些人會把它們作為三元表達式使用,
這種情況下,我們可以直接評判這些組合條件。
具體參考以下示例:
以上這兩個例子表明,這種方式會返回第一個非錯誤值(non-falsy object)。
那么,下面這個代碼又會返回什么結果呢?
如果運行這些代碼,你會發現,what在這里返回的是空列表(empty list)。
我們把這個結果的原因留到以后討論。
接下來,觀察下面這個使用and邏輯運算符的示例:
仔細察看這些例子,看看你是否知道得出這些結果的原因。
在Python中,這些組合條件遵循的是短路原則(short circuit rule)。
意思是,在用and運算符時,系統會查找第一個錯誤值(falsy value)。
如果找到,就會停止運算并返回falsy值,比如上面代碼中的text1。
如果找不到,就會返回最后一項,比如上面的number1和text2。
or運算則會尋找第一個真值(truthy value)。
如果找到就會停止運算,并返回真值(truth value),比如上面的number和text變量。
但如果找不到任何內容,它會返回最后一項,如what變量所示
?? 賦值表達式
在Python和許多其他編程語言中,表達式(expressions)和語句(statements)是兩種截然不同的概念。
通常,表達式代表的是一個Python對象的計算結果。
我們可以在內置的eval方法中使用表達式,來生成求值。
相反,語句執行的是一個動作,而不是計算,語句是不能用來求值的。
語句的其中一種特殊形式是賦值(assignment)。
具體來講,就是當我們給一個變量賦值時,它就變成了一個賦值語句,這個過程是一個動作。
我們在創建一個新變量,但不是進行求值。
下圖是一個例子:
無法評估語句
Python從版本3.8開始引入了新功能,它允許特定的賦值語句具有表達式的特征。
也就是說,我們賦值給一個變量(assignment)的同時,也能得到一個值(expression)。
該功能需要使用一個新操作符 “:=”,有些人把它稱為海象(walrus)運算符。
請看下面的示例:
請注意,這個例子是沒有實際意義的,因為語法原因,我們在頂層使用賦值表達式時,必須用到括號。
接下來,我們會再看一個不需要括號的更實際的例子。
假設我們有一個數字的列表,想要計算出它們的累計求和(cumulative sum)并保存到列表中。
我們可以利用itertools模塊中的accumulate函數運行,具體操作如下:
使用accumulate計算累計求和
當然,還有另一種利用賦值表達式的解決方案。
具體如下:
在列表的推導式中,我們要把表達式放在for關鍵字之前。
雖然賦值語句(Assignment)不能出現在那,但賦值表達式(assignment expression)是可以的。
重要的是,這個表達式能夠更新total這個變量,我們還可以用它來獲取累計求和。
? 上下文管理:with
在研究別人的代碼時,你可能會碰到這樣的用法。
就是用with語句打開文件,對文件本身執行必要的操作。
有可能你在其他文本相關的操作也會用到這個方法,但你有思考過為什么要這樣操作嗎?
畢竟,它會產生額外的縮進,多少會分散注意力。
這一功能背后的主要概念被稱為上下文管理(Context Management)。
意思是,這個語句會創建一個上下文,你可以在其中訪問管理資源。
在這個例子里,我們指的就是文本。
在沒有上下文管理的情況下,我們應該對此文件執行以下操作:
文件操作
你可以看到,使用文件時,我們要打開和關閉它。
關閉文件這個動作很關鍵,因為如果文件在其他地方使用,
不關閉文件的話,更新的內容很可能就不會保存到文件中。
with語句的目的就是為我們處理這種情況的代碼。
具體來說,就是退出with語句后,文件會被自動關閉。
如下所示:
?總結
本文中,我們回顧了Python中讓初學者困惑的三個特性,希望我解釋清楚了。
下面,讓我們快速回顧一下:
- 1、當我們使用組合條件時,Python會進行短路計算。使用and操作時,它將返回第一個虛值或最后一項。使用or操作時,它會返回第一個真值或最后一項。
- 2、表達式(expressions)和語句(statements)不同。賦值語句(assignment statement)不會產生任何值。但是,賦值表達式(嗄ssignment expression)在分配變量的同時還能求值。
- 3、當需要管理特定上下文時,我們可以使用with語句。最常見的情況是對一個文件進行操作。退出上下文時,上下文管理器會自動為我們關閉文件。