Python“如果X == Y和Z”语法

时间:2010-09-02 17:27:29

标签: python if-statement

这是:

if key == "name" and item:

与此相同:

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

如果是这样,我对example 5.14 in Dive Into Python感到困惑。键如何等于“名称”和项目?另一方面,“和项目”只是询问项目是否作为变量存在吗?

8 个答案:

答案 0 :(得分:33)

if key == "name" and item:表示if (key == "name") and (item evaluates to True)

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

答案 1 :(得分:10)

Manoj解释得很好。这里有一些补充说明。

伪代码

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

应该是这样的:

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

一个有趣的习惯用语是:

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

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

答案 2 :(得分:4)

不,你必须重复这个表达。它评估为两个独立的条件,并检查两者是否都为真 -

  1. x == y
  2. z
  3. 检查Python documentation以获取Python中被视为False的列表

    (但有趣的是,与其他语言相反,以下内容:

    if 3 < x < 6
    

    相当于

    if x > 3 and x < 6
    

答案 3 :(得分:3)

假设您确实想要

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

你可以这样做

if key == "name" == item:

答案 4 :(得分:1)

其他人已经解释了如何评估你所询问的表达方式。需要知道的一件事是,如果“and”运算符的第一个操作数的计算结果为false,则永远不会计算第二个操作数,因为如果一个操作数为false,则“and”的结果总是为false,如果你知道第一个操作数是假的,那么整个“和”是假的,你不必评估第二个。这称为“短路”并适用于“或”以及“和”(除非“或”在任一操作数为真时始终为真,因此仅在第一个操作数为false时才计算第二个操作数)。 / p>

您需要知道的另一件事是整个“和”操作的结果是评估的最后一个操作数的值。由于文字常量True和False以外的东西在逻辑上都是真或假,因此在某些情况下,这个事实(与短路相结合)可以用作“if”语句的替代,并且偶尔会看到它使用那种方式。

例如,如果x为真,则“x或y”求值为x,如果x为假则求值为y。有时,这用于提供缺失值的默认值:

name = raw_input("Enter your name: ") or "dude"
print "Hello, %s!" % name

如果您没有在提示符处输入任何内容,只需按Enter键,raw_input的返回值为空字符串“”,这被视为false。由于“或”的左分支是假的,它不会短路,并且评估右分支,因此“或”的结果是“dude”。如果您在提示符处输入了值,则由于短路而不会对右分支进行评估,因此“或”的值是您输入的值。

很多人都认为滥用布尔运算符这种方式是糟糕的风格,因为Python有“x if y else z”,但是这个特殊的用法让我感觉足够可读。 (但这只是唯一一个!)“价值是这个,或者如果它是空的那么。”将其与以下内容进行比较:

name = raw_input("Enter your name: ")
name = name if name else "dude"
print "Hello, %s!" % name

答案 5 :(得分:1)

@Manoj 在描述行为时是正确的,并指定了正确的等效语句。然而,我想讨论短路,即正在评估的机制。

x and y

的简写
if x:
  return y
else:
  x

评估:

if key == "name" and item:

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

if key != "name" 那么我们将返回 False 并根据该值评估条件并且不发生任何操作。

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

if item:
 # action :: do something

并且如果 item 也存在,则在 if 块下指定的操作将遵循。

答案 6 :(得分:0)

如果您查看示例5.14的代码:

def __setitem__(self, key, item):         
    if key == "name" and item:            
        self.__parse(item)                
    FileInfo.__setitem__(self, key, item)

item是一个变量,类似于密钥。

如果评估为iftrue,则可以在false语句中使用。

例如

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

答案 7 :(得分:0)

@Victor Neo:你也不需要单独的布尔值:

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

如果使用orand使用非布尔值,则首选使用语句,这会在value if condition else value在Python中可用之前模拟效果。