Некоторые условия оцениваются иначе, чем ожидалось в Python - PullRequest
0 голосов
/ 13 февраля 2020

В настоящее время создается фрагмент, который принимает значения заданного значения в массиве и добавляет 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

Буду признателен за объяснение в псевдокоде если удобно, я еще немного новичок

Ответы [ 2 ]

3 голосов
/ 14 февраля 2020

В третьем предоставленном вами коде.

ascii_key[i] <= 65 >= 90 это всегда оценивается как False.

ascii_key[i] <= 65 >= 90 оценивается как ascii_key[i] <= 65 and 65 >= 90. 65>=90 равно False.

Оценка байт-кода a<b<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<b and b<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<b<c эквивалентно a<b and b<c.

0 голосов
/ 14 февраля 2020

это связано с тем, как выполняются условия. if ascii_key[i] >= 65 and ascii_key[i] <= 90 и if 65 <= ascii_key[i] <= 90 эквивалентны. В то время как if ascii_key[i] <= 65 >= 90 разрешается следующим образом: if ascii_key[i] <= 65 and 65 >= 90 65> = 90 никогда не выполняется.

Сначала условие 65 <= ascii_key[i], а затем другое условие ascii_key[i] <= 90 оцениваются и объединяются в AND.

Приветствия

...