Оператор 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)
Конечно, я мог бы написать свою собственную функцию для этого, но тогда вы платите цену за эффективность, тогда как операторский модуль может вывести этот код из питона и, следовательно, выполнять быстрее.
Ответы
Ответ 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.