www.thomas-guettler.de / Vorträge

Python, Programmieren macht Spaß

Einführung

Python ist eine universelle, interpretierte höhere Programmiersprache. Ihre Entwurfsphilosophie betont Programmlesbarkeit. Die Programmstruktur wird durch die Einrücktiefe gebildet. Quelle: Wikipedia

Wie bin ich zu Python gekommen?

Begeisterung

Vorbereitung für Workshops

Kursteilnehmer sollten vor dem Workshop:

Beispiel: Taschenrechner

Datentypen

Datentypen werden dynamisch vergeben.

Übersicht

Integer i = 1 Ganzzahl
Float f = 0.1 Gleitkommazahl
String s = 'hallo' Unicode-Zeichenkette
Bytes b = b'\x00\x01....' Binäre Bytes
Liste l = [1, 2, 3] Veränderbare Liste
Tuple t = (1, 2, 3) Unveränderbare Liste
Menge z = set([1, 1, 2, 2, 3]) --> set([1, 2, 3]) Menge (ohne Dopplungen)
Dictionary d = {1: 'eins', 2: 'zwei', 3: 'drei'} Auch Hash oder assoziatives Array genannt.

Zahlen

Es gibt die Datentypen Integer/Ganzzahlen (int), Float/Gleikommazahlen sowie Dezimalzahlen beliebiger Genauigkeit.
i = 1   # Zuweisung
i += 1  # i++ wie in C gibt es nicht
i *= 2

i**2  # i "hoch" 2
docs.python.org: Operatortabelle: Numeric Types

Zeichenketten

Listen

docs.python.org: Operatortabelle: Mutable Sequence Types

Dictionaries (Hash-Tables)

docs.python.org: Operatortabelle: Mapping Types

Sonstiges

Folgende Schlüsselwörter haben eine besondere Bedeutung:
True Boolscher Wert für Wahr
False Boolscher Wert für Falsch
None Leerer Wert, NIL, Null-Pointer

Booleschen Funktion

Variable1 Boolescher Operator Variable2 Ergebnis
True and True True
True and False False
False and False False
False and True False


Variable1 Boolescher Operator Variable2 Ergebnis
True or True True
True or False True
False or False False
False or True True

Flusssteuerung

Funktionen

Python-Datei

Ein Python Script wird in einer Datei gespeichert, die mit ".py" endet. Als Vorlage kann folgende Datei dienen: reverse.py

Wie führt man nun dieses Programm aus?

Unter Unix ruft man es von der Shell auf:
python3 myscript.py
Steht in der ersten Zeile #!/usr/bin/env python3 und hat man die Ausführungsrechte gesetzt (chmod a+rx myscript.py) kann man es direkt ausführen:
./myscript.py
Unter Windows kann man ein Script durch Doppelklick aus dem Explorer ausführen. Endet die Datei mit ".py" wird es in einer MS-DOS Eingabeaufforderung ausgeführt. Wenn es die Endung ".pyw" hat, wird es ohne zusätzlichem Fenster gestartet. Der Nachteil vom Anklicken ist, das man dem Script keine Argumente übergeben kann. Zur Not kann man das Script aus der MS-DOS Eingabeaufforderung aufrufen und dort Argumente übergeben.

Startet man ein Programm durch Doppelklick auf eine .py Datei, schließt sich das Fenster sobald das Script beendet ist. Möchte man, dass das Fenster offen bleibt, kann man ein "sys.stdin.readline()" am Ende einfügen.

Ein typischen Kommandozeilenprogramm in Python:
#!/usr/bin/env python3

import argparse

def main():
    parser = argparse.ArgumentParser(description='Process some integers.')
    parser.add_argument('integers', metavar='N', type=int, nargs='+',
                        help='an integer for the accumulator')
    args = parser.parse_args()
    print(args.integers)

if __name__ == '__main__':
    main()
Die Funktion "main()" wird aufgerufen, wenn das Script aufgerufen wird.

Wird das Script von einer anderen Datei importiert (import myscript), wir die Main-Funktion nicht aufgerufen. Es werden dann nur die Funktionen und Klassen bereitgestellt.

Dateien

Klassen - Objektorientierung

Exceptions

my_int = 'sf'
try:
    my_int2 = my_int + 3
except TypeError as exc:
    print(f'etwas ging schief: {exc}')
else:
    print('alles ging gut')
print('hier geht es weiter')

Standardbibliothek

Module importieren

Ein Modul (bzw. Bibliothek) wird mit der import-Anweisung eingebunden. Die Funktionen, Variablen und Klassen dieses Moduls sind über den Modulnamen anzusprechen. Hier zwei Beispiele:
import sys
sys.argv[0] # Scriptname
import json
json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])

Paketauswahl

Folgende Pakete gehören zur Standardbibliothek und sind immer vorhanden. Da die gesamte Liste der Python Pakete inzwischen recht lang geworden ist, will ich hier die aus meiner Sicht wichtigsten Pakete aufzählen:

Externe Bibliotheken

Tools von mir

Texte von mir

Beispiele

Externe Links

Vergleich mit anderen Programmiersprachen

Siehe Vergleich von mir bekannten Programmiersprachen

FAQ

Python++

Folgende Abschnitte sind für Fortgeschrittene.

List Comprehension

# Mit einer Schleife Leerzeichen am Anfang/Ende entfernen.
fruechte = [' Apfel  ', ' Banane ', '  Kiwi ', ' Ananas']
neue_fruechte = []
for frucht in fruechte:
    frucht = frucht.strip()
    neue_fruechte.append(frucht.strip())
fruechte = neue_fruechte
# List Comprehension (einiges kürzer)
fruechte = [frucht.strip() for frucht in fruechte]

Decorator

Mit einem Decorator wird eine Funktion 'verkleidet'. Folgendes Beispiel implementiert den Decorator 'commit_on_success'.
#!/usr/bin/env python3

def begin():
    print('begin')

def commit():
    print('commit')

def rollback():
    print('rollback')

def commit_on_success(func):
    '''
    Führe commit() aus, falls die dekorierte Funktion keine Exception
    wirft. Ansonsten wird rollback() aufgerufen.
    '''
    def _commit_on_success(*args, **kw):
        begin()
        try:
            res = func(*args, **kw)
        except Exception as e:
            rollback()
            raise # Re-raise (aufgefangene Exception erneut werfen)
        else:
            commit()
        return res
    return _commit_on_success

@commit_on_success
def foo(do_raise):
    if do_raise:
        raise Exception()

foo(False)  # --> commit()
foo(True)   # --> rollback()
user@host> python deco.py
begin
commit
begin
rollback
Traceback (most recent call last):
  File "tmp/deco.py", line 32, in <module>
    foo(True)   # --> rollback()
  File "tmp/deco.py", line 17, in _commit_on_success
    res = func(*args, **kw)
  File "tmp/deco.py", line 29, in foo
    raise Exception()
Exception
'''

Properties

class MailAddress(object):

    def __init__(self, user_at_domain):
        self.user_at_domain = user_at_domain

    @property
    def domain(self):
        return self.user_at_domain.split('@')[1]

mail = MailAdress('me@example.com')
print(mail.domain) # --> 'example.com'
Impliziter (versteckter) Funktionsaufruf. Siehe docs.python.org: Built-in Function property

Generators

Generatoren verhalten sich wie Listen. Es wird 'on-the-fly' für jeden Schleifendurchlauf das aktuelle Element zurückgegeben. Dieses Verfahren verbraucht weniger Hauptspeicher. Hier eine Nachbildung der Funktion range():
def my_range():
    i = 0
    while True:
        yield i
        i+=1

for i in my_range():
    print(i)
    if i == 5:
        break
Siehe auch docs.python.org: Iterator und docs.python.org: yield

Debugging Tipps

Hier einige Hinweise zum Auffinden von Fehlern:

Spaßbremse

Auch wenn Programmieren Spaß macht, bedenke folgendes: Also

Infrastruktur

My personal programming guidelines

Seit Juli 2016 pflege ich meine Tipps zur Softwareentwicklung hier: My personal programming guidelines

About

Diese Seite entstand im Rahmen folgender Vorträge und Workshops:
© 2002-2022 Thomas Güttler. Der Text darf nach belieben kopiert und modifiziert werden, solange dieser Hinweis zum Copyright und ein Links zu dem Original unter www.thomas-guettler.de erhalten bleibt. Es wäre nett, wenn Sie mir Verbesserungsvorschläge mitteilen: guettli@thomas-guettler.de