刨根問底:if 後怎麽就可以跟對象,變量交換寫法是語法糖嗎?
阿新 • • 發佈:2019-04-15
mon round cti play border keyword code let 變量交換
方法, 方法或
1、萬物皆可布爾
一般語言中的 if
語句語法是這樣的:
if (條件表達式)
{
執行語句
}
而在 Python 中,if
後面不僅可以是條件表達式,還可以是任意對象。例如:
my_list = [1, 2, 3]
if my_list:
print(my_list)
在 Python 中,False、None、數值 0、空序列、空映射都被視為 [假],其他各種值被視為 [真]。
那麽,這是如何實現的呢?背後的原理是什麽呢?
為了判定一個對象 x 為 [真] 還是 [假],Python 會調用 bool(x)
函數。該函數背後調用的是魔法方法 __bool__
,如果不存在 __bool__
bool(x)
會嘗試調用 __len__
方法。若返回 0,則 bool(x)?
返回 False
,否則返回 True
。
而默認情況下,我們自定義的類的實例總被認為是 [真]。
寫個例子驗證一下。
class MyClass:
def __bool__(self):
return False
my_class = MyClass()
if my_class:
print(‘真‘)
else:
print(‘假‘)
輸出:
假
就是說:當對象用於任何需要表示為布爾值的時候,Python 會調用 bool(x)
方法,而我們可以通過重寫 __bool__
__len__
方法改變默認的判斷。
2、變量是如何交換的
Python 中交換兩個變量非常簡單:
b, a = a, b
為什麽可以這樣寫,是語法糖嗎?誠然不是,這是元組拆包。
不明白?寫成這樣是不是就明白了:
b, a = (a, b)
Python 解析器會自動將 a, b
視作元組,所以上面兩個寫法是等價的。不信?看下面的例子:
a = 1
b = 2
c = a, b
print(c)
print(type(c))
輸出:
(1, 2)
<class ‘tuple‘>
所以 b, a = a, b
這種寫法利用的是元組拆包。
刨根問底:if 後怎麽就可以跟對象,變量交換寫法是語法糖嗎?