¿Hay una diferencia lógica entre ‘no ==’ y ‘! = (Sin es)

¿Hay una diferencia sustancial en Python 3.x entre:

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

y

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

Mi pregunta no es específica del uso anterior, pero es más general o esencial: ¿esta diferencia sintáctica funciona de una manera diferente, aunque el resultado sea el mismo? ¿Hay una diferencia lógica? ¿Hay tareas donde uno es más apropiado o es únicamente una diferencia estilística? Si esto es meramente estilístico, ¿cuál es considerado más limpio por los progtwigdores de Python?

Además, ¿es lo anterior una instancia opuesta de preguntar cuál es la diferencia entre is y == ? ¿Es el primero, como el segundo, una diferencia de identidad de objeto y de igualdad de valor de objeto? Lo que quiero decir es que, en mi ejemplo anterior, ¿es el uso not implícito?

Como yo lo entiendo, funcionalmente no son completamente iguales; si está comparando con una clase, la clase podría tener una función miembro, __ne__ que se llama cuando se usa el operador de comparación! =, a diferencia de __eq__ que se llama cuando se usa la comparación ==

Entonces, en este caso,
not (a == b) llamaría __eq__ en a, con b como argumento, entonces not el resultado
(a != b) llamaría a __ne__ en a, con b como argumento.

Yo usaría el primer método (usando! =) Para comparación

Se llaman diferentes métodos de comparación ricos dependiendo de si usa == o != .

 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 

Por lo que sé, obtendrá el mismo resultado para todos los tipos integrados, pero en teoría podrían tener implementaciones diferentes para algunos objetos definidos por el usuario.

Yo usaría != lugar de not y == simplemente porque es una operación en lugar de dos.

Su primer ejemplo es cómo debe probar el resultado de find .

Tu segundo ejemplo es hacer demasiado. Además, está ejecutando un valor booleano not en el resultado de la each_line.find(":") == -1 .

En este contexto, donde no quiere usar es cuando tiene algo que puede probar para vergüenza o falsedad.
Por ejemplo, la cadena vacía '' evalúa como Falso:

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

Parece que estás confundiendo un poco las expresiones de prueba de identidad y is not con el booleano.

Un ejemplo de cómo realizarías una prueba de identidad:

 result_of_comparison = each_line.find(":") == -1 if result_of_comparison is False: # alternatively: is not True pass