我希望有人向我解释为什么一个有效,另一个没有:
>>> 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对此有所说明?答案 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'
如您所见,当您执行string
或string
时,它只会返回第一个字符串。
因此,你想要的是:
>>> (name in test) or (surname in test)
True
OR
>>> test in (name,surname)
True
希望澄清一些有关python
和strings
以及comparisons