python中的行为:

python中的行为:,python,Python,我已经编写了以下代码,我所要做的就是,如果传递的数字是1、0或2的字符串表示形式,则打印yes,对于其他所有内容,则打印false: number=raw_input() if number is "1" or "0" or "2": print "Yes" else: print "no" 我知道如何使预期的逻辑工作,但我只想知道为什么它会为我传递给原始输入的任何数字打印yes。我希望答案尽可能详细,因为我无法理解它为什么会失败,对我来说,它似乎已经够Python的了。问题

我已经编写了以下代码,我所要做的就是,如果传递的数字是1、0或2的字符串表示形式,则打印yes,对于其他所有内容,则打印false:

number=raw_input()
if number is "1" or "0" or "2":
    print "Yes"
else:
     print "no"

我知道如何使预期的逻辑工作,但我只想知道为什么它会为我传递给原始输入的任何数字打印yes。我希望答案尽可能详细,因为我无法理解它为什么会失败,对我来说,它似乎已经够Python的了。问题是,对于Python,您的代码如下所示:

if (number is "1") or "0" or "2":
try:
   value = int(number)
except ValueError:
   value = None
if value is not None and 0 <= value <= 2:
    ...
当任何非空字符串的计算结果为
True
,它总是
True

要执行您想要执行的操作,一个很好的语法是:

if number in {"1", "0", "2"}:
请注意,我在这里使用了一个集合——虽然在这种情况下(只有三个值)没有太大关系,但检查集合要比检查列表快,因为集合的成员资格测试是O(1)而不是O(n)

这只是一个更好、更容易的写作方式:

if number == "1" or number == "0" or number == "2":
这正是你想要的

注意:在对值进行比较时,应始终使用
==
而不是
is
-
is
是身份检查(两个值是相同的对象)。通常,您应该使用
is
来处理
is True
is None
之类的内容

如果您想将其作为一个数字处理,可以执行以下操作:

if (number is "1") or "0" or "2":
try:
   value = int(number)
except ValueError:
   value = None
if value is not None and 0 <= value <= 2:
    ...
试试看:
值=整数(数字)
除值错误外:
值=无

if值不是None和0,因为
之间的每个表达式都作为布尔表达式计算

如果为真
计算结果为真,
如果1:
计算结果为真,
如果为“0”:
计算结果为真

因此,您所写的内容大致相当于:

if number is "1":
    print "Yes"
elif "0":
    print "Yes"
elif "2":
    print "Yes"
else:
     print "no"

如果数字为“1”或数字为“0”或数字为“2”,则应编写
或更通俗的:
如果数字为(“1”、“0”、“2”):
正确的语法如下:

if number == "1" or number == "0" or number == "2":
    print "Yes"
或者更像蟒蛇:

if number in ["1", "2", "3"]:
    print "Yes"
或者您可以强制转换到
int
并尝试:

if int(number) in range(1,4):
    print "Yes"

代码始终计算为
True
的原因是,它计算的是
“0”
“2”
的真值,这两个语句在Python中都是真的。

+1表示set-literal(在Python 2.7+中提供),此外,使用
is
时,还警告不要进行字符串比较。谢谢…特别是最后的注释,我不知道。请注意,使用列表进行比较是一个坏主意-在这种情况下,使用一小组检查并不重要,但检查列表中的成员身份速度较慢,因此使用集合是有意义的。还值得注意的是,如果输入可能不是数字,您的上一个示例将抛出异常。我知道异常的可能性,但不知道检查列表成员资格对性能的影响。谢谢你的提示!