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
   Python2 vs Python3
   Datentypen
7.    Übersicht
7.    Zahlen
7.    Zeichenketten
7.    Listen
7.    Dictionaries (Hash-Tables)
   Sonstiges
8.    Booleschen Funktion
   Flusssteuerung
10    Funktionen
11    Python-Datei
12    Dateien
13    Klassen - Objektorientierung
14    Exceptions
15    Standardbibliothek
15.    Module importieren
15.    Paketauswahl
16    Externe Bibliotheken
17    Beispiele
18    Externe Links
19    Vergleich mit anderen Programmiersprachen
20    Python2 zu Python3
21    FAQ
22    Python++
22.    List Comprehension
22.    Decorator
22.    Properties
22.    Generators
23    Debugging Tipps
24    Spaßbremse
25    Infrastruktur
26    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 Python2 vs Python3 [toc]

Mit diesen zwei Zeilen am Anfang einer Python Datei ist man auf der sicheren Seite. Python 2.7 verhält sich nun fast genauso wie Python3.
# -*- coding: utf-8 -*-
from __future__ import absolute_import, division, unicode_literals, print_function

7 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

8 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

9 Flusssteuerung [toc]

10 Funktionen [toc]

11 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.

12 Dateien [toc]

13 Klassen - Objektorientierung [toc]

14 Exceptions [toc]

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

15 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

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:

16 Externe Bibliotheken [toc]

17 Beispiele [toc]

18 Externe Links [toc]

19 Vergleich mit anderen Programmiersprachen [toc]

Siehe Vergleich von mir bekannten Programmiersprachen

20 Python2 zu Python3 [toc]

Ich empfehle python-future.org als Informationsquelle.

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/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 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 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

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