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また、上記はとの違いは何かを尋ねる反対の例==ですか? 前者は、後者と同様に、オブジェクトの同一性とオブジェクトの値の等価性の違いですか? 私が言いたいのは、上記の例では、 in は暗黙的isに使用されているということですか?not

4

3 に答える 3

6

私が理解しているように、機能的には完全に同じではありません。クラスと比較している場合、クラスは__ne__、比較演算子 != を使用するときに呼び出されるメンバー関数を持つことができます。これは__eq__、比較 == を使用するときに呼び出されるのとは対照的です。

したがって、この例で
not (a == b)__eq__、引数として b を使用して a を呼び出すとnot、結果はb を引数として a を呼び出すことになります。
(a != b)__ne__

比較のために最初の方法 (!= を使用) を使用します。

于 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

私の知る限り、すべての組み込み型で同じ結果が得られますが、理論的には、一部のユーザー定義オブジェクトに対して異なる実装を持つ可能性があります。

2 つではなく 1 つの操作であるという理由だけで、!=代わりにnotandを使用します。==

于 2012-03-21T04:28:28.870 に答える
1

最初の例は、 の結果をテストする方法ですfind

2 番目の例はやりすぎです。さらに、式の結果に対してブール値notを実行していeach_line.find(":") == -1ます。

このコンテキストでは、not真偽をテストできるものがある場合に使用します。
たとえば、空の文字列''は False と評価されます。

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

isID テスト式とis notboolean を少し混同しているようですnot

ID テストの実行方法の例:

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