16

Python と .join() メソッドに関する基本的な質問:

file1 = open(f1,"r")
file2 = open(f2,"r")
file3 = open("results","w")

diff = difflib.Differ()
result = diff.compare(file1.read(),file2.read())
file3.write("".join(result)),

上記のコード スニペットは、"results" というファイルに文字列形式で保存された適切な出力を生成し、2 つのファイルの違いを行ごとに示します。ただし、.join() を使用せずに単に「結果」を出力すると、コンパイラがメモリ アドレスを含むメッセージを返すことに気付きました。.join() を使用せずに結果をファイルに書き込もうとした後、.join() メソッドでは文字列と文字バッファーのみを使用でき、ジェネレーター オブジェクトは使用できないとコンパイラーから通知されました。したがって、私が提示したすべての証拠に基づいて、間違っている場合は訂正してください。

  1. result = diff.compare(file1.read(),file2.read()) <---- 結果はジェネレーターオブジェクト?

  2. resultresultそれ自体が最初の文字列への参照である文字列のリストですか?

  3. .join()メモリアドレスを取得して最初のアドレスを指し、その構造内の文字列の残りのアドレスを反復処理しますか?

  4. ジェネレーターオブジェクトはポインターを返すオブジェクトですか?

私の質問が不明確である場合は申し訳ありませんが、基本的にはPythonのベテランに私の推論が正しいかどうかを尋ねたかった. 私の質問は、観察可能な結果についてではなく、Python の内部の仕組みについてです。皆様のご協力に感謝いたします。

4

1 に答える 1

37

join文字列のメソッドです。そのメソッドは反復可能なものを取り、それを反復処理してコンテンツを結合します。(内容は文字列でなければなりません。さもないと、例外が発生します。)

ジェネレーター オブジェクトをファイルに直接書き込もうとすると、その内容ではなく、ジェネレーター オブジェクト自体が取得されます。 joinジェネレーターの内容を「展開」します。

シンプルで明示的なジェネレーターで何が起こっているかを確認できます。

def gen():
    yield 'A'
    yield 'B'
    yield 'C'

>>> g = gen()
>>> print g
<generator object gen at 0x0000000004BB9090>
>>> print ''.join(g)
ABC

ジェネレーターは、その内容を一度に 1 つずつ配布します。ジェネレーター自体を見ようとすると、何も実行されず、単に「ジェネレーター オブジェクト」として表示されます。その内容を取得するには、それらを反復処理する必要があります。これは、forループ、next関数、または物事を反復処理する他のさまざまな関数/メソッドのいずれかを使用して行うことができます (str.joinそれらの間で)。

結果が「文字列のリストである」と言うとき、あなたはその考えに近づいています。ジェネレーター (またはイテラブル) は、「潜在的なリスト」のようなものです。一度にすべてのコンテンツのリストになるのではなく、各項目を 1 つずつ剥がすことができます。

どのオブジェクトも「メモリ アドレス」ではありません。ジェネレーター オブジェクト (他の多くのオブジェクトと同様) の文字列表現にはメモリ アドレスが含まれているため、(上記のように) 出力したり、ファイルに書き込んだりすると、そのアドレスが表示されます。しかし、それはオブジェクトがそのメモリアドレス「である」という意味ではなく、アドレス自体は実際には使用できません。これは便利な識別タグなので、複数のオブジェクトがある場合にそれらを区別できます。

于 2013-01-21T20:59:04.890 に答える