Eine minimale Einführung in Python für Studierende mit Programmiererfahrung die keinen Anspruch auf Vollständigkeit erhebt.
Ausführlichere Einführungen und Tutorials finden sich an zahlreichen Stellen im Internet. Beispielsweise
Um Jupyter (formals IPython) Notebooks interaktiv auf deinem Computer benutzen zu können, musst du zunächst ein paar Pakete installieren. Falls du Linux oder Mac OS benutzt und dich etwas auskennst, kannst du einfach deinen Paketmanager verwenden. Für diesen Kurs verwenden wir Python 3.5 mit den Paketen numpy
, scipy
und matplotlib
. Zusätzlich installiere bitte das jupyter
Paket um die interaktiven Notebooks nutzen zu können. Falls dir das zu viel Aufwand ist, gibt es den Anaconda Installer der alle nötigen Pakete mitbringt und auf allen gängigen Plattformen funktioniert. Eine ausführliche Anleitung dafür findet sich auf den Seiten des PeP et al. Toolbox Workshops.
Dieses interaktive Notebook enthält ausführbare Zellen. Um eine Zelle auszuführen, bringe sie in den Fokus (z.B. durch Anklicken) und drücke Strg+Enter.
In [1]:
print('Hello, world!')
Python hat ein dynamisches Typsystem, das bedeutet dass sich der Typ einer Variablen von Zuweisung zu Zuweisung ändern kann. Die eingebauten Typen von Python sind
NoneType
und sein einziger Wert None
bool
und seine Werte True
und False
int
z.B. 42
float
z.B. 3.1415
complex
z.B. 2+3j
string
z.B. 'Hallo, Welt!'
list
z.B. [1, 2, 3]
tuple
z.B. (1, 'a', 3.1415)
dict
, z.B. {'name': 'Hans', 'alter': 42}
set
, z.B. {1, 2, 3}
In [23]:
# Dies ist ein Kommentar :)
x = 1 # x ist ein int
print(x)
x = 'Hallo, Welt!' # x ist jetzt ein string
print(x)
y = 3.1415 # y is ein float
print(y)
z = [1, 'a', 2.7182] # z ist eine (heterogene) Liste mit drei Einträgen
# Auch wenn es vom Typsystem nicht gefordert wird,
# ist es eine gute Idee, Listen nur homogen zu befüllen.
z = [1, 2, 3]
print(z)
print(z[1])
print(z[0:-1]) # Mit Hilfe von "Slices" können wir Teile von Listen addressieren.
# Die Syntax ist dabei {Anfang}:{Ende}:{Schrittweite} wobei negative
# Indices vom Ende der Liste gezählt werden.
(a, b) = (100, 'Zaphod') # Tuple können benutzt werden, um Ausdrücke zu entpacken
# und so effektiv mehrere Variablen gleichzeitig zuzuweisen
# Die Klammern können dabei weggelassen werden
a, b = 42, 'Ford'
print(a)
print(b)
x = 'Die Antwort ist {}.'.format(a) # Strings lassen sich formatieren, so können die Inhalte
# von Variablen bequem ausgegeben werden.
print(x)
Jeder dieser Typen lässt sich in einem wahrheitswertigen Kontext verwenden. In einem solchen ist beispielsweise ein leerer String oder eine leere Liste gleichbedeutend mit False
.
In [3]:
not []
Out[3]:
Mit Hilfe von Operatoren lassen sich Typen verknüpfen. Für numerische Typen gibt es beispielsweise die arithmetischen Operatoren
+
Addition-
Subtraktion*
Multiplikation/
Division//
ganzzahlige Division%
Restwertbildung**
Potenzieren
In [4]:
a = 1.337
b = a * 5
c = b ** 10
c
Out[4]:
Eine vollständige Übersicht der Typen und verfügbaren Operationen findet sich in der offiziellen Dokumentation.
In [5]:
name = ''
if 5 == 3:
print('Irgendwas stimmt mit dem Universum nicht.')
elif name: # Hier wird die Wahrheitswertigkeit verwendet
print('Hallo, {}!'.format(name))
else: # Setze einen Namen ein, um nicht hier zu landen
print('Nun, das ist jetzt etwas peinlich…')
In [6]:
i = 0
while i < 5:
print(i)
i += 1
Eine for
-Schleife wie in C gibt es in Python nicht. Das for
-Schlüsselwort kommt immer in Begleitung seines Freundes in
; die beiden sind unzertrennlich. Damit lässt sich über Sequenzen iterieren.
In [7]:
names = ['Klaus', 'Dieter', 'Hans']
for name in names:
print('Hello {}'.format(name))
for i in range(5): # Praktisch, um Zahlenfolgen zu erzeugen.
print(i)
Das liest sich doch deutlich angenehmer als die while
-Schleife, oder? Falls du mal explizit die Indices einer Sequenz brauchst, hilft die enumerate
Funktion.
In [8]:
for index, name in enumerate(names):
print('Person {} heißt {}.'.format(index, name))
Mit print
, range
und enumerate
haben wir bereits Beispiele für Funktionen und die Aufrufsyntax gesehen. Um eigenen Funktionen zu definieren verwenden wir das def
Schlüsselwort. Außerdem geben wir der Funktion eine Beschreibung. Die Beschreibung ist zwar optional, kann aber immens zum Verständnis des Codes beitragen. Sie wird für die automatisch generierte Hilfe der Funktion verwendet. Sie sollte in Englisch sein um unseren Code portabel zu halten.
In [9]:
def square(x):
"""This function squares its input.
x - A value of a type that implements `**` (power).
"""
return x ** 2
print(square(4))
In [10]:
help(square)
Schau dir doch mal die Hilfe zu print
an und finde heraus, wie wir verhindern können, dass nach jedem Aufruf von print
eine neue Zeile begonnen wird. Passe dann die folgende Zelle so an, dass alle Zahlen durch Leerzeichen getrennt in der selben Zeile erscheinen.
In [11]:
for i in range(100):
print(i)
Funktionen können mehrere Argumente annehmen. Dabei wird zwischen Argumenten und Schlüsselwortargumenten unterschieden. Primitive Datentypen wie int
können als Schlüsselwortargument vordefiniert werden, da sie "by value" übergeben werden. Komplexere Datentypen wie zum Beispiel Listen werden als Referenzen übergeben was zur Folge hat, dass ein Standardwert innerhalb der Funktion verändert werden könnte. Deswegen wird i.d.R. das Verfahren aus dem untenstehenden Beispiel verwendet.
In [12]:
greetings = {
'English': 'Hello, {}!',
'Deutsch': 'Hallo, {}!',
'Francais': 'Salut, {}!',
'Espagnol': '¡Hola, {}!'
}
def greet(name, language=None):
if language is None: # So wird ein Standardwert für Sequenztypen definiert
language = 'English'
greeting = greetings.get(language)
if greeting is None:
print("Well, this is embarassing. I don't speak {}.".format(language))
else:
print(greeting.format(name))
greet('William')
greet('Wilhelm', language='Deutsch')
greet('Guillaume', 'Francais') # Wenn die Reihenfolge stimmt, kann das Schlüsselwort
# auch weggelassen werden.
greet('Guillermo', language='Espagnol')
greet('Guglielmo', language='Italiano')
In [13]:
[x ** 2 for x in range(10)]
Out[13]:
Auf die gleiche Art lassen sich auch Sequenzen filtern.
In [14]:
[x for x in range(10) if x % 2 != 0]
Out[14]:
Das Ganze lässt sich natürlich kombinieren und verschachteln.
In [15]:
odd_squares = [x ** 2 for x in range(10) if x % 2 == 1]
print(odd_squares)
nums = [z for z in [x + y for x in range(3) for y in range(3, 6)] if z < 6]
print(nums)
werden hier nur kurz angeschnitten. Der geneigte Leser wird angehalten eine der eingangs erwähnten Resourcen zu konsultieren.
Mit Hilfe des class
-Schlüsselwortes lassen sich eigene Typen definieren. Typen haben Methoden und Attribute, wie man es aus objektorientierten Sprachen kennt. Alle Methoden einer Klasse nehmen als erstes Argument eine Referenz auf das aktuelle Objekt namens self
an. Die geschulte C++-Programmiererin kann sich das als expliziten this
Zeiger vorstellen.
Python kommt "mit Batterien". Die Standardbibliothek bietet Funktionalität für eine ganze Bandbreite von Aufgaben bis hin zu einem Webserver. Es wird dringend empfohlen sich mit den folgenden Teilen vertraut zu machen:
zip
partial