python if test ==(name或surname)vs if if(name或surname)in test

时间:2014-03-29 11:37:34

标签: python conditional

我希望有人向我解释为什么一个有效,另一个没有:

>>> test
'test1'
>>> name 
'test'
>>> surname
'test1'
>>> is_good = "good" if (name or surname) in test else "bad"
>>> is_good
'good'
>>> is_good = "good" if test == (name or surname) else "bad"
>>> is_good
'bad'
对我而言,虽然我不明白在操作的背景下会发生什么,但它完全相同。

第二,在python中使用这样的功能以便不重复测试== name或test == surname ...

第三,是否有一个PEP对此有所说明?

4 个答案:

答案 0 :(得分:2)

逻辑运算符按从左到右的顺序进行计算。例如,

>>> 'test' or 'test1'
'test'
>>> 'test1' or 'test'
'test1'

你可以看到,如果第一个操作数不为零,那么python只输出第一个操作数而不关心or之后的内容。这可以在上面看作' test'返回。

在你的情况下,

 is_good = "good" if (name or surname) in test else "bad"

或返回'测试'由in姓氏True

验证

在你的第二个案例中,

 is_good = "good" if test == (name or surname) else "bad"

又转换为

 is_good = "good" if 'test1' == 'test' else "bad" 

转为False

答案 1 :(得分:1)

其他答案正确解释了or正在做什么(它检查其中一个名称是否真的存在非0,"",null等)。我认为你正在寻找像

这样的东西
if test in {name,surname}   

这构造了一个集合并检查成员资格。元组test in (name,surname)可能更有效。但实际上,(test == name) or (test == surname)没有任何问题。

答案 2 :(得分:0)

这是一个有趣的问题! 让我们看看'或'和'和'功能一点点。 两个函数都不返回True或False,但返回最后一个相关对象。 '或'返回第一个True对象(因为在找到它之后,函数知道它是真的),'和'返回第一个False对象(因为在找到它之后,函数知道它是假的)。 例如:

>>> False or 2 or 3 or 4
2
>>> True and [1] and "" and 123
""

Python将空字符串(“”)视为False,将正数(2)视为True。将这些值插入“if”语句将对“and”和“或”函数的返回值运行bool()类型函数。

所以当你跑:

"good" if (name or surname) in test else "bad"

您实际上是在询问名称(“test”)是否在测试中(“test1”)。 (name或surname)返回名称,因为它不是空字符串。 Python检查它是否可以在测试字符串中找到这个子字符串,它可以,因此它返回True。

但是跑步:

"good" if test == (name or surname) else "bad"

就像询问test(“test1”)是否等于name(“test”)。

正确的写作方式是:

"good" if test in (name,surname) else "bad"

我希望这会有所帮助:)

答案 3 :(得分:0)

我做了一些测试:

>>> test = 'test1'
>>> name = 'test'
>>> surname = 'test1'
>>> name or surname
'test'
>>> name or test
'test'
>>> '1234' or '6543'
'1234'
>>> (name or surname) in test
True #however this does not mean what you think it means
>>> ('1' or '2') in '234'
False #even though you'd expect True
>>> '1' or '2'
'1'
>>> '2' or '1'
'2'

如您所见,当您执行stringstring时,它只会返回第一个字符串。

因此,你想要的是:

>>> (name in test) or (surname in test)
True

OR

>>> test in (name,surname)
True

希望澄清一些有关pythonstrings以及comparisons

的特殊情况