我不明白这条线的含义:
parameter and (" " + parameter) or ""
其中参数是字符串
为什么人们想要使用and
和or
运算符,一般来说,使用python字符串?
答案 0 :(得分:26)
假设您使用的是parameter
的值,但如果值为None
,那么您更愿意使用空字符串""
而不是None
。你一般会做什么?
if parameter:
# use parameter (well your expression using `" " + parameter` in this case
else:
# use ""
这就是表达式正在做的事情。首先,您应该了解and
和or
运算符的作用:
a and b
,则b
会返回True
,否则会返回a
。a or b
,则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 - A1
为None
:
result = (None and " " + parameter) or ""
result = None or ""
result = ""
作为一般性建议,对条件表达式使用A if C else B
表单表达式更好,更具可读性。所以,你应该更好地使用:
" " + parameter if parameter else ""
而不是给定的表达式。有关if-else
表达式背后的动机,请参阅PEP 308 - Conditional Expression。
答案 1 :(得分:6)
Python认为空字符串的布尔值为“false”,非空字符串的布尔值为“true”。
因此表达式只有两种可能的结果,即空字符串和非空字符串。
要注意的第二件事是返回“或”和“和”运算符的值。 Python不返回true或false值,对于字符串和/或运算符,它返回一个字符串(考虑它们的值为true或false)。 Python使用惰性方法:
对于“and”运算符,如果left值为true,则检查并返回正确的值。如果左值为false,则返回
对于“或”运算符,如果第一个值为true,则返回它。否则,如果第二个值为false,则返回第二个值
parameter = 'test'
print( parameter and (" " + parameter) or "" )
输出:测试
parameter = ''
print( parameter and (" " + parameter) or "" )
输出:(空字符串)
答案 2 :(得分:4)
Python中的空字符串相当于False
布尔值,与空列表相同。您提供的行是三元运算符的Python版本(如下面的注释中所述,现在是一个过时的结构,如Python now has a real ternary operator)。它基于三个规则:
a and b
如果a
为False
,则b
将不会被评估
{li> for a or b
如果a
为True
,则b
将不会被评估
如果parameter
评估为True
,and
子句的第二部分将被评估:(" " + parameter)
。因此,如果它不是空字符串,它会向parameter
添加前导空格。 or
子句的第二部分将不会被评估,因为您已经可以告诉整个表达式是True
(True
或任何事物总是True
)。
如果parameter
是False
(在此上下文中为空字符串),则and
子句的第二部分将不会被评估,因为您已经知道它是{{1} }(False
并且任何内容始终为False
)。因此,False
子句的第二部分将被评估,返回一个空字符串。
您可以用更详细的方式编写它:
or
答案 3 :(得分: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'
答案 4 :(得分:2)
考虑这个TTL。然后它只是插入不同的场景来看看会发生什么:)
请注意and
和or
评估为使其“成功”或“失败”的第一个值 - 这不一定是真或假!
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 - 它将是a
或b
的值。
答案 5 :(得分:0)
有了所有好的答案,我发现这些陈述可以帮助我更好地记住这一点,并使我的大脑工作得很好(并希望在那里有更多的东西):
“和”返回第一个False项(例如,None,“”,[],(),{},0)或最后一项(如果没有)(例如没有找到False)
< / LI>“或”返回第一个True项目或最后一个项目(例如没有找到True)
总之,它们都返回决定语句结果的第一个项目。 (在最坏的情况下,序列中的最后一项)
请注意,此规则也适用于链接的所有“和”或所有“或”语句