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
的{{1}}是什么?
答案 0 :(得分:6)
据我了解,
在功能上它们并不完全相同;如果你要与一个类进行比较,那么该类可以有一个成员函数__ne__
,它在使用比较运算符时调用!=,而不是在使用比较时调用的__eq__
== < / p>
所以,在这种情况下,
not (a == b)
会在a上调用__eq__
,以b为参数,然后not
结果
(a != b)
会在a上调用__ne__
,以b为参数。
我会使用第一种方法(使用!=)进行比较
答案 1 :(得分:4)
根据您使用的是==
还是!=
,会调用不同的rich comparison方法。
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
和==
,因为它只是一次操作而不是两次。
答案 2 :(得分:1)
您的第一个示例是您应该如何测试find
的结果。
你的第二个例子是做得太多了。它还会对each_line.find(":") == -1
表达式的结果执行boolean not
。
在这种情况下,你想要使用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