刨根問底:if 後怎麼就能夠跟對象了,變量交換寫法是語法糖嗎?

一、萬物皆可布爾

通常語言中的 if 語句語法是這樣的:python

if (條件表達式)
{
    執行語句
}
複製代碼

而在 Python 中,if 後面不只能夠是條件表達式,還能夠是任意對象。例如:bash

my_list = [1, 2, 3]
if my_list:
    print(my_list)
複製代碼

在 Python 中,False、None、數值 0、空序列、空映射都被視爲 [假],其餘各類值被視爲 [真]。函數

那麼,這是如何實現的呢?背後的原理是什麼呢?spa

爲了斷定一個對象 x 爲 [真] 仍是 [假],Python 會調用 bool(x) 函數。該函數背後調用的是魔法方法 __bool__,若是不存在 __bool__ 方法,bool(x) 會嘗試調用 __len__ 方法。若返回 0,則 bool(x)​ 返回 False,不然返回 Truecode

而默認狀況下,咱們自定義的類的實例總被認爲是 [真]。對象

寫個例子驗證一下。string

class MyClass:
    def __bool__(self):
        return False


my_class = MyClass()

if my_class:
    print('真')
else:
    print('假')
複製代碼

輸出:it

複製代碼

就是說:當對象用於任何須要表示爲布爾值的時候,Python 會調用 bool(x) 方法,而咱們能夠經過重寫 __bool__ 方法或 __len__ 方法改變默認的判斷。io

二、變量是如何交換的

Python 中交換兩個變量很是簡單:function

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 這種寫法利用的是元組拆包。

相關文章
相關標籤/搜索