Code-Snippets

Was gibt es hier?

Unter "Snippets" (engl. für "Schnipsel") versteht man in der Sprache der Programmierung kleine Programmstückchen ("Code-Schnipsel") zur Lösung häufig benötigter oder typischer Teilprobleme. Im folgenden eine kleine Auswahl solcher Schnipsel. Sofern nichts anderes gesagt wird, bezieht sich die Syntax der Beispiele auf Python 3.x.

Betriebssystem unabhängige Zeitmessung

Zur Messung von kurzen Zeitabschnitten stellt das Modul time die Funktionen time() und clock() zur Verfügung, die sich allerdings je nach Betriebssystem unterschiedlich gut für eine einigermaßen exakte Zeitmessung eignen. Während unter Windows mit der Funktion clock() die höchste Messgenauigkeit erreicht wird, ist es unter Linux die Funktion time().

Fragt man nun mit Hilfe des platform-Moduls das verwendete Betriebssystem ab, dann lässt sich die jeweils beste Funktion zur Zeitmessung automatisch wählen. Anstelle einer bedingten Anweisung enthält der folgende Code einen bedingten Ausdruck, durch den sich die Fallunterscheidung kompakt in einer Zeile formulieren lässt.

import platform, time

timer = time.time if platform.system()=="Linux" else time.clock
t0 = timer()
for k in range(1000000):
    pass
dt = round(timer() - t0, 4)
print("Das hat", dt, "Sekunden gedauert.")

Python 2.x: Benutzereingaben ohne Risiko

Beim Einstieg in die Programmierung mit Python verwenden Programmieranfänger gerne die Funktion input(). In einer frühen Phase vor Einführung von Zeichenketten ist das auch völlig okay. Mit der Kenntnis des Datentyps "string" sollte man dann aber den Umstieg auf die Methode raw_input() vollziehen, denn die naive Vorstellung "input() nimmt man für Zahlen und raw_input() für Zeichenketten" ist weder sachlich richtig noch anzuraten.

Richtig ist, dass raw_input() grundsätzlich eine Zeichenkette zurückliefert. Die Eingabe, die input() entgegen nimmt wird hingegen vom Interpreter über die eval() Funktion ausgewertet und das heißt: Jede Eingabe, die einen gültigen Python-Ausdruck darstellt, wird direkt nach der Eingabe ausgewertet! Konkret: Mit ein paar tieferen Python-Kenntnissen kann man als Anwender eine Eingabe tätigen, die echten Schaden am System anrichten kann. Wie groß der Schaden sein kann, hängt von den Benutzerrechten ab. Ist man mit genügend Benutzerrechten ausgestattet, um z.B. die Festplatte zu formatieren, dann lässt sich das über eine mittels input() realisierte Anwendereingabe problemlos tun - wenn man weiß, wie es geht.

Zur Demonstration ein vergleichsweises harmloses Beispiel. Reagiert der Anwender auf eine Eingabeaufforderung mittels input() mit folgender Eingabe, dann löscht das ausführende Programm sich selbst von der Festplatte.
__import__("os").remove((__import__("sys").argv[0]))

Am besten also nur noch raw_input() verwenden. Wenn das Programm die Eingabe von Zahlen erwartet, dann müssen diese z.B. mittels int() oder float() umgewandelt werden. Sollen Ganzzahlen auch als solche identifiziert werden, dann kann das beispielsweise so aussehen:

eingabe = raw_input("Gib eine Zahl ein: ")
try:
    zahl = int(eingabe)
except ValueError:
    try:
        zahl = float(eingabe)
    except ValueError:
        zahl = None
if zahl is None:
    print "Das ist keine Zahl."
else:
    print "Das Doppelte der Zahl ist", 2*zahl

Python 3.x: Benutzereingaben verarbeiten

In Python 3.x wurde die Funktion raw_input() entfernt und durch input() ersetzt. Das heißt: Es gibt jetzt nur noch eine input()-Funktion, diese funktioniert aber genauso wie die Funktion raw_input() in Python 2.x.

Die - eher theoretische - Gefahr durch destruktive Benutzereingaben über das alte input() entfällt somit, das "Problem", Zahleneingaben des Benutzers unter Beibehaltung des Eingabetyps zu verarbeiten bleibt. Die Lösung entspricht exakt der oben gezeigten, man muss lediglich in der ersten Zeile raw_input() durch input() ersetzen und die print-Anweisung aus Python 2.x durch Setzen von Klammern in die print()-Funktion von Python 3.x umwandeln.

Letzte Aktualisierung: 10.01.2009