当前位置: 首页 > 知识库问答 >
问题:

你能在Python中简化不相等或相等的链式比较吗?[重复]

徐鸿文
2023-03-14

但是Pycharm说我可以简单地说:

if y > x and x != -1:
    #  do something

我做了一些搜索,却找不到类似的东西。我的问题是这样简化此函数是否正确:

if y > x != -1:
    #  do something

如果是这样,它是否安全,除了它更短之外,这个版本和非简化版本之间有什么区别吗?如果不是正确的简化方式,那是什么呢?

共有1个答案

越朗
2023-03-14

这在功能上是等效的,但当:

10 < x < 40

很好阅读,混合使用不同的运算符来使用链式比较不是最佳选择。

这真的一样吗?让我们拆开看看:

def f1(x,y):
    if y > x and x != -1:
        return 0

def f2(x,y):
    if y > x != -1:
        return 0

import dis

print("function 1")
dis.dis(f1)
print("function 2")
dis.dis(f2)

结果:

function 1
  2           0 LOAD_FAST                1 (y)
              3 LOAD_FAST                0 (x)
              6 COMPARE_OP               4 (>)
              9 POP_JUMP_IF_FALSE       28
             12 LOAD_FAST                0 (x)
             15 LOAD_CONST               3 (-1)
             18 COMPARE_OP               3 (!=)
             21 POP_JUMP_IF_FALSE       28

  3          24 LOAD_CONST               2 (0)
             27 RETURN_VALUE
        >>   28 LOAD_CONST               0 (None)
             31 RETURN_VALUE
function 2
  6           0 LOAD_FAST                1 (y)
              3 LOAD_FAST                0 (x)
              6 DUP_TOP
              7 ROT_THREE
              8 COMPARE_OP               4 (>)
             11 JUMP_IF_FALSE_OR_POP    23
             14 LOAD_CONST               3 (-1)
             17 COMPARE_OP               3 (!=)
             20 JUMP_FORWARD             2 (to 25)
        >>   23 ROT_TWO
             24 POP_TOP
        >>   25 POP_JUMP_IF_FALSE       32

  7          28 LOAD_CONST               2 (0)
             31 RETURN_VALUE
        >>   32 LOAD_CONST               0 (None)
             35 RETURN_VALUE
>>> 

令人惊讶的是,它们不一样,链接版本有更多的指令。

不确定这里发生了什么(有些人花了更多的时间来更好地解释它:Python中的链式比较实际上是如何工作的?),但实际上我会坚持使用版本的快捷方式,并且非常可读(想想未来的维护者....)。

也就是说,关于链式比较,一件有趣的事情是,如果中心参数是计算的/需要很长时间来计算/在计算中有副作用,并且您不想将其存储在变量中:

if y > super_long_computation(x) != -1:

在这种情况下,只计算一次中心参数。在的情况下,您必须事先存储它。

 类似资料:
  • 问题内容: 首先采取klurudge解决方案,使用哨兵方法(必须让您的程序不允许输入哨兵值): 假设您忘记了阻止程序中的哨兵值,用户在B字段中输入了-2147483648,而A为空。上面的代码报告为true,应报告为false,不应报告为true或null。 比较可为空字段上的相等性的最简洁方法是什么?A == B仅应报告true或false,而不管该字段是否可为空。 问题答案: 也许IS [NO

  • JavaScript 有两种方式判断两个值是否相等。 等于操作符 等于操作符由两个等号组成:== JavaScript 是弱类型语言,这就意味着,等于操作符会为了比较两个值而进行强制类型转换。 "" == "0" // false 0 == "" // true 0 == "0"

  • 我想从有更多经验的人那里得到一些建议,他们在Java中使用原始的双相等。由于可能的舍入错误,对两个双和使用是不够的。 我的问题是: > 使用相对误差计算某个增量值,是否有一个通用(而不是特定于应用程序)的增量值值得推荐?请参阅下面的示例。 下面是一个通用函数,用于检查考虑相对错误的相等性。您建议的值是多少,以捕获简单操作 ,-,/,* 操作中的大部分舍入错误?

  • 我有两个整数值和,我写以下语句: 此语句带有下划线,工具提示告诉我必须: 简化链式比较 据我所知,这种比较几乎和它们来的一样简单。我错过了什么? 这个问题和链接有点不同,比较起来有不同的变量。

  • 我正在用PyCharm编写一些python代码。当我编写以下测试时,它给了我一个警告。

  • 问题内容: 给出两个列表: 我怎么写这样的: 问题答案: 你想要这个吗: 注意:当List处于无序状态时(例如,( 和中的 通知顺序))无用 请参阅此问题以获取更多参考:如何在python中比较列表/集合的列表? 编辑 :感谢@dr jimbob 如果要在排序后进行比较,可以使用。 但是再说一遍,如果那是因为,与众不同( 不是深度排序 ) 为此,您必须使用链接答案中的技术。由于我也在学习Pytho