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

Оператор python, оператор для "не в"

Это, возможно, глупый вопрос, но, глядя на отображение операторов на функции, я заметил, что нет функции для выражения not in. Сначала я подумал, что это, вероятно, потому, что интерпретатор просто переупорядочивает это как not x in y, но есть функция для is not, которая, похоже, должна вести себя точно так же, как not in. Я что-то упускаю, или этот оператор действительно не существует?

Вот действительно глупый пример, где вам может понадобиться следующее:

def compare_iter(a,b,func):
    return [func(aa,bb) for aa,bb in zip(a,b)]

my_compare=compare_iter(xx,yy,lambda x,y:x not in y)  #lambda -- yuck
my_compare=map(operator.not_,compare_iter(xx,yy,operator.contains)  #extra map?  grr...
#it would be nice to do: my_compare=compare_iter(xx,yy,operator.not_contains)

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

4b9b3361

Ответ 1

Здесь не нужна другая функция. not in является инверсией in, поэтому у вас есть следующие сопоставления:

obj in seq => contains(seq, obj)

obj not in seq => not contains(seq, obj)

Вы правы, это не согласуется с is/is not, поскольку тесты идентичности должны быть симметричными. Это может быть артефакт дизайна.

Ответ 2

Для понимания операторов вы можете найти следующую функцию и разборку:

>>> def test():
        if 0 in (): pass
        if 0 not in (): pass
        if 0 is (): pass
        if 0 is not (): pass
        return None

>>> dis.dis(test)
  2           0 LOAD_CONST               1 (0) 
              3 LOAD_CONST               2 (()) 
              6 COMPARE_OP               6 (in) 
              9 POP_JUMP_IF_FALSE       15 
             12 JUMP_FORWARD             0 (to 15) 

  3     >>   15 LOAD_CONST               1 (0) 
             18 LOAD_CONST               3 (()) 
             21 COMPARE_OP               7 (not in) 
             24 POP_JUMP_IF_FALSE       30 
             27 JUMP_FORWARD             0 (to 30) 

  4     >>   30 LOAD_CONST               1 (0) 
             33 LOAD_CONST               4 (()) 
             36 COMPARE_OP               8 (is) 
             39 POP_JUMP_IF_FALSE       45 
             42 JUMP_FORWARD             0 (to 45) 

  5     >>   45 LOAD_CONST               1 (0) 
             48 LOAD_CONST               5 (()) 
             51 COMPARE_OP               9 (is not) 
             54 POP_JUMP_IF_FALSE       60 
             57 JUMP_FORWARD             0 (to 60) 

  6     >>   60 LOAD_CONST               0 (None) 
             63 RETURN_VALUE         
>>> 

Как вы можете видеть, разница в каждом операторе; и их коды (по порядку) равны 6, 7, 8 и 9.