zoukankan      html  css  js  c++  java
  • 【转】Python三目运算,and or陷阱

    在C语言中,三目运算经常用到(cond?a:b),非常的简洁,而在Python中不支持这种语法。
    但是,可以用Python中and or来实现(这里是有陷阱的,下面会讲到)
    我们来看下面几个表达式
    >>> False or 1
    1
    >>> False or 0
    0
    >>> True or 0
    True
    >>> True and 1
    1
    >>>True and 0
    0
    >>> False and 1
    False

    也就是说,and or这个表达式会返回一个最终的表达式结果,而不是简单的True或者False。那么看如下几个表达式:
    >>> True and 1 or 2   #TRUE?1:2
    1
    >>> False and 1 or 2 #TRUE?1:2
    2

    这是不是很像三目运算的结果呢?
    这里你也许会想到文章开始的三目表达式可以这样表示
    >>> cond and a or b

    是的,在大多数情况下这个表达式都是正确的,但是上面提到的陷阱也在这里出现了
    >>> cond, a, b = True, 0, 1 #这样赋值后
    >>> cond and a or b         #这个表达式的结果会是什么呢?
    1                                      #也就是b,而不是你预想的a

    这是因为,在 and or运算中 空字符串 ‘’,数字0,空列表[],空字典{},空(),None,在逻辑运算中都被当作假来处理,如下面这个例子
    >>> 'sss' and '' or 'bbb'
    'bbb'

    但是,不要担心,还是有办法的。
    在的文章《和C语言三目运算符完全等价的表达式》中给出了如下表达方式
    >>> c = cond and a or (not cond or a) or b #貌似有点太复杂了

    在Dive into Python 中给出这样一个方法:
    >>> (1 and [a] or [b])[0]   #也就是 (cond and [a] or [b])[0]

    所以用 (cond and [a] or [b])[0] 就好了

  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/cyttina/p/3041885.html
Copyright © 2011-2022 走看看