第一个错误时测试第二个条件

时间:2015-06-26 20:18:49

标签: python

我有一个简单的程序

temp='abc12a'
ver = 1
print(temp[-1].isdigit())
if temp[-1].isdigit() & int(temp[-1])!=ver:
    print(temp[:-1]+t)

给出输出

False
Traceback (most recent call last):
  File "python", line 3, in <module>
  ValueError: invalid literal for int() with base 10: 'a'

当第一个条件为假时,为什么第二个条件会被检查?有没有办法只做第二个如果第一个是真的比两个ifs更干净?

2 个答案:

答案 0 :(得分:3)

Python中的&运算符检查为按位和。它不会短路。 and运算符正确地短路,这是您正在寻找的行为。

答案 1 :(得分:0)

布尔连字词是andornot

&是一个按位和。

来自5.10. Boolean operations

or_test  ::=  and_test | or_test "or" and_test
and_test ::=  not_test | and_test "and" not_test
not_test ::=  comparison | "not" not_test

在布尔运算的上下文中,以及控制流语句使用表达式时,以下值被解释为false:FalseNone,所有类型的数字零和空字符串和容器(包括字符串,元组,列表,字典,集合和frozensets)。所有其他值都被解释为true。 (有关更改此方法的方法,请参阅__nonzero__()特殊方法。)

如果参数为假,则not运算符True,否则为False

表达式x and y首先评估x;如果x为false,则返回其值;否则,将评估y并返回结果值。

表达式x or y首先评估x;如果x为真,则返回其值;否则,将评估y并返回结果值。

(请注意,andor都不会限制它们返回FalseTrue的值和类型,而是返回最后一个已评估的参数。这有时很有用例如,如果s是一个应该被默认值替换的字符串,如果它是空的,则表达式s or 'foo'会产生所需的值。因为无论如何都不需要发明一个值,它不会打扰返回与其参数相同类型的值,例如,not 'foo'产生False,而不是''。)