【问题标题】:Using "and" and "or" operator with Python strings [duplicate]在 Python 字符串中使用“and”和“or”运算符 [重复]
【发布时间】:2013-10-13 08:37:16
【问题描述】:

我不明白这行的意思:

parameter and (" " + parameter) or ""

参数是字符串

一般来说,为什么要对 python 字符串使用 andor 运算符?

【问题讨论】:

  • 它是" " + parameter if parameter else "",带有额外的模糊性。
  • @Smac89:确实有道理,但有些人会认为这不符合 Python 标准。

标签: python string boolean-operations


【解决方案1】:

它检查parameter 是否有值。如果是这样,它会在前面加上一个空格。如果不是,则返回一个空字符串。

$ python
Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> foo = 'bar'
>>> foo and (" " + foo) or ""
' bar'

【讨论】:

  • 正确,但您可能想解释一下这是如何工作的。
【解决方案2】:

假设您使用parameter 的值,但如果值是None,那么您宁愿使用空字符串"" 而不是None。你一般会做什么?

if parameter:
    # use parameter (well your expression using `" " + parameter` in this case
else:
    # use ""

这就是那个表达式正在做的事情。首先你应该了解andor 运算符的作用:

  • 如果 a 是 Truea and b 返回 b,否则返回 a
  • 如果 a 是 Truea or b 返回 a,否则返回 b

那么,你的表情:

parameter and (" " + parameter) or ""

实际上相当于:

(parameter and (" " + parameter)) or  ""
#    A1               A2               B
#           A                     or   B

在以下情况下如何评估表达式:

  • parameter - A1 被评估为True

    result = (True and " " + parameter) or ""
    
    result = (" " + parameter) or ""
    
    result = " " + parameter
    
  • parameter - A1None

    result = (None and " " + parameter) or ""
    
    result = None or ""
    
    result = ""
    

作为一般建议,条件表达式使用A if C else B 形式表达式更好,更易读。所以,你应该更好地使用:

" " + parameter if parameter else ""

而不是给定的表达式。有关 if-else 表达式背后的动机,请参阅 PEP 308 - Conditional Expression

【讨论】:

    【解决方案3】:

    Python 中的空字符串等价于 False 布尔值,与空列表的方式相同。您提供的行是 Python 版本的三元运算符(如下面的评论中所述,如今已过时,如 Python now has a real ternary operator)。它基于三个规则:

    • 对于a and b,如果aFalse,则不会评估b
    • 对于a or b,如果aTrue,则不会评估b
    • 逻辑子句的值是其最近计算的表达式的值

    如果parameter 的计算结果为True,则and 子句的第二部分将被计算:(" " + parameter)。因此,如果 parameter 不是空字符串,它将添加前导空格。 or 子句的第二部分不会被评估,因为您已经可以知道整个表达式是 TrueTrue 或任何东西总是 True)。

    如果parameterFalse(在此上下文中为空字符串),则不会评估and 子句的第二部分,因为您已经可以知道它是FalseFalse 并且任何内容都是总是False)。因此,or 子句的第二部分被评估返回一个空字符串。

    你可以用更详细的方式来写:

    if parameter:
        return " " + parameter
    else:
        return ""
    

    【讨论】:

      【解决方案4】:

      考虑这个 TTL。然后它只是插入不同的场景来看看会发生什么:)

      请注意,andor 计算为使它们“成功”或“失败”的第一个值 - 这不必是 True 或 False!

      a    b    a or b   a and b
      --   --   ------   ------- 
      T    T    a (T)    b (T)
      T    F    a (T)    b (F)
      F    T    b (T)    a (F)
      F    F    b (F)    a (F)
      

      T 和 F 代表“Truth-y”和“False-y”值。这种表达式链接有效,因为运算符不需要返回 True 或 False - 它可以是 ab 的值。

      【讨论】:

        【解决方案5】:

        Python 认为空字符串的布尔值为“false”,非空字符串的布尔值为“true”。

        所以表达式只有两种可能的结果,即空字符串和非空字符串。

        要注意的第二件事是返回“or”和“and”运算符的哪个值。 Python 不只返回真或假值,对于字符串和或/和运算符,它返回字符串之一(考虑到它们的值为真或假)。 Python 使用惰性方法:

        对于“and”运算符,如果左值为真,则检查并返回右值。如果left值为false,则返回

        对于“或”运算符,如果第一个值为真,则返回。否则如果第二个值为假,则返回第二个值

        parameter = 'test'
        print( parameter and (" " + parameter) or "" )
        

        输出:测试

        parameter = ''
        print( parameter and (" " + parameter) or "" )
        

        输出:(空字符串)

        【讨论】:

          【解决方案6】:

          有了所有好的答案,我发现这些陈述可以帮助我更好地记住这一点,并适合我的大脑工作方式(希望能得到更多答案):

          • “and” 返回第一个 False 项(例如,None、“​​”、[]、()、{}、0),如果没有则返回最后一项(例如,未找到 False)

          • “或”返回第一个 True 项或最后一项(例如,没有找到 True)

          总的来说,它们都返回决定语句结果的第一项。 (在最坏的情况下,序列中的最后一项)

          请注意,此规则也适用于链接的所有“与”或所有“或”语句

          【讨论】:

            猜你喜欢
            • 2016-07-03
            • 1970-01-01
            • 1970-01-01
            • 2010-11-07
            • 2014-09-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多