Подтвердить что ты не робот

Если цикл: "x not in" vs. "not x in"

Я заметил, что оба они работают одинаково:

if x not in list и if not x in list.

Есть ли какая-то разница между ними в некоторых случаях? Есть ли причина для обоих, или это просто потому, что для некоторых людей более естественно писать одно или другое?

Какую из них я с большей вероятностью увижу в коде других людей?

4b9b3361

Ответ 1

Две формы делают одинаковый байт-код, как вы можете четко проверить:

>>> import dis
>>> dis.dis(compile('if x not in d: pass', '', 'exec'))
  1           0 LOAD_NAME                0 (x)
              3 LOAD_NAME                1 (d)
              6 COMPARE_OP               7 (not in)
              9 JUMP_IF_FALSE            4 (to 16)
             12 POP_TOP             
             13 JUMP_FORWARD             1 (to 17)
        >>   16 POP_TOP             
        >>   17 LOAD_CONST               0 (None)
             20 RETURN_VALUE        
>>> dis.dis(compile('if not x in d: pass', '', 'exec'))
  1           0 LOAD_NAME                0 (x)
              3 LOAD_NAME                1 (d)
              6 COMPARE_OP               7 (not in)
              9 JUMP_IF_FALSE            4 (to 16)
             12 POP_TOP             
             13 JUMP_FORWARD             1 (to 17)
        >>   16 POP_TOP             
        >>   17 LOAD_CONST               0 (None)
             20 RETURN_VALUE        

поэтому, очевидно, они семантически идентичны.

В стиле PEP 8 не упоминается проблема.

Лично я предпочитаю форму if x not in y, которая сразу же очищает, что not in - это один оператор, и "читается как английский". if not x in y может ввести некоторых читателей в заблуждение, думая, что это означает if (not x) in y, читает немного меньше, чем английский, и не имеет абсолютно никаких компенсационных преимуществ.

Ответ 2

>>> dis.dis(lambda: a not in b)
1           0 LOAD_GLOBAL              0 (a)
          3 LOAD_GLOBAL              1 (b)
          6 COMPARE_OP               7 (not in)
          9 RETURN_VALUE      

>>> dis.dis(lambda: not a in b)
1           0 LOAD_GLOBAL              0 (a)
          3 LOAD_GLOBAL              1 (b)
          6 COMPARE_OP               7 (not in)
          9 RETURN_VALUE  

когда вы делаете "не в b", его нужно будет преобразовать (не в)

так что правильный путь - это "не в b".

Ответ 3

not x in L явно не запрещен, потому что это было бы глупо. x not in L явно разрешен (хотя он компилируется в тот же байт-код), потому что он более читабельный.

x not in L - это то, что все используют.

Ответ 4

Когда вы пишете a not in b, он использует оператор not in, тогда как not a in b использует оператор in, а затем отрицает результат. Но оператор not in определяется как возвращающий то же самое, что и not a in b, поэтому они делают точно то же самое. Из документация:

Операторы in и not in проверяют членство в коллекции. x in s оценивает значение true, если x является членом коллекции s и false в противном случае. x not in s возвращает отрицание x in s.

Аналогично существует a is not b по сравнению с not a is b.

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

Ответ 5

Это просто личное предпочтение. Вы также можете сравнить if x != 3 и if not x == 3. Нет никакой разницы между двумя показанными вами выражениями.