相关疑难解决方法(0)

"仅评估一次"对于Python中的链式比较意味着什么?

一位朋友引起了我的注意,在我指出一个奇怪之后,我们都很困惑.

比方说,Python的文档已经说过至少2.5.1(还没有进一步检查:

比较可以任意链接,例如,x <y <= z等于x <y和y <= z,除了y仅被评估一次(但在两种情况下,当x <y被发现时,根本不评估z是假的).

我们的困惑在于"y仅被评估一次"的含义.

鉴于一个简单而有人工作的课程:

class Magic(object):
    def __init__(self, name, val):
        self.name = name
        self.val = val
    def __lt__(self, other):
        print("Magic: Called lt on {0}".format(self.name))
        if self.val < other.val:
            return True
        else:
            return False
    def __le__(self, other):
        print("Magic: Called le on {0}".format(self.name))
        if self.val <= other.val:
            return True
        else:
            return False
Run Code Online (Sandbox Code Playgroud)

我们可以产生这样的结果:

>>> x = Magic("x", 0)
>>> y = Magic("y", 5)
>>> z = Magic("z", 10)
>>> 
>>> if x < y …
Run Code Online (Sandbox Code Playgroud)

python

19
推荐指数
2
解决办法
3757
查看次数

Python比较运算符从左到右链接/分组?

运算符优先级的Python文档说明:

同一个框组中的操作员从左到右(除了比较,包括测试,它们都具有相同的优先级和从左到右的链 - 参见比较部分......)

这是什么意思?特别:

  1. "从同一个盒子组中的操作员从左到右(除了比较......)" - 做比较不是从左到右分组?

  2. 如果比较不是从左到右分组,那么他们做了什么呢?他们"链"而不是"群体"吗?

  3. 如果比较"链"而不是"组","链接"和"分组"之间有什么区别?

  4. 什么样的例子可以证明比较运算符从左到右而不是从右到左链接?

python comparison operator-precedence associativity

16
推荐指数
1
解决办法
2309
查看次数

SQLAlchemy中的链式比较

Python 支持链式比较:1 < 2 < 3转换为(1 < 2) and (2 < 3).

我正在尝试使用SQLAlchemy进行SQL查询,如下所示:

results = session.query(Couple).filter(10 < Couple.NumOfResults < 20).all()
Run Code Online (Sandbox Code Playgroud)

我得到的结果并不像预期的那样.我已经关闭了引擎的echo=True关键字,实际上 - 生成的SQL查询只包含了两个比较中的一个.

我找不到任何明确说明这是禁止的文件.我假设如果Python支持这种类型的表达式,那么SQLAlchemy也应该支持它.

为什么这不起作用?我有一个可能的解决方案(在答案中分享),但很高兴听到其他意见.

python database orm sqlalchemy

7
推荐指数
1
解决办法
414
查看次数

为什么'=='在Python之前'in'出现?

以下代码输出False,根据Python操作顺序,它应该输出True(顺序应该在 - > ==,而不是相反).为什么==之前会来?

y = "33"
"3" in y == True
Run Code Online (Sandbox Code Playgroud)

产量

False
Run Code Online (Sandbox Code Playgroud)

python

7
推荐指数
2
解决办法
232
查看次数

为什么这个表达式是 False?

在Python中,

1 in {1} == True
Run Code Online (Sandbox Code Playgroud)

也就是False为什么?

我首先认为这是由于运算符优先级造成的,但我能找到的所有内容(见下文)告诉我表达式是从左到右计算的:

  • 1 in {1}True
  • True == TrueTrue

此外,任何其他优先级都会导致TypeError

  • {1} == TrueFalse
  • 1 in False返回一个TypeError

Python 从左到右计算表达式。

https://docs.python.org/3/reference/expressions.html#evaluation-order

还,

同一框中的运算符具有相同的优先级。[...] 同一框中的运算符从左到右分组 ([...])。
[...] 在此输入图像描述

https://docs.python.org/3/reference/expressions.html#operator-precedence

python

6
推荐指数
0
解决办法
165
查看次数

这个表达式是如何计算的?“foo”中的“f”== True

>>> "f" in "foo"
True
>>> "f" in "foo" == True
False
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么第二个表达式是 False。我看到==优先级高于in. 但随后我希望得到一个异常,这就是当我添加括号时会发生的情况:

>>> "f" in ("foo" == True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument of type 'bool' is not iterable
Run Code Online (Sandbox Code Playgroud)

foo似乎只有当位于 两侧时,表达式才为 True ==,如下所示:

>>> "f" in "foo" == "foo"
True
>>> "f" in "foo" == "bar"
False
Run Code Online (Sandbox Code Playgroud)

我缺少什么?Python 在这里实际计算什么?

python operator-precedence

3
推荐指数
1
解决办法
58
查看次数

你能用 Python 中的不等于或等于来简化链式比较吗?

可能你们中的一些人可能认为这是重复的,是的,我发现了很多类似的例子: 在此处输入图片说明

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

if y > x and x != -1:
    #  do something
Run Code Online (Sandbox Code Playgroud)

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

if y > x != -1:
    #  do something
Run Code Online (Sandbox Code Playgroud)

如果是这样,它是否安全?除了更短之外,此版本与非简化版本之间是否有任何区别?如果简化它不是正确的方法,那又是什么?

python

2
推荐指数
1
解决办法
477
查看次数

Python语句中的多个条件的简写

if x == y != z:
    print (x + y)
Run Code Online (Sandbox Code Playgroud)

这是if x == y和y!= z的缩写吗?它适用于我的代码,但我不确定当多个条件不是全部​​==或!=时,如何解释多个条件,或者以上面的后一种形式写出来.

python

1
推荐指数
1
解决办法
113
查看次数

1 == 2 == 2 如何计算?

在 REPL 中运行它给了我

>>> 1 == 2 == 2
False
Run Code Online (Sandbox Code Playgroud)

其中我感到惊讶,在C这将评估为1。我预期右侧,以评估True1 == TrueTrue在Python。例如,这正如我所期望的那样评估:

>>> 1 == (2 == 2)
True
Run Code Online (Sandbox Code Playgroud)

Python 如何解析和评估第一个表达式?这,以相同的方式评估,但这是我所期望的,因为它==是右结合的,并且在 C 中评估为 0

>>> 2 == 2 == 1
False
Run Code Online (Sandbox Code Playgroud)

python

1
推荐指数
1
解决办法
81
查看次数