Effektiver Python-Hinweis Punkt 16 Erwägen Sie, einen Generator zurückzugeben, ohne eine Liste zurückzugeben

Es ist ein Memo, das das Buch Python von O'Reilly Japan schreibt. https://www.oreilly.co.jp/books/9784873117560/ P35~37

** Die Liste ist am einfachsten, wenn Sie die Ergebnisse in einer Reihenfolge zurückgeben möchten **

Betrachten Sie den Fall der Überprüfung der Position von Leerzeichen in einem Satz

def index_words(text):
    result = []
    if text:
        result.append(0)
    for index, letter in enumerate(text):
        if letter == ' ':
            result.append(index + 1)
    return result

address = 'Four score and secer years ago...'
result = index_words(address)
print(result[:3])


>>>
[0, 5, 11]

Der Betrieb selbst ist normal, es gibt jedoch zwei Probleme

  1. Viele Zeichen im Code (redundant)
  2. Verschwenderische Erstellung der Ergebnisliste

1. Viele Zeichen im Code (redundant)

Es gibt einen Punkt, an dem es schwierig ist, als Ganzes zu lesen, indem man es in der Funktionsdefinition mehrmals mit Anhängen hinzufügt. In solchen Fällen ist es zweckmäßig, einen Generator zu verwenden

def index_words_iter(text):
    if text:
        yield 0
    for index, letter in enumerate(text):
        if letter == " ":
            yield index + 1

result = list(index_words_iter(address))
print(result[:3])

>>>
[0, 5, 11]

Durch die Verwendung vonield wird jedes Mal ein Iterator zurückgegeben. Sie können eine Liste auch einfach erstellen, indem Sie einen Iterator an list () übergeben.

2. Verschwenderische Erstellung der Ergebnisliste

Das Erstellen einer Ergebnisliste in der Funktion index_words bedeutet, dass der Speicher entsprechend belegt wird. Bei der Verarbeitung großer Datenmengen besteht dort die Gefahr eines Absturzes.

In dieser Hinsicht gibt der Generator jedes Mal ein Datenelement aus, sodass er jede Länge verarbeiten kann. ** Speicherverbrauch minimieren ** Ein Generator, der Daten aus einer Datei liest und einzeln verarbeitet

def index_file(handle):
    offset = 0
    for line in handle:
        if line:
            yield offset
        for letter in line:
            offset += 1
            if letter ==" ":
                yield offset
from itertools import islice
with open("address.txt", "r") as f:
    it = index_file(f)
    results = islice(it, 0, 3)
    print(list(results))

>>>
[0, 5, 11]

Jetzt können Sie Sätze beliebiger Länge verarbeiten und müssen sich keine Gedanken mehr über Speicherabstürze machen. Es ist jedoch wichtig zu wissen, dass sich der Inhalt aufgrund der Art der Iteratoren und Generatoren jedes Mal ändert, wenn sie aufgerufen werden (statusbehaftet).

Recommended Posts

Effektiver Python-Hinweis Punkt 16 Erwägen Sie, einen Generator zurückzugeben, ohne eine Liste zurückzugeben
Effektives Python-Memo-Element 9 Betrachten Sie einen Generatorausdruck für die Notation großer Einschlüsse
Effektives Python-Memo Punkt 3
Ein Hinweis zu [Python] __debug__
Effektiver Python-Hinweis Punkt 17 Respektieren Sie die Sicherheit, wenn Sie Iteratoren für Argumente verwenden
Effektiver Python-Hinweis Punkt 15 Wissen, wie sich Schließungen auf den Funktionsumfang beziehen
Ruft eine Liste der Dateien in einem Ordner mit Python ohne Pfad ab
Python: Ein Hinweis zu Klasse 1 "Abstract"
Python / Machen Sie ein Diktat aus einer Liste.
Vorsichtsmaßnahmen beim Erstellen eines Python-Generators
Ein Hinweis zu Mock (Python-Mock-Bibliothek)
Effektives Python-Memo Element 4 Schreiben Sie eine Hilfsfunktion anstelle eines komplizierten Ausdrucks
Effektives Python-Memo Element 7 Verwenden Sie die Listeneinschlussnotation anstelle von Karte und Filter
Eine Notiz, in der ein Python-Anfänger stecken blieb
[Python] So konvertieren Sie eine zweidimensionale Liste in eine eindimensionale Liste
Zeigen Sie eine Liste der Alphabete in Python 3 an
Inklusive Notation von Python (über Liste und Generatorausdruck) [zusätzlich]
Effektives Python-Memo Punkt 10 Aufzählung aus der Reichweite
[Python] Ruft eine Liste der Instanzvariablen ab
[Python] Nur eine Liste der Ordner abrufen
EP 16 Generator in Betracht ziehen, anstatt Listen zurückzugeben
Effektiver Python-Hinweis Punkt 12 Vermeiden Sie die Verwendung von else-Blöcken nach for- und while-Schleifen