【问题标题】:Certain conditions evaluate differently then expected in Python某些条件的评估与 Python 中的预期不同
【发布时间】:2020-02-13 20:55:15
【问题描述】:

目前正在创建一个在数组中取给定值并添加 32 的片段

我的 IDE (PyCharm) 建议我通过执行以下操作删除代码中的冗余

if ascii_key[i] >= 65 and ascii_key[i] <= 90:
    ascii_key[i] = ascii_key[i] + 32

if 65 <= ascii_key[i] <= 90:
    ascii_key[i] = ascii_key[i] + 32

两种解决方案都对我有用,但我很好奇为什么这种条件安排会中断

if ascii_key[i] <= 65 >= 90:
    ascii_key[i] = ascii_key[i] + 32

如果方便的话,我会很感激伪代码的解释,我还是有点新手

【问题讨论】:

标签: python python-3.x conditional-statements operators boolean-expression


【解决方案1】:

在您提供的第三个代码中。

ascii_key[i] &lt;= 65 &gt;= 90 这总是被评估为False

ascii_key[i] &lt;= 65 &gt;= 90 被评估为ascii_key[i] &lt;= 65 and 65 &gt;= 9065&gt;=90False

a&lt;b&lt;c 的字节码评估。

In [17]: dis.dis('a<b<c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 DUP_TOP
              6 ROT_THREE
              8 COMPARE_OP               0 (<)
             10 JUMP_IF_FALSE_OR_POP    18
             12 LOAD_NAME                2 (c)
             14 COMPARE_OP               0 (<)
             16 RETURN_VALUE
        >>   18 ROT_TWO
             20 POP_TOP
             22 RETURN_VALUE

a&lt;b and b&lt;c 的字节码评估。

In [18]: dis.dis('a<b and b<c')
  1           0 LOAD_NAME                0 (a)
              2 LOAD_NAME                1 (b)
              4 COMPARE_OP               0 (<)
              6 JUMP_IF_FALSE_OR_POP    14
              8 LOAD_NAME                1 (b)
             10 LOAD_NAME                2 (c)
             12 COMPARE_OP               0 (<)
        >>   14 RETURN_VALUE

你可以观察观察a&lt;b&lt;c等价于a&lt;b and b&lt;c

【讨论】:

    【解决方案2】:

    这是由于条件是如何解决的。 if ascii_key[i] &gt;= 65 and ascii_key[i] &lt;= 90if 65 &lt;= ascii_key[i] &lt;= 90 是等价的。 虽然if ascii_key[i] &lt;= 65 &gt;= 90 解决了这个问题:if ascii_key[i] &lt;= 65 and 65 &gt;= 90 65 >= 90 永远不会正确。

    首先对条件 65 &lt;= ascii_key[i] 和另一个条件 ascii_key[i] &lt;= 90 进行求值并用 AND 链接。

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多