27

我不明白该行的含义:

parameter and (" " + parameter) or ""

其中参数是字符串

通常,为什么要对python 字符串使用andand运算符?or

4

6 回答 6

32

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

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

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

  • a and bb如果 a 是则返回True,否则返回a
  • a or ba如果 a 是则返回True,否则返回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 ""

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

于 2013-10-06T20:27:42.627 回答
6

Python 将空字符串视为具有“false”的布尔值,将非空字符串视为具有“true”的布尔值。

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

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

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

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

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

输出:测试

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

输出:(空字符串)

于 2013-10-06T20:38:16.897 回答
4

Python 中的空字符串等价于False布尔值,与空列表的方式相同。您提出的这一行是 Python 版本的三元运算符(如下面的评论中所述,现在是一种过时的结构,因为 Python现在有一个真正的三元运算符)。它基于三个规则:

  • for a and bif ais Falsethenb不会被评估
  • for a or bif ais Truethenb不会被评估
  • 逻辑子句的值是其最近评估的表达式的值

如果parameter评估子句True的第二部分将被评估: . 因此,如果它不是空字符串,它将在 a 中添加前导空格。该子句的第二部分不会被评估,因为您已经可以告诉整个表达式是(或任何东西总是)。and(" " + parameter)parameterorTrueTrueTrue

如果parameterFalse(在这种情况下为空字符串)子句的第二部分and将不会被评估,因为您已经可以知道它是FalseFalse并且任何东西总是False)。or因此,对子句的第二部分进行评估,返回一个空字符串。

您可以用更详细的方式编写它:

if parameter:
    return " " + parameter
else:
    return ""
于 2013-10-06T20:27:59.300 回答
2

它检查是否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'
于 2013-10-06T20:25:49.663 回答
2

考虑这个 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 - 它可以是aor的值b

于 2013-10-06T20:36:46.650 回答
1

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

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

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

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

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

于 2017-08-01T23:30:27.703 回答