3

我是这里的新成员,也是 python 的新手。我的问题如下,这样的行是否有效?

if x or y is 'whatever':

我在解释器中对此进行了测试,得到的结果不一致。这条线似乎产生了更一致和预期的结果

if (x or y) is 'whatever':

还是最好明确地把所有东西都安排好

if x is 'whatever' or y is 'whatever':

最后一个总是有效的,但我只是想让我的代码更简洁,同时仍然遵循最佳实践。我尝试进行搜索以免提出多余的问题,但搜索“是”、“或”和“和”相当困难。提前感谢您的任何帮助。

编辑:感谢大家的快速回复。当我需要“或”时,这对我来说非常有用

if 'whatever' in [x,y]:

但是,如果我需要一个“和”,我将如何压缩它?

if x == 'whatever' and y == 'whatever':
4

4 回答 4

8

or不像英语那样工作。

x or y如果 x 是真值,则返回 x,否则返回 y。如果字符串不为空,则字符串是真实的。

更糟糕的是,“is”的优先级高于“or”,因此您的表达式与x or (y is 'whatever'). 因此,如果 x 不为空,则返回 x(这将为 true,因此 if 将执行)。如果 x 为空,它将评估y is 'whatever'

顺便说一句:不要使用“is”来比较值相等,使用 ==。

你想要这个(括号可选):

if (x == 'whatever') or (y == 'whatever'):

或更简洁,但更陌生:

if 'whatever' in [x, y]:
于 2011-10-06T17:39:40.553 回答
3

Python不是英语。

if x or y is 'whatever':

方法:

if x or (y is 'whatever'):

X 是真的还是 y 是“随便”

if (x or y) is 'whatever':

x or y变为 x 或 y。如果 x 为真,则返回 X,否则变为 Y。然后将其结果与“whatever”进行比较。

你永远不应该将字符串与is反正比较。字符串应该使用==. 是指一些不同的东西,有时会偶然起作用。

您的实际请求可以写成:

if 'whatever' in [x,y]:

这将检查字符串是否在列表中[x,y]

于 2011-10-06T17:42:53.287 回答
1

我认为这会起作用:

if "whatever" in (x, y):

不过这有点奇怪。

于 2011-10-06T17:41:20.373 回答
1
if x or y is 'whatever' # this is akin to if x or (y is 'whatever')

if (x or y) is 'whatever': # (x or y) returns the first non-false value...

if x is 'whatever' or y is 'whatever': # this is valid and correct (aside from the fact you shouldn't be using `is`, see below)

你可能有

if 'whatever' in (x, y)

或者,如果条件列表较长,最好使用“任何”函数:

if any([condition(k) for k in list])

但是在你暴露的情况下它是矫枉过正的,因为你只想知道'whatever'是否包含在[x,y]中。

更新:

考虑到 'is' 实际上是在比较内存地址,并且(如此处所指出的在字符串上使用它并不是一个好习惯。

于 2011-10-06T17:44:12.713 回答