刨根问底:if 后怎么就可以跟对象,变量

发布时间:2019-05-27 22:20:21编辑:auto阅读(1938)

    1、万物皆可布尔

    一般语言中的 if 语句语法是这样的:

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

    而在 Python 中,if 后面不仅可以是条件表达式,还可以是任意对象。例如:

    my_list = [123]
    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))

    输出:

    (12)
    <class 'tuple'>

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

关键字

上一篇: Python-接口自动化(七)

下一篇: jQuery