Pythongeneratorobjekte und .join

Nur eine grundlegende Frage nach python und .join () Methode:

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)), 

Das obige Snippet des Codes ergibt eine schöne Ausgabe, die in einer Datei mit dem Titel "Ergebnisse" im String-Format gespeichert ist und die Unterschiede zwischen den beiden Dateien zeilenweise zeigt. Allerdings merke ich, dass wenn ich nur "Ergebnis" ohne Verwendung von .join () ausdrucke, gibt der Compiler eine Nachricht zurück, die eine Speicheradresse enthält. Nachdem ich versucht habe, das Ergebnis in die Datei zu schreiben, ohne dass ich mich mit (@) beschäftigte, wurde mir vom Compiler mitgeteilt, dass nur Strings und Zeichenpuffer in der .join () – Methode verwendet werden können und nicht Generatorobjekte. Also auf der Grundlage aller Beweise, die ich angeführt habe, bitte korrigiere mich, wenn ich mich irre

  1. result = diff.compare(file1.read(),file2.read()) <—- Ergebnis ist ein Generatorobjekt?

  2. result ist eine Liste von Strings, wobei das result selbst der Hinweis auf den ersten String ist?

  3. .join() nimmt eine Speicheradresse und zeigt auf die erste, und dann iteriert über den Rest der Adressen von Strings in dieser Struktur?

  4. Ein Generatorobjekt ist ein Objekt, das einen Zeiger zurückgibt?

Ich entschuldige mich, wenn meine Fragen unklar sind, aber ich wollte grundsätzlich die Python-Veteranen fragen, ob meine Abzüge richtig waren. Meine Frage ist weniger über die beobachtbaren Ergebnisse, und mehr über das innere Arbeiten der Pythonschlange. Ich schätze all deine Hilfe.

One Solution collect form web for “Pythongeneratorobjekte und .join”

join ist eine Methode der Zeichenfolgen. Diese Methode nimmt jede iterable und iteriert darüber und verbindet den Inhalt zusammen. (Der Inhalt muss Strings sein, oder es wird eine Ausnahme auslösen.)

Wenn Sie versuchen, das Generatorobjekt direkt in die Datei zu schreiben, erhalten Sie einfach das Generatorobjekt selbst, nicht seinen Inhalt. "Entlädt" den Inhalt des Generators.

Sie können sehen, was mit einem einfachen, expliziten Generator geht:

 def gen(): yield 'A' yield 'B' yield 'C' >>> g = gen() >>> print g <generator object gen at 0x0000000004BB9090> >>> print ''.join(g) ABC 

Der Generator doles aus seinem Inhalt ein zu einer Zeit. Wenn du versuchst, den Generator selbst anzuschauen, macht er nichts aus und du siehst es einfach als "Generatorobjekt". Um auf ihren Inhalt zu kommen, musst du über sie hinweg iterieren. Sie können dies mit einer for Schleife, mit der next Funktion, oder mit einer der verschiedenen anderen Funktionen / Methoden, die über die Dinge ( str.join unter ihnen) iterieren.

Wenn Sie sagen, dass Ergebnis "ist eine Liste der Zeichenfolge" Sie sind nah an der Idee. Ein Generator (oder iterable) ist wie eine "potentielle Liste". Anstatt tatsächlich eine Liste aller seiner Inhalte auf einmal zu sein, können Sie schälen Sie jeden Artikel ein zu einer Zeit.

Keines der Objekte ist eine "Speicheradresse". Die Stringdarstellung eines Generatorobjekts (wie das von vielen anderen Objekten) enthält eine Speicheradresse, also wenn du es ausdruckst (wie oben) oder in eine Datei schreibst, wirst du diese Adresse sehen. Aber das bedeutet nicht, dass das Objekt "ist", dass Speicher Adresse, und die Adresse selbst ist nicht wirklich nutzbar als solche. Es ist nur ein handliches Identifizierungs-Tag, so dass, wenn Sie mehrere Objekte haben, können Sie ihnen auseinander sagen.

  • Python-Ctypen: Kopieren des Inhaltes der Struktur
  • Hilfe - Funktionszeiger in Python
  • Auto_ptr mit swig
  • Zugriff auf die zugrunde liegende Struktur eines PyObjects
  • Python ist die beste Programmiersprache der Welt.