Порядок синтаксиса для использования ключевых слов not и in - PullRequest
88 голосов
/ 05 января 2012

При тестировании на членство мы можем использовать:

x not in y

Или альтернативно:

not y in x

Для этого выражения может быть много возможных контекстов в зависимости от x и y.Например, это может быть проверка подстроки, членство в списке, существование ключа dict.

  • Всегда ли две формы эквивалентны?
  • Есть ли предпочтительный синтаксис?

Ответы [ 6 ]

102 голосов
/ 05 января 2012

Они всегда дают один и тот же результат.

Фактически, not 'ham' in 'spam and eggs' представляется специальным случаем для выполнения одной операции «не в», а не операции «в», а затем отрицания результата:

>>> import dis

>>> def notin():
    'ham' not in 'spam and eggs'
>>> dis.dis(notin)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not_in():
    not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE    

>>> def not__in():
    not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               7 (not in)
              9 POP_TOP             
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE        

>>> def noteq():
    not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
  2           0 LOAD_CONST               1 ('ham')
              3 LOAD_CONST               2 ('spam and eggs')
              6 COMPARE_OP               2 (==)
              9 UNARY_NOT           
             10 POP_TOP             
             11 LOAD_CONST               0 (None)
             14 RETURN_VALUE      

Сначала я думал, что они всегда дают один и тот же результат, но само по себе not является просто оператором логического отрицания с низким приоритетом, который можно применять к a in b так же легко, как и любое другое логическое выражение, тогда как not in был отдельным оператором для удобства и ясности.

Разборка выше показала себя! Кажется, что, хотя not, очевидно, является логическим оператором отрицания, форма not a in b имеет специальный регистр, так что в действительности она не использует общий оператор. Это делает not a in b буквально тем же выражением, что и a not in b, а не просто выражением, результатом которого является то же значение.

13 голосов
/ 05 января 2012

  1. Нет, разницы нет.

    Оператор not in определен с обратным истинным значением in.

    - Документация Python

  2. Я бы предположил, что not in предпочтительнее, потому что это более очевидно, и они добавили специальный случай для него.
5 голосов
/ 05 апреля 2017

Они идентичны по значению, но предпочитает проверять руководство по стилю Python в правиле E713 :

E713: тестдля членства должно быть not in

См. также "Python if x is not None или if not x is None?" для очень похожего выбора стиля.

3 голосов
/ 05 января 2012

Другие уже дали понять, что эти два утверждения, вплоть до довольно низкого уровня, эквивалентны.

Тем не менее, я не думаю, что кто-то еще достаточно подчеркивал, что, поскольку это оставляет выбор за вами, вы должны

выберите форму, которая сделает ваш код максимально читабельным.

И не обязательно настолько читабельным, насколько это возможно кому-либо , даже если это, конечно, хорошая вещь, к которой нужно стремиться. Нет, убедитесь, что код максимально читабелен для вас , поскольку вы, скорее всего, вернетесь к этому коду позже и попытаетесь его прочитать.

2 голосов
/ 05 января 2012

В Python разницы нет. И нет никаких предпочтений.

1 голос
/ 05 января 2012

Синтаксически это одно и то же утверждение.Я бы сказал, что 'ham' not in 'spam and eggs' передает более ясные намерения, но я видел код и сценарии, в которых not 'ham' in 'spam and eggs' передает более ясное значение, чем другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...