Tag 3: Funktionen & Standardbibliothek

Tag 3: Funktionen & Standardbibliothek#

Bisher haben wir einzelne Code-Stücke geschrieben und nacheinander ausgeführt. Mit ersten Funktionen sind Sie bereits mit den Funktionen print() und len() aus den vorherigen Tagen vertraut. Python bietet mehrere eingebaute Funktionen wie diese, aber Sie können auch Ihre eigenen Funktionen schreiben. Eine Funktion ist wie ein Miniprogramm innerhalb eines Programms. Im Folgenden führen wir erst in Funktionen ein und wiederholen damit, die Inhalte der letzten Tage.

Definition: Mit dem Schlüsselwort def können Funktionen definiert werden, gefolgt von einem Namen und eventuell Parametern.

def hello_world():
    print('Hi')

Parameter und Rückgabewerte: Funktionen können Parameter akzeptieren und Werte zurückgeben, die mit dem return-Statement definiert werden.

def addition(x, y):
    return x + y

Eingebaute Module: Python bietet eine Vielzahl von eingebauten Modulen in der Standardbibliothek, die eine breite Palette von Funktionen und Werkzeugen für verschiedene Aufgaben bereitstellen.

Um besser zu verstehen wie Funktionen funktionieren und wie wir selber welche schreiben können, erstellen wir nun eine einfache erste Version.

def hello(): # mit 'def' wird eine Funktion definiert, hello_world ist der Name der Funktion
    print('Hi')
    print('Guten Tag')

hello() # mit dem Namen und Klammern wird eine Funktion aufgerufen

# Ausgabe
# Hi
# Guten Tag

Hierbei wird die Funktion mit dem Schlüsselwort def eingeleitet. Der Funktion wird der Name hello_world gegeben und es werden keine Parameter übergeben (). Durch die folgende Einrückung der vier print() Aufrufe, ist klar, was zu Funktion gehört und was nicht. Der Funktionsaufruf hello() ist nicht mehr eingerückt und gehört somit nicht mehr zur Funktion. Dieser ruft dann die Funktion auf. Wichtig ist, dass Funktionen erst definiert werden müssen, bevor sie aufgerufen werden können. D.h. die Funktion muss im Code ‘über’ dem Aufruf stehen.

Die Möglichkeit Funktionen Parameter ‘übergeben’ zu können ermöglicht es beispielsweise auf Grundlage dessen Entscheidungen in der Funktion treffen zu können. So kann bspw. entschieden werden, ob höflich oder leger gegrüßt werden soll.

def hello(art_der_begruessung):
    if art_der_begruessung == True:
        print('Hi')
    else:
        print('Guten Tag')

art_der_begruessung = True

hello(art_der_begruessung) # Funktionsaufruf mit Parameter

# Ausgabe
# Guten Tag

Die Funktion von oben aktzeptiert nun einen Parameter art_der_begruessung. Dieser wird als Boolean in dem If-Else-Ausdruck verwendet um zu unterscheiden ob nur leger gegrüßt wird (True) oder höflicher (False). Wichtig ist, dass im Aufruf hello(art_der_begruessung) der Parameter entsprechend übergeben wird. Dieser muss nicht den selben Namen aufweisen - hello(True) würde genauso funktionieren.

Formalisiert wäre eine Funktion:

def funktionsname(optionale_parameter):
    """ docstring - Beschreibung"""
    # statement(s)
    return value # optional

funktionsname(parameter) # Funktionsaufruf

Der erste Teil def funktionsname(optionale_parameter): wird auch header genannt. Der eingerückte Teil wird body genannt. Funktionen ermöglichen somit das mehrfache Nutzen von Funktionalitäten und ermöglicht das Teilen dieser Funktionalitäten an andere. Zudem kann Code so besser organisiert und wiederverwendet werden.

Kommen wir nun zu dem Eingangsbeispiel der Addtion wieder.

def addition(x, y):
    add = x + y
    return add

Diese Funktion ermöglicht uns, eine einfache Addition wiederzuverwenden. Diese Funktion haben wir natürlich schon als Operator +, jedoch könnten in dieser Funktion beispielweise noch unterschiedliche Überprüfungen hinzugefügt werden (bspw. dass es sich um einen Integer handeln muss) und mit Fehlern automatisch umgegangen werden (kommende Tage). Unterschiedlich zur vorangehenden Funktion ist, dass diese Funktion mit dem Schlüsselwort return etwas ‘zurückgibt’. In diesem Fall die Summe von x und y. Da die Funktion etwas zurück gibt, kann mit dem Aufruf einer Variable ein neuer Wert zugewiesen werden.

Beispiel:

a = 5
b = 10
summe = addition(a, b)

Hier werden zwei Variablen a und b mit den Werten 5 und 10 initialisiert und als Parameter der Funktion addition übergeben. Diese werden in der Funktion der Reihenfolge nach den lokalen Variablen x (a) und y (b) zugewiesen. In der Funktion werden diese dann addiert und ‘zurückgegeben’. Damit wird mit der errechneten Summe der Addition in der Funktion nun die Variable summe initialisiert. Summe hat somit den addierten Wert der beiden Variablen a und b.

Erforderliche und Optionale Parameter: Funktionen können optionale Parameter haben, die beim Funktionsaufruf nicht mit übergeben werden müssen. Ein Beispiel haben Sie bereits kennengelernt, nämlich reverse=True in der list.sort()-Funktion. Dazu definieren wir einen Standard-Wert für den Parameter im Funktions-Header:

def hallo(sprache, nett=True):
    if sprache == 'DE':
        if nett:
            return "Moin"
        else:
            return "MoinMoin"
    else:
        if nett:
            return "Hello"
        else:
            return "HelloHello"

In diesem Beispiel hat die Funktion hallo() einen erforderlichen Parameter (den ersten, nämlich sprache und einen optionalen Parameter (den zweiten, nämlich nett). Für den Aufruf haben wir also zwei Möglichkeiten:

hallo('EN') # Gibt "Hello" zurück, "nett" hat den Standard-Wert von "True"
hallo('DE', False) #Gibt "MoinMoin" zurück

Im ersten Fall wird sprache beim Funktionsaufruf den Wert EN annehmen, nett den Standard-Wert von True. Im zweiten Fall werden beide Parameter übergeben, nett hat also den Wert False.

Wird die Funktion allerdings ohne Argument aufgerufen, erhalten wir einen Fehler:

>>> hallo()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    hallo()
TypeError: hallo() missing 1 required positional argument: 'sprache'

Python-Standardbibliothek#

Die Python-Standardbibliothek, auch bekannt als STDLIB, ist eine Sammlung von Modulen und Paketen, die mit Python geliefert werden und eine Vielzahl von nützlichen Funktionen und Werkzeugen für verschiedene Aufgaben bieten. Diese Bibliothek ist Teil der Python-Installation und muss nicht separat installiert werden.

Hier sind einige der Hauptbereiche, die von der Python-Standardbibliothek abgedeckt werden und was man damit machen kann:

  1. Betriebssystemoperationen (os): Das os-Modul bietet Funktionen zum Arbeiten mit dem Betriebssystem, einschließlich Dateioperationen, Verzeichnisoperationen, Umgebungsvariablen und Prozesssteuerung (morgen)

  2. Mathematische Funktionen (math): Das math-Modul enthält eine Vielzahl von mathematischen Funktionen und Konstanten, die für mathematische Berechnungen nützlich sind. Dazu gehören Funktionen für Trigonometrie, Logarithmen, Exponentialfunktionen, Runden und mehr.

  3. Zufallszahlen (random): Das random-Modul ermöglicht die Erzeugung von Pseudozufallszahlen. Es bietet Funktionen zum Generieren von Zufallszahlen, zur Auswahl von Zufallselementen aus Listen und zur Mischen von Sequenzen.

  4. Datum und Zeit (datetime): Das datetime-Modul bietet Klassen und Funktionen zum Arbeiten mit Datum und Zeit. Es ermöglicht das Erstellen, Manipulieren und Formatieren von Datum und Zeit sowie die Berechnung von Zeitdifferenzen.

  5. Dateiverarbeitung (io): Das io-Modul bietet Tools zum Lesen und Schreiben von Dateien und Datenströmen. Es ermöglicht das Arbeiten mit Dateien im Speicher sowie das Umleiten von Ein- und Ausgaben.

  6. Reguläre Ausdrücke (re): Das re-Modul stellt Funktionen und Klassen zum Arbeiten mit regulären Ausdrücken bereit. Reguläre Ausdrücke werden verwendet, um Textmuster in Zeichenketten zu suchen und zu manipulieren.

  7. Datenkompression (gzip, zipfile, zlib): Python bietet verschiedene Module zur Datenkompression, einschließlich gzip für GZIP-Komprimierung, zipfile für ZIP-Archive und zlib für die Verwendung des Zlib-Komprimierungsformats.

  8. Netzwerk- und Internetprotokolle (socket, urllib): Die socket- und urllib-Module ermöglichen die Kommunikation über Netzwerke und das Arbeiten mit Internetprotokollen wie HTTP, FTP und SMTP.

Einige dieser Module müssen vor der Nutzung importiert werden. Das schauen wir uns am letzten Tag an. Importieren von Modulen:

Dies sind nur einige Beispiele für die Funktionen und Werkzeuge, die in der Python-Standardbibliothek enthalten sind. Schauen Sie in die Dokumentation für mehr Informationen. Meistens ist es schneller, einfacher und besser solche Funktionen zu nutzen, als für den selben Zweck eigene Funktionen zu schreiben.

Tüftelspaß und Knobeleien#

Das war’s auch schon mit neuem Inhalt für heute. Jetzt ist Zeit zum Fragen stellen! Stellen Sie gern Fragen zu jeglichen Inhalten der letzten Tage - direkt im Plenum oder wie gehabt im allg. Markdown-Dokument.

Erste Tüfteleien

  1. Schreiben Sie eine Funktion devision, die zwei Variablen aufnimmt , verarbeitet und das Ergebnis ausgibt. Berechnen Sie das mittels dieser Funktion das Ergebnis von: 8958937768937 geteilt durch 2851718461558. Was kommt raus?

  2. Schreiben Sie eine Funktion multiplikation und errechnen Sie mit dieser Funktion, wieviele Sekunden ein Jahr mit 365 Tagen hat.

  1. Nutzen Sie die Methoden der Standardbibliothek für Strings und finden Sie heraus, wieviele Buchstaben das Wort 'Donaudampfschifffahrtselektrizitätenhauptbetriebswerkbauunternehmenbeamtengesellschaft' hat. Welcher Vokal ist am häufigsten vertreten? Wie oft?

    • Schreiben Sie für jede dieser Zählungen oder Vergleiche eine eigene Funktion. Tipp: Es können auch Funktionen innerhalb von Funktionen aufgerufen werden.

  1. Wie viele Buchstaben hat die ausgeschriebene Version der chemischen Formula Titin im Englischen? Welcher Buchstabe ist hier der häufigste? Nutzen Sie gern Ihre in Aufgabe 3 geschriebenen Funktionen.

Vorbereitung der Bastelei

  1. Machen Sie sich mit der Extra Aufgabe am Ende von Tag 2 vertraut. Diese können Sie im Anschluss gern noch bearbeiten, gehen Sie dann jedoch bitte als Gruppe gemeinsam zu diesen Aufgaben über. Das Ziel letztliche dieser Aufgabe ist es, für alle Städte die Einwohnerdichte herauszufinden. Zunächst müssen jedoch die Daten “gereinigt” werden. Also für die entsprechende Aufgabe so vorbereitet werden, dass eine Verarbeitung möglich ist.

  1. Sie finden in der Datengrundlage zwei Listen mit Informationen zu Flächen und Einwohnerzahlen. Diese sind ergänzende Informationen zu den Städten und Ländern der Extra Aufgabe von gestern.

  1. Fügen Sie zunächst die Daten in Ihren Code ein und schauen Sie sich die Datengrundlage genauer an. Was muss mit den Daten passieren, damit Sie mit ihnen eine Einwohnerdichte berechnen können?

    • Datenbeschaffung und -bereinigung sind häufig große Teile im wissenschaftlichen Arbeiten. Daten in der freien Wildbahn können komplex, schwer zu verstehen, unvollständig und fehlerhaft sein. Seltenst sind Daten direkt verarbeitbar. Die Bereinigung, also Überprüfung und Vorbereitung, der Daten für die gewollte Verarbeitung, ist somit ganz normaler Teil der wissenschaftlichen Praxis. Diesen Schritt werden Sie nun im Folgenden auch durchlaufen.

  2. Für die Fläche werden wir dies nun gemeinsam durchgehen, für die Einwohnerzahl ist es dann Ihnn überlassen eine Lösung zu finden. Initialisieren Sie nun mit dem ersten Element der Flächen-Liste eine neue Variable und geben Sie sie aus.

    • Bei der Fläche wäre dies der Wert f1 = '0219 km²' an der Indexstelle ‘0’ der Liste. Um letztlich eine Berechnung von Fläche und Einwohnerzahl zu ermöglichen, müssen die Daten mit dem Datentyp ‘float’ vorliegen. Die Daten bisher liegen noch als ‘String’ vor und sind somit noch nicht numerisch zu verarbeiten. Den Prozess einen Datentyp in einen anderen Datentyp zu verwandeln nennt sich casten. In diesem Fall wäre dies: float('0219 km²). Probieren Sie dies gern im REPL aus und schauen was passiert.

  1. Versuchen Sie nun herauszufinden woran es liegt, dass der String nicht in einen Gleitkommadatentyp (float) überführt werden kann. Das können Sie versuchen, indem Sie einzelne Teile des Wertes versuchen zu casten - so können Sie das Problem genauer definieren.

  2. Sie werden erkannt haben, dass einige Inhalte des Strings nicht konvertierbar sind. Anderes jedoch überraschenderweise funktioniert. Versuchen Sie dies nun auch mit einem anderen Wert der Datengrundlage ‘Fläche’, um sicher zu gehen, dass Ihre Methodik für alle Daten in der Datengrundlage das selbe Ergebnis liefert.

  3. Um nicht händisch jeden String im Folgenden überarbeiten zu müssen, sollten Sie nun versuchen einen Weg zu finden, wie Sie das automatisch bewerkstelligen können. Sprechen Sie sich in Ihrer Gruppe ab und erörtern und testen Sie potentielle Möglichkeiten. Gern auch im Peer-Programming.

  1. Wenn Sie eine Lösung gefunden haben versuchen Sie diese nun auf alle Elemente in der Liste anzuwenden. Tipp: Ggf. hilft Ihnen eine Kombination aus for-Schleife für den Zugriff auf jedes Element der Liste und eine Funktion, die den String entsprechend bearbeitet und wieder zurückgibt.

  1. Überprüfen Sie Ihr Ergebnis, indem Sie sich die neue Liste ausgeben lassen. Hat alles funktioniert?

  2. Nun sind Sie dran! Bereinigen Sie die Liste der Einwohnerzahlen.

  3. Schreiben Sie nun eine Funktion, um die Einwohnerdichte zu berechnen und testen Sie dies mit einzelnen Werten.

  4. Wenden Sie nun beide Listen auf die eben geschriebene Funktion an und errechnen Sie für alle Werte die Einwohnerdichte und speichern Sie diese in einer neuen Liste ‘einwohnerdichte’.

Aufgabe 3: Ausgewachsene Knobelei - für Daniel Düsentriebe

Nehmen Sie sich nun auch noch die Informationen von gestern bzgl. der Namen der Hauptstädte.

  1. Welche Stadt hat die größte Bevölkerung?

  2. Welche die niedrigste Dichte?

  3. Und welche die durchschnittlichste Größe (arithmetisches Mittel der flaeche)?

  • Kann Ihnen hier ein Dictionary helfen?

  • Denken Sie daran, dass Sie Datentypen auch ‘verschachteln’ können. Sie können somit Listen in Listen oder Listen in Dictionaries geben.