python - 将比较运算符与它在代数上的工作方式联系起来
问题描述
我目前正在学习 python,在特定的比较运算符中。假设我想检查一个数字是否在两个值之间。
在数学中,假设 X 是一个数字,这可以表示为:70 < x < 80
我知道在python中这可以写成:
x = number
if (x>70) and (x<80):
pass
如果可以改写,我会检查解释器:
x = number
if(70<x<80):
pass
并且有效它确实有效。我的疑问是,这种语法是否正确?我会因为以这种方式编写代码而出现问题吗?
抱歉,如果问题是针对新手的,但我需要确保我的代码能够正常工作,并且我无法在互联网上找到信息。
提前致谢!
解决方案
这种语法是完全合法(并且有保证)的行为。有所谓的“链式比较”:
比较可以任意链接,例如,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
。
推荐阅读
- c++ - 实现可打印类而不支付 iostream 编译费用?
- c++ - 创建新的原始数据类型的最佳方法是什么?
- snowflake-cloud-data-platform - Snowflake 无服务器任务创建返回错误
- python - 如果长度超过 2000 个字符,则拆分消息,但不会剪切/断行
- jwt - 云功能和多租户 REST 应用程序
- python - 如何使用 python pil 创建不同的透明度,如渐变?
- excel - 当单元格有多个值时有没有办法匹配
- java - 如何在java中保持更新和跟踪二维数组?
- safari - Safari 意外崩溃
- mongodb - 统计数据库 mongoDB 上的集合