Python“if”评估“和”的两个方面?

时间:2012-09-28 14:57:39

标签: python

有人可以告诉我为什么以下失败:

teststr = "foo"
if not teststr.isdigit() and int(teststr) != 1:
   pass

使用:

ValueError: invalid literal for int() with base 10: 'foo'

在C中,如果&&测试中的第一部分失败,则不再评估右侧。这在Python中是不同的吗?

编辑:我是傻瓜。 and当然应该是or .....

4 个答案:

答案 0 :(得分:8)

not teststr.isdigit()为True,因此第一次测试不会失败。

答案 1 :(得分:2)

if not teststr.isdigit() and int(teststr) != 1:

评估为

if ((not teststr.isdigit()) and (int(teststr) != 1)):

好吧,但teststr不是数字,因此isdigit()为false,因此(not isdigit())为真。对于True and B,你必须评估B.这就是为什么它会将演员阵容设为int。

答案 2 :(得分:0)

if not teststr.isdigit()为True,因此需要评估int(teststr)以完成and的要求 - 因此例外。

不使用预先检查数据,而是使用EAFP - 并使用以下内容......

try:
    val = int(teststr)
    if val != 1:
        raise ValueError("wasn't equal to 1")
except (ValueError, TypeError) as e:
    pass # wasn't the right format, or not equal to one - so handle
# carry on here...

答案 3 :(得分:0)

您可能想要使用的代码可能是

try:
    int(teststr)
except ValueError:
    print "Not numeric!"

尝试某些事情并捕获异常通常更加pythonic,而不是像你一样使用类型检查方法。