Есть ли логическая разница между 'not ==' и '!= (без is)

Есть ли существенная разница в Python 3.x между:

for each_line in data_file:
    if each_line.find(":") != -1:
        #placeholder for code
        #more placeholder

и

for each_line in data:
    if not each_line.find(":") == -1:
        #placeholder for code
        #more placeholder

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

Кроме того, является ли приведенное выше противоположным примером вопроса, в чем разница между is и ==? Является ли первое, как и второе, разницей тождества объекта и равенства значений объекта? Я имею в виду, что в приведенном выше примере is в использовании not является неявным?


person gogolgadgets    schedule 21.03.2012    source источник


Ответы (3)


Насколько я понимаю, функционально они не совсем одинаковы; если вы сравниваете с классом, класс может иметь функцию-член __ne__, которая вызывается при использовании оператора сравнения !=, в отличие от __eq__, которая вызывается при использовании сравнения ==

Таким образом, в этом случае
not (a == b) вызовет __eq__ для a с b в качестве аргумента, затем not результат
(a != b) вызовет __ne__ для a с b в качестве аргумента.

Я бы использовал первый метод (используя !=) для сравнения

person jonathanl    schedule 21.03.2012
comment
спасибо, это имеет смысл для меня, и это отвечает на вопрос логики. - person gogolgadgets; 21.03.2012

Различные методы расширенного сравнения вызываются в зависимости от того, используете ли вы == или !=.

class EqTest(object):
    def __eq__(self, other):
        print "eq"
        return True
    def __ne__(self, other):
        print "ne"
        return False

a = EqTest()
b = EqTest()

print not (a == b)
# eq
# False
print a != b
# ne
# False

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

Я бы использовал != вместо not и == просто потому, что это одна операция вместо двух.

person agf    schedule 21.03.2012

Ваш первый пример - это то, как вы должны тестировать результат find.

Ваш второй пример делает слишком много. Кроме того, он выполняет логическое значение not для результата each_line.find(":") == -1 выражение.

В этом контексте вы хотите использовать not, когда у вас есть что-то, что вы можете проверить на правдивость или ложность.
Например, пустая строка '' оценивается как False:

s = ''
if not s:
    print('s is the empty string')

Кажется, вы немного смешиваете выражения проверки идентичности is и is not с логическим not.

Пример того, как вы будете выполнять проверку личности:

result_of_comparison = each_line.find(":") == -1
if result_of_comparison is False: # alternatively: is not True
    pass
person mechanical_meat    schedule 21.03.2012
comment
спасибо, это помогло мне понять практические и стилистические различия. - person gogolgadgets; 21.03.2012