Порядок синтаксиса для использования ключевых слов "не" и "в"

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

x not in y

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

not y in x

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

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

Ответ 1

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

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

>>> 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, а не просто выражение, которое приводит к тому же значению.

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

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

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

Ответ 6

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