2

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

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

我知道如何使预期的逻辑工作,但我只想知道为什么它为我传递给 raw_input 的任何数字打印是。我希望答案尽可能详细,因为我不明白为什么它会失败,这对我来说似乎足够pythonic

4

3 回答 3

4

问题是您的代码对 Python 来说是这样的:

if (number is "1") or "0" or "2":

并且由于任何非空字符串True的计算结果为 ,它总是True

做你想做的事,一个很好的语法是:

if number in {"1", "0", "2"}:

请注意我在这里使用了一个集合 - 虽然在这种情况下(只有三个值)并不重要,但检查一个集合比一个列表更快,因为一个集合的成员资格测试是 O(1) 而不是 O (n)。

这只是写这个更好,更容易:

if number == "1" or number == "0" or number == "2":

这就是你想要的。

请注意,在比较值时,您应该始终使用==not is-is是身份检查(两个值是同一个对象)。通常,您应该使用oris之类的东西。is Trueis None

如果你想把它当作一个数字来处理,你可以这样做:

try:
   value = int(number)
except ValueError:
   value = None
if value is not None and 0 <= value <= 2:
    ...

在您想要与大量数字进行比较的情况下,这可能更有用。请注意我使用了 Python 有用的比较链接(0 <= value <= 2而不是0 <= value and value <= 2)。

于 2012-05-05T10:32:55.950 回答
3

正确的语法如下:

if number == "1" or number == "0" or number == "2":
    print "Yes"

或者更 Pythonic:

if number in ["1", "2", "3"]:
    print "Yes"

或者您可以投射int并尝试:

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

您的代码评估的原因True一直是因为它正在评估 and 的真实性"0""2"这在 Python 中 as 语句是真实的。

于 2012-05-05T10:35:13.167 回答
0

因为 an 之间的每个表达式or都被评估为布尔表达式。

if True计算为真,if 1:计算为真,if "0":计算为真。

所以你写的或多或少相当于:

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

你应该写if number is "1" or number is "0" or number "2":或者,更pythonic:if number in ("1", "0", "2"):

于 2012-05-05T10:33:31.550 回答