Skip to content

Technik Blog

Programmieren | Arduino | ESP32 | MicroPython | Python | Raspberry Pi | Raspberry Pi Pico

Menu
  • Smarthome
  • Arduino
  • ESP32 & Co.
  • Raspberry Pi & Pico
  • Solo Mining
  • Über mich
  • Deutsch
  • English
Menu

Python #22 – Generatoren

Posted on 30. Juli 202030. April 2023 by Stefan Draeger

In diesem Beitrag möchte ich dir die Generator in Python3 vorstellen. Mit Generatoren können Datenstrukturen „Stück für Stück“ durchlaufen werden, jedoch anders als mit einer normalen For-Schleife. Nehmen wir zunächst eine Liste von drei Personen, diese können wir mit einer einfachen For-Schleife durchlaufen und auf der Konsole ausgeben.

personen = [['Max','Mustermann', 31], ['Jochen', 'Meier', 45], ['Birgit', 'Mueller', 56]]

for vorname, nachname, alter in personen:
    print('Vorname: ', vorname)
    print('Nachname: ', nachname)
    print('Alter: ', str(alter))
    print('-----------------------------')

Die Ausgabe auf der Konsole wäre dann folgende:

Vorname:  Max
Nachname:  Mustermann
Alter:  31
-----------------------------
Vorname:  Jochen
Nachname:  Meier
Alter:  45
-----------------------------
Vorname:  Birgit
Nachname:  Mueller
Alter:  56
-----------------------------

  • Implementation eines Generators
    • Wie arbeitet das dargestellte Konstrukt?

Implementation eines Generators

Ein Generator ist eine Funktion welche ein Element aus einer Datenstruktur liefert. Dazu nutzt man das Schlüsselwort „yield“.

Zunächst definieren wir eine Funktion in welcher wir nacheinander die Werte (Personen) aus der bereits bekannten Liste zurückliefert.

personen = [['Max','Mustermann', 31], ['Jochen', 'Meier', 45], ['Birgit', 'Mueller', 56]]

def gen_person():
    yield personen[0]
    yield personen[1]
    yield personen[2]

Nun kann man diese Werte jeweils mit der Funktion „next“ aus dem Generator-Objekt „Stück-für-Stück“ lesen.

p = gen_person()

print(next(p))
print(next(p))
print(next(p))

Wir erhalten auf der Konsole die Ausgabe der Liste.

['Max', 'Mustermann', 31]
['Jochen', 'Meier', 45]
['Birgit', 'Mueller', 56]

Alternativ könnte man nun die Daten mit einer For-Schleife wie folgt laden.

personen = [['Max','Mustermann', 31], ['Jochen', 'Meier', 45], ['Birgit', 'Mueller', 56]]

def gen_person():
    yield personen[0]
    yield personen[1]
    yield personen[2]
        
p = gen_person()

for i in range(0,len(personen)):
    print(personen[i])

Wie arbeitet das dargestellte Konstrukt?

Ein Generator bietet eine Art Iterator / Liste als Rückgabewert an, jedoch immer nur ein Stück aus dieser Liste. Das können wir uns wiefolgt vorstellen als das die Generatorfunktion immer nur ein Stück liefert, sich die Position merkt und beim nächsten betreten der Funktion an dem darauffolgenden Index fortsetzt.

Python3 - Schema Generator Konstrukt
Python3 – Schema Generator Konstrukt

Wenn wir diese Liste mit den Personen mit einem Generator durchlaufen dann wird die Liste „Stück für Stück“ abgearbeitet.

personen = [['Max','Mustermann', 31], ['Jochen', 'Meier', 45], ['Birgit', 'Mueller', 56]]

def gen_person():
    for person in personen:
        print('Funktion gen_person()')
        yield person
        
for vorname, nachname, alter in gen_person():
    print('For-Schleife')
    print('Vorname: ', vorname)
    print('Nachname: ', nachname)
    print('Alter: ', str(alter))
    print('-----------------------------')

Auf der Konsole sieht man,

  1. das zunächst die Funktion „gen_person“ aufgerufen,
  2. die For-Schleife mit dem Datensatz abgearbeitet,
  3. danach die Funktion „gen_person“ an der nächsten Stelle in der Liste fortgeführt

wird.

Der Vorteil eines Generators wird bei einer so kleinen Liste nicht sofort erkennbar aber wenn man eine sehr große Datenstruktur wie eine CSV Datei durchlaufen möchte sieht man es sofort. Eine solche große CSV Datei findest du zbsp. von der GeoIP Datenbank. Die verlinkte CSV Datei enthält mehr als 5,39 Millionen Zeilen und ist ca. 450MB groß.

Python ist sehr gut geeignet um große Datenmengen zu verarbeiten, daher wäre es auch sehr einfach die CSV – Datei in einem rutsch zu verarbeiten, aber wir werden im nachfolgenden die Datei „Schritt-für-Schritt“ durchlaufen.

def gen_geoIpCSV():
    with open('.\data\dbip-city-lite-2020-07.csv','r', encoding="utf-8") as csvFile:
        for line in csvFile:   
            if ",\"" not in line:          
                yield  line.split(',')
            else:
                continue
        
        
for ip_start, ip_end, continent, country, stateprov, city, lat, lon in gen_geoIpCSV():
    print(city.encode())

Das Problem in der CSV Datei ist dass, einige Städte in Anführungszeichen gesetzt sind, dieses liegt daran das in dem Namen der Stadt ein Komma vorkommt und gleichzeitig das Komma als CSV Separator genutzt wird. Die Werte müßten gesondert behandelt werden, jedoch wäre das für diesen Beitrag zu viel und daher überspringe ich die betroffenen Datensätze.

Schreibe einen Kommentar Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Fragen oder Feedback?

Du hast eine Idee, brauchst Hilfe oder möchtest Feedback loswerden?
Support-Ticket erstellen

Newsletter abonnieren

Bleib auf dem Laufenden: Erhalte regelmäßig Updates zu neuen Projekten, Tutorials und Tipps rund um Arduino, ESP32 und mehr – direkt in dein Postfach.

Jetzt Newsletter abonnieren

Unterstütze meinen Blog

Wenn dir meine Inhalte gefallen, freue ich mich über deine Unterstützung auf Tipeee.
So hilfst du mit, den Blog am Leben zu halten und neue Beiträge zu ermöglichen.

draeger-it.blog auf Tipeee unterstützen

Vielen Dank für deinen Support!
– Stefan Draeger

Kategorien

Tools

  • Unix-Zeitstempel-Rechner
  • ASCII Tabelle
  • Spannung, Strom, Widerstand und Leistung berechnen
  • Widerstandsrechner
  • 8×8 LED Matrix Tool
  • 8×16 LED Matrix Modul von Keyestudio
  • 16×16 LED Matrix – Generator

Links

Blogverzeichnis Bloggerei.de TopBlogs.de das Original - Blogverzeichnis | Blog Top Liste Blogverzeichnis trusted-blogs.com

Stefan Draeger
Königsberger Str. 13
38364 Schöningen

Tel.: 01778501273
E-Mail: info@draeger-it.blog

Folge mir auf

  • Impressum
  • Datenschutzerklärung
  • Disclaimer
  • Cookie-Richtlinie (EU)
©2025 Technik Blog | Built using WordPress and Responsive Blogily theme by Superb
Cookie-Zustimmung verwalten
Wir verwenden Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wir tun dies, um das Surferlebnis zu verbessern und um personalisierte Werbung anzuzeigen. Wenn Sie diesen Technologien zustimmen, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn Sie Ihre Zustimmung nicht erteilen oder zurückziehen, können bestimmte Funktionen beeinträchtigt werden.
Funktional Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt. Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.
Optionen verwalten Dienste verwalten Verwalten von {vendor_count}-Lieferanten Lese mehr über diese Zwecke
Einstellungen anzeigen
{title} {title} {title}