Unterscheidung zwischen Funktionen und Generatoren
In diesem Schritt lernen Sie die wichtigsten Unterschiede zwischen regulären Python-Funktionen und Generatoren kennen. Das Verständnis dieser Unterscheidung ist entscheidend für das Schreiben von effizientem und speicherfreundlichem Code, insbesondere wenn Sie mit großen Datensätzen oder unendlichen Sequenzen arbeiten.
Funktionen:
Eine Funktion ist ein Codeblock, der eine bestimmte Aufgabe ausführt. Wenn eine Funktion aufgerufen wird, führt sie ihren Code aus, führt möglicherweise Berechnungen durch und gibt einen Wert zurück (oder None
, wenn keine explizite return
-Anweisung vorhanden ist). Der Zustand der Funktion wird zwischen den Aufrufen nicht beibehalten.
Generatoren:
Ein Generator ist eine spezielle Art von Funktion, die das Schlüsselwort yield
anstelle von return
verwendet. Wenn ein Generator aufgerufen wird, gibt er ein Iterator-Objekt zurück. Jedes Mal, wenn Sie einen Wert vom Iterator anfordern, wird der Generator ausgeführt, bis er auf eine yield
-Anweisung trifft. Der Generator hält dann an, speichert seinen Zustand und gibt den Wert zurück. Das nächste Mal, wenn ein Wert angefordert wird, setzt der Generator dort fort, wo er aufgehört hat.
Lassen Sie uns dies anhand eines Beispiels veranschaulichen. Erstellen Sie zunächst eine Datei namens function_vs_generator.py
in Ihrem ~/project
-Verzeichnis mit dem VS Code-Editor.
## ~/project/function_vs_generator.py
## Regular function
def square_numbers_function(numbers):
result = []
for number in numbers:
result.append(number * number)
return result
## Generator function
def square_numbers_generator(numbers):
for number in numbers:
yield number * number
## Example usage
numbers = [1, 2, 3, 4, 5]
## Using the function
function_result = square_numbers_function(numbers)
print("Function Result:", function_result)
## Using the generator
generator_result = square_numbers_generator(numbers)
print("Generator Result:", list(generator_result)) ## Convert generator to list for printing
Führen Sie nun das Python-Skript aus:
python ~/project/function_vs_generator.py
Sie sollten die folgende Ausgabe sehen:
Function Result: [1, 4, 9, 16, 25]
Generator Result: [1, 4, 9, 16, 25]
Sowohl die Funktion als auch der Generator liefern dasselbe Ergebnis. Der wichtigste Unterschied liegt jedoch darin, wie sie dies erreichen. Die Funktion berechnet alle Quadrate und speichert sie in einer Liste, bevor sie zurückgegeben werden. Der Generator hingegen gibt jedes Quadrat nacheinander nur dann zurück, wenn es angefordert wird.
Um den Unterschied noch deutlicher zu machen, ändern wir das Skript, um den Typ des zurückgegebenen Objekts auszugeben:
## ~/project/function_vs_generator.py
## Regular function
def square_numbers_function(numbers):
result = []
for number in numbers:
result.append(number * number)
return result
## Generator function
def square_numbers_generator(numbers):
for number in numbers:
yield number * number
## Example usage
numbers = [1, 2, 3, 4, 5]
## Using the function
function_result = square_numbers_function(numbers)
print("Function Result Type:", type(function_result))
## Using the generator
generator_result = square_numbers_generator(numbers)
print("Generator Result Type:", type(generator_result))
Führen Sie das Skript erneut aus:
python ~/project/function_vs_generator.py
Die Ausgabe wird sein:
Function Result Type: <class 'list'>
Generator Result Type: <class 'generator'>
Dies zeigt deutlich, dass die Funktion eine list
zurückgibt, während der Generator ein generator
-Objekt zurückgibt. Generatoren sind speicher-effizient, weil sie nicht alle Werte gleichzeitig im Speicher speichern. Sie generieren die Werte bei Bedarf.