Python中的“if X == Y and Z”语法

15

这个是否:

if key == "name" and item:

意思与此相同:

if key == "name" and if key == "item":

如果是这样,我对《深入Python》中的示例5.14感到完全困惑。key怎么可能既等于"name"又等于item呢?另一方面,“and item”是否只是在询问item是否存在作为一个变量?

2
如果你想了解这方面的基础知识,可以查看布尔逻辑或条件逻辑。 - Chris
2
当你尝试过后,你有什么观察结果吗?请发布你评估的结果。你可以在交互式Python中运行它并发布结果。 - S.Lott
8个回答

34

if key == "name" and item:

意思是如果key等于"name"且item求值为True

请注意,item求值为True可以通过多种方式实现。例如,if (key == "name") and []将求值为False


8
不!! 在$b = 0;之后,isset($b)评估为true,但$b是false。而isset(true)是无意义的,而 while True则是编写无限循环的方法 - user395760
@paracaudex:在Python中,一个更好的等价于isset($b)的方法是("b" in locals() or "b" in globals())。但这在Python中有些奇怪和不寻常;通常特定代码运行时作用域内的变量集应该是静态可预测的。 - poolie

13

Manoj已经很好地解释了。这里是一些补充说明。

伪代码

if key == "name" or if key == "item":

应该是这样的:

if key == "name" or key == "item":

一个有趣的惯用语来实现它是:

if key in ("name", "item"):

但是它对于非常大的条件更有用,您只需知道某个值是否等于列表中的任何其他值。


4
不,你必须重复表达式。它将作为两个单独的条件进行评估,并检查两者是否都为真 -
  1. x == y
  2. z
请查看Python文档以获取Python中被认为是False的列表
(但有趣的是,与其他语言不同,以下内容:
if 3 < x < 6

等同于

if x > 3 and x < 6

)


4

假设你确实需要这样做

if key == "name" and if key == item:

你可以这样做

if key == "name" == item:

2
其他人已经解释了你所询问的表达式是如何被评估的。需要知道的重要一点是,如果“and”运算符的第一个操作数评估为false,则第二个操作数永远不会被评估,因为如果一个操作数为false,“and”的结果始终为false,并且如果您知道第一个操作数为false,则整个“and”为false,您不必评估第二个操作数。这被称为“短路”,并适用于“or”和“and”(除了“or”在任一操作数为true时始终为true,因此只有在第一个操作数为false时才评估第二个操作数)。
另一件需要知道的事情是,整个“and”操作的结果是最后一个被评估的操作数的值。由于除了文字常量True和False之外的其他内容都被视为逻辑上的true或false,这个事实(与短路相结合)可以在某些情况下用作“if”语句的替代品,并且您偶尔会看到它被用作这种方式。
例如,“x or y”如果x为true,则评估为x,但如果x为false,则评估为y。有时,这用于为缺失的值提供默认值:
name = raw_input("Enter your name: ") or "dude"
print "Hello, %s!" % name

如果您在提示框中什么都不输入,只需按下Enter键,则raw_input的返回值为空字符串“”,被视为false。由于“or”的左侧分支是false,它不会短路,右侧分支将被评估,因此“or”的结果是“dude”。如果您在提示框中输入一个值,则由于短路,“or”的右侧永远不会被评估,因此“or”的值就是您输入的内容。
现在Python已经有了“x if y else z”,很多人认为滥用布尔运算符是一种不好的风格,但我认为这种特定的用法足够可读。(但这是唯一的例子!)“值是这个,如果它是空的,那就是那个。”与以下内容进行比较:
name = raw_input("Enter your name: ")
name = name if name else "dude"
print "Hello, %s!" % name

1

@Manoj描述的行为是正确的,并指定了正确的等价语句。但我希望讨论短路,即评估机制。

x and y 是简写形式

if x:
  return y
else:
  x

evaluation goes:

if key == "name" and item:

key == "name" and item 将首先被评估。

如果 key != "name",那么我们将返回 False,并且该条件会根据此值进行评估,不会发生任何操作。

但是,如果 key == "name",我们将返回 item。现在,item 成为 if 循环的条件。

if item:
 # action :: do something

如果item也存在,那么在if块下面指定的操作将会执行。

0
如果您查看示例5.14的代码:
def __setitem__(self, key, item):         
    if key == "name" and item:            
        self.__parse(item)                
    FileInfo.__setitem__(self, key, item)

item是一个变量,类似于key

如果它的值为truefalse,则可以在if语句中使用它。

例如:

happy = True
name = "Peter"
if name == "Peter" and happy:
    print name + " is happy!"

0

@Victor Neo:另外,您不需要单独的布尔值:

for happy in (False, "Peter", '', "Susan" , []):
    print(happy + ' is happy.' if happy else 'Everybody is bored.')

使用if语句而不是在非布尔运算中使用orand更可取,这种方法在Python引入value if condition else value之前模拟了相同的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接