www.thomas-guettler.de / Vorträge
niemand.leermann@thomas-guettler.de
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
   Flusssteuerung
   Funktionen
10    Python-Datei
11    Dateien
12    Klassen - Objektorientierung
13    Standardbibliothek
13.    Module importieren
13.    Paketauswahl
14    Externe Bibliotheken
15    Beispiele
16    Externe Links
17    Nachteile von Python
18    Vergleich mit anderen Programmiersprachen
19    FAQ
20    Python++
20.    List Comprehension
20.    Decorator
20.    Properties
20.    Generators
21    Debugging Tipps
22    Infrastruktur
23    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]

Integer i=1 Ganzzahl
Float f=0.1 Gleitkommazahl
String s='hallo' Zeichenkette
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: Operatorentabelle für Sequenzen (Tuple, List, String, ...)
docs.python.org: Methoden von Strings docs.python.org: Operatortabelle: Mutable Sequence Types docs.python.org: Operatortabelle: Mapping Types

7 Sonstiges [toc]

Folgende Schlüsselworte haben eine besondere Bedeutung:
TrueBoolscher Wert für Wahr
FalseBoolscher Wert für Falsch
NoneLeerer Wert, NIL, Null-Pointer

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:
python myscript.py
Steht in der ersten Zeile #!/usr/bin/python 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 Programm in Python:
#!/usr/bin/python
# -*- coding: utf-8 -*-

# Python Imports
import os
import sys

def usage():
    print('''Usage: %s
....
''' % (
        os.path.basename(sys.argv[0])))

def main():
    if len(sys.argv)==1:
        usage()
        sys.exit(3)

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 Standardbibliothek [toc]

Ein Modul (bzw. Bibliothek) wird mit der import-Anweisung eingebunden. Die Funktionen, Variablen und Klassen dieses Moduls sind über den Modulnamen anzusprechen.
import sys
sys.argv[0] # Scriptname

from xml import sax
sax.parse(...)
Folgende Pakete gehören zur Standardbibliothek und sind in der Regel 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:

14 Externe Bibliotheken [toc]

15 Beispiele [toc]

16 Externe Links [toc]

17 Nachteile von Python [toc]

Einige Dinge sind auch an Python nicht optimal:

18 Vergleich mit anderen Programmiersprachen [toc]

Siehe Vergleich von mir bekannten Programmiersprachen

19 FAQ [toc]

20 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/python
# -*- coding: utf-8 -*-

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, 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 Zahl(object):

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

    @property
    def next(self):
        return self.i+1

zahl=Zahl(2)
print(zahl.next) # --> 3
Impliziter (versteckter) Funktionsaufruf. Es wird auf die Eigenschaft (das Attribut) 'next' zugegriffen. Im Hintergrund wird die Getter-Funktion next() aufgerufen. 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 xrange():
def myxrange():
    i=0
    while True:
        yield i
        i+=1

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

21 Debugging Tipps [toc]

Hier einige Hinweise zum Auffinden von Fehlern:

22 Infrastruktur [toc]

23 About [toc]

Diese Seite entstand im Rahmen folgender Vorträge und Workshops:
© 2002-2014 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