为什么要计算False
?你知道吗
1==0 <= 1/0
首先请注意,在Python中:
bols = [False, True]
for A in bols:
for B in bols:
print(f'{str(A):>5}, {str(B):>5}, {str(A<=B):>5}')
输出:
False, False, True
False, True, True
True, False, False
True, True, True
如果你熟悉布尔逻辑,这对你来说应该很自然。你知道吗
现在变得很奇怪:
print(1==1 <= 1/1, 1==0 <= 1/1)
输出:True, False
现在更奇怪的是:
print(1==0 <= 1/0)
输出:False
为什么最后一个不抛出例外?你知道吗
我的第一个猜测是因为解析问题。 例如,我们可以修复前面的比较添加括号:
print(1==1 <= 1/1, (1==0) <= 1/1)
输出:True, True
但是,如果这个问题是一个解析问题,那么当我们除以0时,python为什么不会引发异常呢?你知道吗
如果我们在最后一个比较中添加括号,我们可以强制Python提出零除法例外:
print((1==0) <= 1/0)
输出:ZeroDivisionError: division by zero
另外,为什么下面会引发一个例外?你知道吗
1==1 <= 1/0
输出:ZeroDivisionError: division by zero
注意:这也适用于其他例外情况,可能适用于任何情况,因为python不计算不等式的右侧。你知道吗
为什么?你知道吗
我可以理解,如果懒散的评价是True
,但为什么False
?感觉像是Python里的虫子。你知道吗
1==0<;=1/0
1/0
从不计算。表达式在Python中触发链式比较。评估如下:当达到
False
值时,逻辑and
短路,因此第二个条件永远不会被测试。因为1 == 0
的计算结果是False
,所以结果是False
。你知道吗1==1<;=1/0
同样地,这被评估为:
因为第一个表达式是
True
,所以对第二个表达式求值。这导致ZeroDivisionError
。你知道吗(1==0)<;=1/0
括号的优先级高于比较运算符。所以这里不会触发链式比较。表达式的计算结果为
False <= 1/0
。当然,比较将失败,因为ZeroDivisionError
。你知道吗1==1<;=1/1,1==0<;=1/1
在这里,您定义了
tuple
个结果。元组是由分隔两个表达式的逗号所隐含的。第一个1==1 <= 1/1
,计算结果是True
,因为True <= 1
。第二个1==0 <= 1/1
,计算结果是True
,因为False <= 1
。你知道吗因为
bool
是int
的一个子类,所以True
等价于1
,False
等价于0
,所以这些比较是有效的。你知道吗相关问题 更多 >
编程相关推荐