Direkt zum Hauptbereich

Python : Generatoren

Einführung

In diesem kurzen Blogartikel beschäftigen wir uns mit Funktions-Dekoratoren (function decorators) und Generatoren (generators). Ein Dekorator ist eine Funktion, die eine andere Funktion als Parameter akzeptiert und eine sogenannte innere Funktion zurückgibt. Dekoratoren sind nützlich, um zusätzliche Verarbeitungsschritte für eine Funktion durchzuführen. Ein Generator hingegen ist eine Funktion die Werte sequentiell generiert. Anstatt alle Werte auf einmal zurückzugeben, wird der Generator bei seinem nächsten Aufruf den nächsten anfallenden Wert in der Sequenz zurückgeben. 

Function Decorators

Oftmals sind viele Funktionen schon vorhanden, doch nicht konkret für einen Zweck verwendbar. Es sind einige Arbeitsschritte zusätzlich nötig, um mit der vorhandenen Funktion das gewünschte Resultat zu erzielen. Anstatt die vorhandene Funktion neu zu implementieren, wird die bestehende eigentlich nützliche Funktion durch eine andere Funktion dekoriert. Sie wird also verwendet, um mit dem Dekorator ein modifiziertes, zweckmässigeres Resultat zu erzielen:


def decor(fun):
    def inner(arg):
        value = fun(arg)
        return value * 2
    return inner


mysum = decor(sum)

print(mysum([1, 2, 3, 4]))
# 20
Im obigen Beispiel wurde die Funktion sum der Standardbibliothek dekoriert. Sie gibt die Summe aller Listenelemente zurück. Der Dekorator hat zum Zweck die doppelte Summe zurückzugeben. Mit @ Annotationen wird die Sache noch einfacher. Man setzt einfach vor die zu dekorierende Funktion ein @dekorname:

@decor
def num():
    return 5

print(num())
# Hier wird nun automatisch die dekorierte Funktion genommen 

Dabei kann eine Funktion auch mehrfach dekoriert werden.

@dec1
@dec2
def fun(arg1, arg2, …):
    pass
# aequivalent zu

def fun(arg1, arg2, …):
    pass

func = dec1(dec2(fun))
 

Generatoren

Generatoren sind Funktionen, die eine Wertesequenz zurückgeben über die iteriert werden kann. Sie sind gewöhnliche Funktionen, enthalten aber das Schlüsselwort yield. Mit yield wird einerseits der Funktion mitgeteilt, dass sie nun pausieren soll und andererseits, dass sie einen Wert an das Hauptprogramm oder den aktuellen Handlungsstrang zurückgeben soll.


def nextSquare(x, limit):
    while x <= limit:
        yield x*x
        x += 1


sequenz = nextSquare(2, 4)
print(list(sequenz))
# [4, 9, 16]
sequenz = nextSquare(4, 6)
print(next(sequenz))
# 16
print(next(sequenz))
# 25

Im obigen Beispiel ist ersichtlich, dass die Umwandlung des iterierbaren Objekts in eine Liste, gleich alle durch den Iterator ansprechbare Werte zurückgibt. Soll auf den nächsten Wert zurückgegriffen werden, so wird next benutzt.

Vom Aufbau her wird einfach eine Liste von yield Anweisungen abgearbeitet:


def gen():
    yield 'A'
    yield 'B'
    yield 'C'


for i in gen():
    print(i)
# A
# B
# C

An einen Generator können Werte auch gesendet werden. Das ist dann nützlich, wenn eine Sequenz ab einem gewissen Wert unterbrochen werden und dann für einen höheren Wert wieder fortgesetzt werden soll:


def double_number(number):
    while True:
        number *= 2
        number = yield number


c = double_number(4)
print(next(c))
# 8
# print(next(c))
# Dies wuerde zu einer Exception fuehren

print(c.send(5))
# 10
print(c.send(1500))
# 3000
print(c.send(3))
# 6

Damit wäre dieser Blogartikel schon beendet. Viel Spass beim Üben!

Kommentare

Beliebte Posts aus diesem Blog

Python : Einführung in pygame

Einführung Pygame ist eine Bibliothek in Python, die es erlaubt grafisch anspruchsvolle Spiele zu erstellen. Damit pygame effektiv eingesetzt werden kann, braucht es doch einiges an Basiswissen, das in diesem Blog vermittelt wird. Gerade für Spiele wird vielmals von Elementen der Künstlichen Intelligenz Gebrauch gemacht. Teilweise handelt es sich nur um offensichtliche KI-Routinen aber andererseits auch um hochkomplexe Algorithmen, die nicht so trivial zu verstehen sind. Vor etlichen Jahren habe ich ein Buch gekauft, mit dem ansprechenden Namen " AI for Game developers " von David M. Bourg und Glenn Seemann. Das Ziel war es, herauszufinden, wie einfach ein Spiel unter Java 5 realisiert werden könnte. Das ganze sollte ein Kundenprojekt werden, ist aber dann nie zustande gekommen, weil der Aufwand zu gross war, das Projekt mit den bestehenden Java Bibliotheken umzusetzen. Für meine weitere "Forschung" hinsichtlich KI habe ich dieses Buch wieder zur Hand genomm...

Terraform und Ansible - ein starkes Gespann

Einführung Terraform (IaaS - Infrastructure as a Service) und Ansible (CaaS - Configuration as a Service) bilden zusammen ein starkes Gespann, um schnell konfigurierte Ressourcen auf der Microsoft Azure Cloud zu provisionieren. In meinen bisherigen Blogartikeln habe ich bisher Terraform vorgestellt https://thomkerle.blogspot.com/2019/02/azure-infrastruktur-erstellen-mit.html https://thomkerle.blogspot.com/2019/03/azure-service-principal.html https://thomkerle.blogspot.com/2019/03/eine-komplette-terraform-pipeline-mit.html https://thomkerle.blogspot.com/2019/08/terraform-12-ist-da.html und zwar wie mit Terraform effizient Ressourcen aus Azure DevOps ( https://dev.azure.com ) provisioniert werden können. Während sich Terraform vor allem im Bereich "Ressourcen-Deployment" etabliert hat, scheint sich Ansible im Bereich "Configuration as a Service" zu etablieren. In diesem Artikel präsentiere ich ein Beispiel, wie mit Terraform Ansible Code - nach de...

Gnome Desktop auf Azure

Einleitung DaaS heisst nichts anderes als Desktop as a Service. Darunter wird die Bereitstellung eines Desktops in der Cloud verstanden. Anstatt Windows 10 zu Hause zu nutzen, wird Windows in der Cloud genutzt. Also anstatt leistungsfähige Hardware zu Hause zu horten, kann die Hardware in der Cloud genutzt werden. Mit geeigneter Software kann dann ein virtueller Desktop zur virtuellen Maschine in der Cloud lokal auf dem eigenen Rechner genutzt werden.  Im Moment ist dabei klar Citrix der Marktführer dicht gefolgt von anderen Herstellern unter anderem auch Microsoft. Schaut man in die Linux Welt, so wird mit Spice ein Protokoll angeboten, mit dem eine unter KVM laufende virtuelle Maschine angesprochen werden kann. Das Desktop Experiment übernimmt der virt-viewer, der unter unter  https://www.spice-space.org/download.html heruntergeladen werden kann. Hier gehen wir aber von einem leicht anderen Setup aus. Wir wollen den virt-viewer nutzen, um eine in Azure deployte U...