首页 > 解决方案 > 将比较运算符与它在代数上的工作方式联系起来

问题描述

我目前正在学习 python,在特定的比较运算符中。假设我想检查一个数字是否在两个值之间。

在数学中,假设 X 是一个数字,这可以表示为:70 < x < 80

我知道在python中这可以写成:

x = number
if (x>70) and (x<80):
    pass

如果可以改写,我会检查解释器:

x = number
if(70<x<80):
    pass

并且有效它确实有效。我的疑问是,这种语法是否正确?我会因为以这种方式编写代码而出现问题吗?

抱歉,如果问题是针对新手的,但我需要确保我的代码能够正常工作,并且我无法在互联网上找到信息。

提前致谢!

标签: pythonpython-3.x

解决方案


这种语法是完全合法(并且有保证)的行为。有所谓的“链式比较”

比较可以任意链接,例如,x < y <= z 等价于 x < y 和 y <= z,除了 y 只计算一次(但在这两种情况下,当找到 x < y 时根本不计算 z是假的)。

形式上,如果 a, b, c, ..., y, z 是表达式并且 op1, op2, ..., opN 是比较运算符,那么 a op1 b op2 c ... y opN z 等价于 a op1 b 和 b op2 c和 ... y opN z,除了每个表达式最多计算一次。

请注意,a op1 b op2 c 并不意味着 a 和 c 之间的任何类型的比较,因此,例如,x < y > z 是完全合法的(尽管可能不漂亮)。

以下是它的工作原理:

>>> from dis import dis
>>> def f(x):
       return 70 < x < 80

>>> dis(f)
  2           0 LOAD_CONST               1 (70)
              2 LOAD_FAST                0 (x)
              4 DUP_TOP
              6 ROT_THREE
              8 COMPARE_OP               0 (<)
             10 JUMP_IF_FALSE_OR_POP    18
             12 LOAD_CONST               2 (80)
             14 COMPARE_OP               0 (<)
             16 RETURN_VALUE
        >>   18 ROT_TWO
             20 POP_TOP
             22 RETURN_VALUE

有趣的是,这些测试是独立的,不相互依赖,所以你可以这样写:

>>> x = 20
>>> 40 > x < 30
True

这意味着40 > x and x < 30


推荐阅读