6

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隐式吗?

4

3 回答 3

6

据我了解,在功能上它们并不完全相同。如果您要与一个类进行比较,则该类可能有一个成员函数,__ne__在使用比较运算符时调用它!=,而不是__eq__在使用比较运算符时调用 ==

因此,在这种情况下,
not (a == b)将调用__eq__a,以 b 作为参数,然后not结果
(a != b)将调用__ne__a,以 b 作为参数。

我会使用第一种方法(使用!=)进行比较

于 2012-03-21T04:25:37.477 回答
4

根据您使用或调用不同的丰富比较方法。==!=

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==

于 2012-03-21T04:28:28.870 回答
1

您的第一个示例是您应该如何测试find.

你的第二个例子做得太多了。它还对表达式的结果执行布尔运算。noteach_line.find(":") == -1

在这种情况下,您想要使用的地方not是当您拥有可以测试真假的东西时。
例如,空字符串的''计算结果为 False:

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

您似乎将身份测试表达式isis notboolean混为一谈not

您将如何执行身份测试的示例:

result_of_comparison = each_line.find(":") == -1
if result_of_comparison is False: # alternatively: is not True
    pass
于 2012-03-21T04:20:00.157 回答