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