一位朋友引起了我的注意,在我指出一个奇怪之后,我们都很困惑.
比方说,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 支持链式比较: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也应该支持它.
为什么这不起作用?我有一个可能的解决方案(在答案中分享),但很高兴听到其他意见.
以下代码输出False,根据Python操作顺序,它应该输出True(顺序应该在 - > ==,而不是相反).为什么==之前会来?
y = "33"
"3" in y == True
Run Code Online (Sandbox Code Playgroud)
产量
False
Run Code Online (Sandbox Code Playgroud) 在Python中,
1 in {1} == True
Run Code Online (Sandbox Code Playgroud)
也就是False为什么?
我首先认为这是由于运算符优先级造成的,但我能找到的所有内容(见下文)告诉我表达式是从左到右计算的:
1 in {1}是TrueTrue == True是True此外,任何其他优先级都会导致TypeError:
{1} == True是False1 in False返回一个TypeErrorPython 从左到右计算表达式。
https://docs.python.org/3/reference/expressions.html#evaluation-order
还,
https://docs.python.org/3/reference/expressions.html#operator-precedence
>>> "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 在这里实际计算什么?
可能你们中的一些人可能认为这是重复的,是的,我发现了很多类似的例子:

但是 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)
如果是这样,它是否安全?除了更短之外,此版本与非简化版本之间是否有任何区别?如果简化它不是正确的方法,那又是什么?
if x == y != z:
print (x + y)
Run Code Online (Sandbox Code Playgroud)
这是if x == y和y!= z的缩写吗?它适用于我的代码,但我不确定当多个条件不是全部==或!=时,如何解释多个条件,或者以上面的后一种形式写出来.
在 REPL 中运行它给了我
>>> 1 == 2 == 2
False
Run Code Online (Sandbox Code Playgroud)
其中我感到惊讶,在C这将评估为1。我预期右侧,以评估True和1 == True是True在Python。例如,这正如我所期望的那样评估:
>>> 1 == (2 == 2)
True
Run Code Online (Sandbox Code Playgroud)
Python 如何解析和评估第一个表达式?这,以相同的方式评估,但这是我所期望的,因为它==是右结合的,并且在 C 中评估为 0
>>> 2 == 2 == 1
False
Run Code Online (Sandbox Code Playgroud)