www.thomas-guettler.de / Vorträge

Python, Programmieren macht Spaß
   Einführung
   Wie bin ich zu Python gekommen?
   Begeisterung
   Vorbereitung für Workshops
   Beispiel: Taschenrechner
   Datentypen
6.    Übersicht
6.    Zahlen
6.    Zeichenketten
6.    Listen
6.    Dictionaries (Hash-Tables)
   Sonstiges
7.    Booleschen Funktion
   Flusssteuerung
   Funktionen
10    Python-Datei
11    Dateien
12    Klassen - Objektorientierung
13    Exceptions
14    Standardbibliothek
14.    Module importieren
14.    Paketauswahl
15    Externe Bibliotheken
16    Tools von mir
17    Texte von mir
18    Beispiele
19    Externe Links
20    Vergleich mit anderen Programmiersprachen
21    FAQ
22    Python++
22.    List Comprehension
22.    Decorator
22.    Properties
22.    Generators
23    Debugging Tipps
24    Spaßbremse
25    Infrastruktur
26    My personal programming guidelines
27    About

1 Einführung [toc]

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

2 Wie bin ich zu Python gekommen? [toc]

3 Begeisterung [toc]

4 Vorbereitung für Workshops [toc]

Kursteilnehmer sollten vor dem Workshop:

5 Beispiel: Taschenrechner [toc]

6 Datentypen [toc]

Datentypen werden dynamisch vergeben.
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.
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 docs.python.org: Operatortabelle: Mutable Sequence Types docs.python.org: Operatortabelle: Mapping Types

7 Sonstiges [toc]

Folgende Schlüsselwörter haben eine besondere Bedeutung:
TrueBoolscher Wert für Wahr
FalseBoolscher Wert für Falsch
NoneLeerer Wert, NIL, Null-Pointer
Variable1Boolescher OperatorVariable2Ergebnis
TrueandTrueTrue
TrueandFalseFalse
FalseandFalseFalse
FalseandTrueFalse


Variable1Boolescher OperatorVariable2Ergebnis
TrueorTrueTrue
TrueorFalseTrue
FalseorFalseFalse
FalseorTrueTrue

8 Flusssteuerung [toc]

9 Funktionen [toc]

10 Python-Datei [toc]

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.

11 Dateien [toc]

12 Klassen - Objektorientierung [toc]

13 Exceptions [toc]

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')

14 Standardbibliothek [toc]

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)}])
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:

15 Externe Bibliotheken [toc]

16 Tools von mir [toc]

17 Texte von mir [toc]

18 Beispiele [toc]

19 Externe Links [toc]

20 Vergleich mit anderen Programmiersprachen [toc]

Siehe Vergleich von mir bekannten Programmiersprachen

21 FAQ [toc]

22 Python++ [toc]

Folgende Abschnitte sind für Fortgeschrittene.
# 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]
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
'''
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 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

23 Debugging Tipps [toc]

Hier einige Hinweise zum Auffinden von Fehlern:

24 Spaßbremse [toc]

Auch wenn Programmieren Spaß macht, bedenke folgendes: Also

25 Infrastruktur [toc]

26 My personal programming guidelines [toc]

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

27 About [toc]

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