刨根问底:if 后怎么就能够跟对象,变量交换写法是语法糖吗?

一、万物皆可布尔

通常语言中的 if 语句语法是这样的:python

if (条件表达式)
{
    执行语句
}

而在 Python 中,if 后面不只能够是条件表达式,还能够是任意对象。例如:bash

my_list = [123]
if my_list:
    print(my_list)

在 Python 中,False、None、数值 0、空序列、空映射都被视为 [假],其余各类值被视为 [真]。app

那么,这是如何实现的呢?背后的原理是什么呢?函数

为了断定一个对象 x 为 [真] 仍是 [假],Python 会调用 bool(x) 函数。该函数背后调用的是魔法方法 __bool__,若是不存在 __bool__ 方法,bool(x) 会尝试调用 __len__ 方法。若返回 0,则 bool(x)​ 返回 False,不然返回 Truespa

而默认状况下,咱们自定义的类的实例总被认为是 [真]。code

写个例子验证一下。orm

class MyClass:
    def __bool__(self):
        return False


my_class = MyClass()

if my_class:
    print('真')
else:
    print('假')

输出:对象


就是说:当对象用于任何须要表示为布尔值的时候,Python 会调用 bool(x) 方法,而咱们能够经过重写 __bool__ 方法或 __len__ 方法改变默认的判断。ci

二、变量是如何交换的

Python 中交换两个变量很是简单:string

b, a = a, b

为何能够这样写,是语法糖吗?诚然不是,这是元组拆包
不明白?写成这样是否是就明白了:

b, a = (a, b)

Python 解析器会自动将 a, b 视做元组,因此上面两个写法是等价的。不信?看下面的例子:

a = 1
b = 2
c = a, b
print(c)
print(type(c))

输出:

(12)
<class 'tuple'>

因此 b, a = a, b 这种写法利用的是元组拆包。

相关文章
相关标签/搜索