LU04i - Generator Expressions

Generator Expressions bieten eine kompakte Möglichkeit, Generatoren zu erstellen. Sie ähneln List Comprehensions, verwenden jedoch runde Klammern () anstelle von eckigen Klammern []. Der Hauptvorteil von Generator Expressions ist, dass sie “lazy” sind, d.h. sie generieren Werte “on-the-fly” und halten nicht die gesamte Sequenz im Speicher.

Hauptverwendungszweck von Generator Expressions

Generator Expressions werden in Python vorwiegend zur “lazy” Transformation von Daten verwendet. Sie sind besonders nützlich, wenn man eine bestehende Liste (oder ein anderes iterierbares Objekt) nehmen und jedes ihrer Elemente auf eine bestimmte Weise transformieren möchte, ohne die gesamte Sequenz im Speicher zu speichern.

Die Syntax

gen_expr = (expression for item in iterable if condition == True)

Teile einer Generator Expression

Condition

Ein optionaler Filter, um nur bestimmte Elemente einzuschließen.

gen_expr = (x for x in range(10) if x % 2 == 0)

Die Bedingung if x % 2 == 0 liefert True für alle geraden Zahlen, so dass der Generator alle geraden Zahlen von 0 bis 9 enthält.

Iterable

Das Iterable kann ein beliebiges iterierbares Objekt sein, z. B. eine Liste, ein Tupel, ein Set usw.

  1. Beispiel mit einer Liste:
      squared = (x**2 for x in [1, 2, 3, 4])
      # Ergebnis beim Iterieren: 1, 4, 9, 16
     
  2. Beispiel mit einem Tupel:
        doubled = (x * 2 for x in (1, 2, 3, 4))
        # Ergebnis beim Iterieren: 2, 4, 6, 8
     
  3. Beispiel mit range():
        gen_expr = (x for x in range(10))
        # Ergebnis beim Iterieren: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
     

Expression

Der aktuelle Gegenstand der Iteration, aber auch das Ergebnis, das vor seinem Einzug in den neuen Generator manipuliert werden kann.

  1. Beispiel mathematische Operation:
    #Expression = x * 2
    doubled = (x * 2 for x in range(5))
    # Ergebnis beim Iterieren: 0, 2, 4, 6, 8
  2. Beispiel mit Funktionsaufruf:
    words = ["apple", "banana", "cherry"]
    uppercased = (word.upper() for word in words)

Item

Das aktuelle Element, das in der Iteration verarbeitet wird. Der Name des Item wird im for-Konstrukt definiert: for item in iterable

Beispiel

words = ['apple', 'banana', 'cherry']
uppercased = (item.upper() for item in words)

Beispiele

Filtern und Verwenden von next mit Generator Expressions

Angenommen, Sie haben eine Liste von Dictionarys, die verschiedene Benutzer darstellen, und jeder Benutzer hat eine eindeutige ID. Sie möchten einen bestimmten Benutzer anhand seiner ID finden.

Beispiel-Daten:

users = [
    {'id': 1, 'name': 'Alice'},
    {'id': 2, 'name': 'Bob'},
    {'id': 3, 'name': 'Charlie'},
    {'id': 4, 'name': 'David'}
]

Um den Benutzer mit der ID 3 zu finden, können Sie eine Generator Expression verwenden und next() aufrufen, um das erste (und in diesem Fall einzige) Ergebnis zu erhalten:

user_id_to_find = 3
user = next((user for user in users if user['id'] == user_id_to_find), None)
print(user)  # Output: {'id': 3, 'name': 'Charlie'}

In diesem Beispiel wird die Generator Expression (user for user in users if user['id'] == user_id_to_find) verwendet, um durch die Liste der Benutzer zu iterieren und nur diejenigen zurückzugeben, deren ID der gesuchten ID entspricht. Die Funktion next() gibt dann den ersten Benutzer zurück, der die Bedingung erfüllt. Wenn kein Benutzer gefunden wird, gibt next() den Wert None zurück, da dies als Standardwert angegeben ist.

Dieser Ansatz ist besonders effizient, da er nicht die gesamte Liste durchlaufen muss, sondern bei der ersten Übereinstimmung stoppt.

Generator Expressions sind ein mächtiges Werkzeug in Python, das den Code sauberer und verständlicher machen kann. Sie ermöglichen die schnelle Transformation von Daten und unterstützen dabei, den Code näher an die menschliche Logik und mathematische Notation zu bringen, ohne den Speicher zu überlasten.


© Kevin Maurizi