Beispiele

Beispiele zum Workshop Python, Programmieren macht Spaß.

Mein Vorschlag: PyCharm installieren. Dann ein neues Projekt erstellen. Dann die unten stehenden Beispiele lesen, verstehen und **selbständig im PyCharm eintippen**.

In PyCharm: Rechte Maustaste "New / Python File".

Ausführen mit Menü "Run / Run", bzw Alt+Shift+F10. Wer denkt mit Copy&Paste schneller voranzukommen: Ja, du bist schneller, aber am Ende nicht klüger.

Der Lerneffekt ist höher, wenn du die Beispiele eintippst. Ziel der Übung ist es, das Schreiben von Programmen zu lernen.

Ggf nützlich: PyCharm Intro

Beispiel ZINSEN

Ein Versicherungsvertreter verspricht dir, dass du einen großen Betrag bekommst, wenn du 35 Jahre jährlich 900 Euro einzahlst. Du willst nun wissen, wieviel Geld du hättest, wenn du keine Rentenversicherung abschließt, sondern das Geld mit 3 Prozent Zinsen anlegst. Vielleicht gibt es dafür eine Formel, aber iterativ (in einer Schleife) lässt sich das auch leicht berechnen.
summe = 0
for jahr in range(35):
    summe *= 1.03  # 3 Prozent Zinsen
    summe += 900
    print(f'Jahr {jahr+1} Betrag: {summe}')

Beispiel FIFO

FIFO (first in first out) (Queue)

Vergleich: Autobahntunnel
l = []  # Nehme eine leere Liste
for i in range(10):
    l.append(i)  # An Liste anhängen
print(l)
while l:  # Solange 'l' nicht leer ist ...
    print(l.pop(0))  # Entferne erstes Element der Liste

# Ergebnis: 0, 1, 2, ...

Beispiel FILO

FILO (first in last out) (Stack)

Vergleich: Stapel von Münzen
l = []
for i in range(10):
    l.append(i)
while l:
    print(l.pop())  # Entferne letztes Element der Liste

# Ergebnis: 9, 8, 7, ...

Beispiel ZÄHLEN

for i, wort in enumerate(['null', 'eins', 'zwei']):
    print(i, wort)  # 0 null, 1 eins, ....

Beispiel ENDE

Das dicke Ende
file = 'foo.jpg'
if file[-4:] == '.jpg':  # unschön
    print('Foto')
if file.endswith('.jpg'):  # besser, analog 'startswith()'
    print('Foto')

Beispiel DIE WAHRHEIT

Was ist wahr und was ist falsch?

Folgende Bedingungen sind wahr:
if True:
    print('wahr')
if 1:
    print('wahr')
if -1:  # Alle Zahlen außer 0 sind wahr
    print('wahr')
if '0':  # Nichtleere Zeichenkette
    print('wahr')
if 'False':  # Nichtleere Zeichenkette
    print('wahr')
if [[]]:  # Nichtleere Liste
    print('wahr')

if not False:
    print('wahr')
if not 0:
    print('wahr')
if not []:  # Leere Liste
    print('wahr')
if not {}:  # Leeres Dictionary
    print('wahr')
if not '':  # Leere Zeichenkette
    print('wahr')
if not None:
    print('wahr')
if bool('0'):
    print('wahr')
if True and True:
    print('wahr')
if False or True:
    print('wahr')

Beispiel REFERENZ

Referenz vs. Kopie
list1 = [1, 2, 3, 4]
list2 = list1  # Zwei Referenzen zeigen auf eine Liste
list2[0] = 5
print(list1 == list2)  # --> True

list1 = [1, 2, 3, 4]

# Erstelle eine Kopie der ersten Liste
list2 = list(list1)

list2[0] = 5
print(list1 == list2)  # --> False

Beispiel SETS

Mengenlehre
bis_fuenf = set([1, 2, 3, 4, 5])
gerade = set([2, 4, 6, 8, 10])
vereinigung = bis_fuenf | gerade  # Union
schnittmenge = bis_fuenf & gerade  # Intersection
differenz = bis_fuenf - gerade
print('Mengenlehre', vereinigung, schnittmenge,
      differenz)

# Alternative Syntax
vereinigung = bis_fuenf.union(gerade)
schnittmenge = bis_fuenf.intersection(gerade)

Beispiel SORTDICT

Ein Dictionary sortieren. Da Dictionaries nicht sortiert gespeichert werden, will man sie für die Ausgabe ggf. sortieren:
mydict = {'a': ['Auto', 'Ampel'],
          'b': ['Bus', 'Banane'],
          'c': ['Chemnitz', 'Chaos'],
          'd': ['Dame', 'Diesel'],
          'e': ['Esel']}
print('Unsortiert:', mydict)
for buchstabe, woerter in sorted(mydict.items()):
    print(f'{buchstabe} {woerter}')

Beispiel DOWNLOAD

Herunterladen eine Webseite:
import urllib.request

url = 'http://www.python.org/'
with urllib.request.urlopen(url) as f:
    content = f.read()
print(content)

Beispiel WEBBROWSER

Anzeigen der heruntergeladene Seite in einem Browser: Es wird der Standard-Browser des Systems genommen.
import tempfile
import webbrowser
htmlfile = tempfile.mktemp('foo.html')
with open(htmlfile, 'wb') as f:
    f.write(content)
webbrowser.open(f'file://{htmlfile}')

Beispiel CHARCOUNT

Zähle wie oft die Zeichen einer Datei vorkommen
datei = 'beispiele.py'
inhalt = open(datei).read() # Lese die gesamte Datei 
countdict = {}  # Erstelle leeres Dictionary
for char in inhalt:  # char (character) == Zeichen

    # Falls Zeichen noch nicht gezählt, nehme die Null
    old = countdict.get(char, 0)  
    
    old += 1  # Zähle um eins hoch
    
    # Speichere Zähler im Dictionary
    # "char" ist der "Key/Schlüssel"
    countdict[char] = old

for char, count in sorted(countdict.items()):
    if char == '\n':
        char = '\\n'  # Newline als \n ausgeben.

    # :4 --> rechtsbündig mit einer Breite
    # von 4 Zeichen ausgeben.
    print(f'Zeichen {char}: {count:4}')

Beispiel UNICODE

Die "heile" Objekt-Welt und die schnöden Bytes.
#  <-- "heile" Objekt-Welt. Bytes gibt es hier nicht.
print(len('üöäß'))

print(len('üöäß'.encode('utf8')))

print(len('üöäß'.encode('utf16')))

print(len('üöäß'.encode('latin1')))

Beispiel EINMALEINS

Das Einmaleins als HTML-Tabelle
import tempfile
import webbrowser

rows = []
heading = []
for i in range(1, 11):
    heading.append(f'<th bgcolor="gray">{i}</th>')
    cols = []
    for j in range(1, 11):
        cols.append(f'<td align="right">{i * j}</td>')
    cols = "".join(cols)
    row = f'<tr><th bgcolor="gray">{i}</th>{cols}</tr>'
    rows.append(row)
html = f'''
 <html>
  <head><title>Einmaleins</title></head>
  <body>
   <table border="1">
    <tr>
     <th>&nbsp;</th> {''.join(heading)}
    </tr>
    {''.join(rows)}
   </table> 
  </body>
 </html>'''

temp = f'{tempfile.mktemp()}.html'
with open(temp, 'w') as fd:
    fd.write(html)
webbrowser.open(temp)

Beispiel STACKTRACE

Stacktrace einer Exception als String

Anwendung: Fehler bei einer Web-Anwendung als Email verschicken:
def foo():
    raise Exception('Das ist eine Exception')

try:
    foo()
except Exception:
    import traceback

    exc_string = ''.join(traceback.format_exc())
    print(exc_string)
    # raise ohne Argumente führt ein 're-raise' aus:
    # Die aufgefangene Exception wird wieder ausgelöst
    raise

Beispiel: catch Exception

Hinweis: Eine 'catch-all' Regel, die alle Exceptions auffängt sollte vermieden werden. Normalerweise sollte man nur bestimmte Exceptions auffangen. Beispiel:
i = 'abc'
try:
    i = int(i)
except ValueError:
    print(f'{i} ist keine Ganzzahl')

Beispiel LISTCOMPREHENSION

Listcomprehension verwende ich selten, da man genauso mit einer Schleife arbeiten kann:
# Mit Listcomprehension
staedte = ['Augsburg', 'Bremen', 'Hamburg', 'Berlin']
staedte_mit_b = [s for s in staedte if s.startswith('B')]
print(staedte_mit_b)

# Mit Schleife
staedte_mit_b = []
for s in staedte:
    if s.startswith('B'):
        staedte_mit_b.append(s)
print(staedte_mit_b)

Beispiel OWNEXCEPTIONS

Eigene Exceptions

Hinweis: Das Auffangen aller Exceptions sollte vermieden werden, da Fehler wie MemoryError, KeyboardInterrupt oder ZeroDivisionError nicht stillschweigend übergangen werden sollten.
class MyException(Exception):
    pass


def test_func():
    raise MyException('Test')


try:
    test_func()
except MyException as exc:
    print(f'Fehler: {exc}')  # --> 'Fehler: Test'

Beispiel DATETIME

Rechnen mit Tagen
import datetime

heute = datetime.date.today()
gestern = heute - datetime.timedelta(days=1)
morgen = heute + datetime.timedelta(days=1)
print(gestern, heute, morgen)

Beispiel MTIME ZU DATETIME

mtime zu datetime
import os
import datetime

# mtime: Sekunden seit 1970
mtime = os.path.getmtime('/etc/fstab')

# High-Level Datumsangabe
datetime.datetime.fromtimestamp(mtime)

Beispiel os.walk()

Das Unix-Tool 'find' durchsucht Verzeichnisse rekursiv. In Python kann man dafür die Funktion os.walk() verwenden. Damit die Ergebnisse reproduzierbar sind, empfiehlt es sich die Verzeichnisse und Dateien vor dem durchforsten zu sortieren. In diesem Beispiel werden alle Verzeichnisse übersprungen die 'temp' oder 'tmp' heißen und Dateien die mit '.pyc' enden.
import os

start = '.'
for root, dirs, files in os.walk(start):

    # "inplace" Modifikation.
    dirs[:] = [dir for dir in sorted(dirs) 
               if not dir in ['temp', 'tmp']]
    
    for file in sorted(files):
        if file.endswith('.pyc'):
            continue
        file = os.path.join(root, file)
        print(file)