【问题标题】:Ternary operator return `True` instead the given value三元运算符返回 `True` 而不是给定值
【发布时间】:2011-12-23 11:18:39
【问题描述】:

我使用三元运算符来定义短条件变量。我想知道表达式何时返回 True 而不是在表达式值中给出。

>>> digits = '123456'

>>> conv_d = digits != None if int(digits) else None

>>> conv_d
>>> True

>>> int(digits)
>>> 123456

请解释一下,这是怎么回事? Python中三元运算符和正则条件表达式的逻辑区别是什么?

【问题讨论】:

    标签: python conditional


    【解决方案1】:

    int(digits) == 123456 这是一个真实的值。所以conv_d = digits != None。由于digits 不是None,所以conv_d 设置为true。

    你可能想要这个:

    conv_d = int(digits) if digits is not None else None
    

    请记住,包含非数字的字符串会引发异常!如果您更喜欢这些值的 0 或 None,请编写一个小函数:

    def toint(s):
        try:
            return int(s)
        except (ValueError, TypeError):
            return None # or 0
    

    【讨论】:

      【解决方案2】:

      Python 条件运算符的顺序与其他语言不同。除非您确定自己需要这样做,否则您永远不应该将平等与 None 进行比较。

      conv_d = int(digits) if digits is not None else None
      

      【讨论】:

        【解决方案3】:

        三元运算符的替代方案:

        conv_d = digits != None and int(digits) or None #short-circuiting;在这种情况下是错误的,因为它不适用于数字 =“0” - 请参阅下面的评论

        conv_d = int(digits) if digits 不是 None else None

        第二个表达式更清晰,因此更受欢迎。

        【讨论】:

        • 如果int(digits) 为0,第一个将失败。如果digits 不能公平地比较相等性与None,则两者都将失败。
        • 感谢您发现第一个错误!这个想法只是为了表明 Python 中有几个替代缺少的三元运算符,所以我只是假设数字是由 [0-9] 或 None 组成的 str (无论如何,ThiefMaster 的回复涵盖了这个问题)。鉴于此,我同意在与 None 进行比较时,“不是”是首选运算符。
        【解决方案4】:

        注意关键字的放置方式。 “X 如果 Y 否则 Z”。 “Y”是“if”之后的部分,所以它是条件。 “X if Y”是一个完全有效(虽然不太常见)的英语结构,意思与“if Y, X”相同,因此 X 是满足 Y 时评估的表达式。 Z 是 Y 不满足时计算的表达式,类似。

        【讨论】:

          猜你喜欢
          • 2020-08-28
          • 1970-01-01
          • 1970-01-01
          • 2015-06-24
          • 1970-01-01
          • 2014-09-24
          • 1970-01-01
          • 1970-01-01
          • 2020-02-09
          相关资源
          最近更新 更多