python压缩比较

python压缩比较,python,comparison,comparison-operators,Python,Comparison,Comparison Operators,我是这里的新成员,也是python的新手。我的问题是,这样的一句话有效吗 if x or y is 'whatever': 我在解释器中对此进行了测试,结果不一致。这条线似乎产生了更加一致和预期的结果 if (x or y) is 'whatever': 还是最好把所有事情都明确地列出来 if x is 'whatever' or y is 'whatever': 最后一个总是有效的,但我只是想让我的代码更加简洁,同时仍然遵循最佳实践。我试着做了一次搜索,以避免问多余的问题,但搜索“是”或

我是这里的新成员,也是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':

的工作原理与英语不同

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

更糟糕的是,“is”的优先级比“or”高,因此您的表达式与
x或(y是“任意的”)
相同。因此,如果x不是空的,它将返回x(这将是真的,因此if将执行)。如果x为空,它将计算
y为“任意”

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

您需要此选项(可选选项):

或者更简洁,但更陌生:

if 'whatever' in [x, y]:

我认为这是可行的:

if "whatever" in (x, y):
不过有点奇怪。

Python不是英语

if x or y is 'whatever':
指:

if x or (y is 'whatever'):
哪个是X是真的,或者y是“随便什么”

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

无论如何,永远不要将字符串与
is
进行比较。应使用
=
比较字符串。是指不同的东西,有时是偶然发生的

您的实际请求可以写为:

if 'whatever' in [x,y]:
这将检查字符串是否在列表中
[x,y]

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])
但在你暴露的情况下,这是过分的,因为你只想知道[x,y]中是否包含“whatever”

更新:


考虑到“is”实际上是在比较内存地址,并且(正如所指出的)在字符串上使用它不是一种好的做法。

也许我在这方面做得太久了,但我不知道最后一位有多奇怪。
x或y
如果是真的,则返回
x
,否则返回
y
。它不会返回
False
,除非
x
为False且
y
本身为
False
@IgnacioVazquez Abrams:是的!我走得太快了,修正了。嗯,我没有发现第二个案例总是错误的,至少在翻译中是这样。这是正确的。Python版本的“x或y”返回x或y中的任意一个,而不是实际的布尔值。另外,与只在整个列表中使用in相比,您的
任何
构造有什么意义?而且,您仍然说在第三行使用is是有效和正确的。(好的,是的,我在这里是一个固执的人)@WinstonEwert我把我的观点说得更清楚了(希望如此!):问题是关于压缩条件语句,所以我更一般了一点;你完全正确,在这种情况下,“[x,y]中的‘whatever’就足够了。对于你的最后一个问题,答案是,
如果x==y==‘whatever’
这意味着:内存中有一个字符串对象,其值为‘whatever’,名称为x的引用所指向的对象和名称为y的引用所指向的对象是同一个值为“whatever”的对象。x和y是标识符,也就是说字符串是变量的名称,其本质是指针,这些指针指向对象x和y。Python的数据模型是:x标识符,名为x的底层指针(在Python中称为引用),引用指向对象x。这样想你就不会有问题了
if any([condition(k) for k in list])