Python三元运算小记
2016年05月12日 Python

好久没有用Python的,昨天写一个简单的Alred workflow的时候,突然用到了三元运算符,只记得刚学的时候,是用的类似于Lua的那种三元运算的实现方式(Lua没有原生的三元运算符,使用了二个逻辑运算来实现),然后在google上找了一下,这里做一下记录。

  • Lua的三元运算实现方式,就是巧妙的利用了与或运算的”短路”法则。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    local tmp = false
    local res = not tmp and "and" or "or"
    print(res) // 输出"and"
    -- 等价于
    if not tmp then
    res = "and"
    else
    res = "or"
    end

    Lua使用的形式就是 result = condition and true_res or false_res。Lua这里这样使用不会现问题,因为Lua对于false值只有二种,nilfalse是false,其余都是true。

  • Python一般情况下对于类似Lua的那种实现也没有太大问题

    1
    print(True and "True" or "False") # 输出True

    但是Python对于False值的规定却与Lua不同,Python认为一切空值都是False,下面的值都被认为是False,如下:

    False (布尔值False)

    None (空对象值)

    等于0的数 [整型0,浮点0.0,长整型0L,复数0.0 + 0j]

    “”(空字符串)

    [](空列表)

    {}(空字典)

    ()(空元组)

    那这样就会出现问题,如某个条件下想置空个列表为空,或者置为空字符串,可能得到的都是相反的效果

    1
    print(True and "" or "False") # 输出False

    这种情况下空字符串被认为是False,逻辑运算继续,or后为真,得到最终结果是”False”,与预期结果相反。

  • Python原生的三元运算形式,在Python2.5开始有了这个三元运算操作,形式就是:

    true_res if condition else false_res

    真值在前,条件在中间,假值在else分支

    1
    print("True" if True else "False") # 输出True

    这时就不存在使用逻辑运算形式的问题了。