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.
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.")
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
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.