2013-08-17 10:40:17 +00:00
---
2020-02-12 04:15:29 +00:00
language: Python
2013-08-17 10:40:17 +00:00
contributors:
- ["Louie Dinh", "http://ldinh.ca"]
2013-09-09 05:05:15 +00:00
translators:
2013-08-17 16:44:28 +00:00
- ["kultprok", "http:/www.kulturproktologie.de"]
2016-06-26 13:06:36 +00:00
- ["matthiaskern", "https://github.com/matthiaskern"]
2013-08-17 16:44:28 +00:00
filename: learnpython-de.py
lang: de-de
2013-08-17 10:40:17 +00:00
---
2013-08-17 16:44:05 +00:00
Anmerkungen des ursprünglichen Autors:
Python wurde in den frühen Neunzigern von Guido van Rossum entworfen. Es ist heute eine der beliebtesten Sprachen. Ich habe mich in Python wegen seiner syntaktischen Übersichtlichkeit verliebt. Eigentlich ist es ausführbarer Pseudocode.
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
Feedback ist herzlich willkommen! Ihr erreicht mich unter [@louiedinh ](http://twitter.com/louiedinh ) oder louiedinh [at] [google's email service].
2013-08-17 10:40:17 +00:00
2020-02-16 21:02:27 +00:00
Hinweis: Dieser Beitrag bezieht sich implizit auf Python 3. Falls du lieber Python 2.7 lernen möchtest, schau [hier ](http://learnxinyminutes.com/docs/pythonlegacy/ ) weiter. Beachte hierbei,
2020-02-16 23:24:53 +00:00
dass Python 2 als veraltet gilt und für neue Projekte nicht mehr verwendet werden sollte.
2013-08-17 10:40:17 +00:00
```python
2016-06-26 13:06:36 +00:00
2013-08-17 10:40:17 +00:00
# Einzeilige Kommentare beginnen mit einer Raute (Doppelkreuz)
2016-06-26 13:06:36 +00:00
""" Mehrzeilige Strings werden mit
2013-08-17 10:40:17 +00:00
drei '-Zeichen geschrieben und werden
oft als Kommentare genutzt.
"""
####################################################
## 1. Primitive Datentypen und Operatoren
####################################################
# Die Zahlen
3 #=> 3
2013-08-18 21:39:09 +00:00
# Mathematik funktioniert so, wie man das erwartet
2013-08-17 10:40:17 +00:00
1 + 1 #=> 2
8 - 1 #=> 7
10 * 2 #=> 20
2016-06-26 13:06:36 +00:00
# Außer Division, welche automatisch Gleitkommazahlen zurückgibt
35 / 5 # => 7.0
# Eine Division kann mit "//" für positive sowie negative Werte abgerundet werden.
5 // 3 # => 1
2020-02-14 23:00:05 +00:00
5.0 // 3.0 # => 1.0 # funktioniert auch mit floats
2016-06-26 13:06:36 +00:00
-5 // 3 # => -2
-5.0 // 3.0 # => -2.0
# Benutzt man eine Gleitkommazahl, ist auch das Ergebnis eine solche
3 * 2.0 # => 6.0
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Der Rest einer Division
7 % 3 # => 1
# Potenz
2**4 # => 16
2013-08-17 10:40:17 +00:00
# Rangfolge wird mit Klammern erzwungen
(1 + 3) * 2 #=> 8
2013-08-17 16:44:05 +00:00
# Boolesche Ausdrücke sind primitive Datentypen
2013-08-17 10:40:17 +00:00
True
False
# Mit not wird negiert
not True #=> False
not False #=> True
2016-06-26 13:06:36 +00:00
# Boolesche Operatoren
# Hinweis: "and" und "or" müssen klein geschrieben werden
True and False #=> False
False or True #=> True
# Für die Benutzung von Booleschen Operatoren und ganzen Zahlen
0 and 2 #=> 0
-5 or 0 #=> -5
0 == False #=> True
2 == True #=> False
1 == True #=> True
2013-08-17 10:40:17 +00:00
# Gleichheit ist ==
1 == 1 #=> True
2 == 1 #=> False
2013-08-18 21:39:09 +00:00
# Ungleichheit ist !=
2013-08-17 10:40:17 +00:00
1 != 1 #=> False
2 != 1 #=> True
# Ein paar weitere Vergleiche
1 < 10 # = > True
1 > 10 #=> False
2 < = 2 #=> True
2 >= 2 #=> True
2013-08-17 16:44:05 +00:00
# Vergleiche können verknüpft werden!
2013-08-17 10:40:17 +00:00
1 < 2 < 3 # = > True
2 < 3 < 2 # = > False
# Strings werden mit " oder ' gebildet
"Das ist ein String."
'Das ist auch ein String.'
2016-06-26 13:06:36 +00:00
# Strings können auch addiert werden! Vermeide dies aber lieber.
"Hallo " + "Welt!" #=> "Hallo Welt!"
# Strings können ohne "+" addiert werden
"Hallo " "welt!" # => "Hallo Welt!"
2013-08-17 10:40:17 +00:00
# Ein String kann wie eine Liste von Zeichen verwendet werden
"Das ist ein String"[0] #=> 'D'
2016-06-26 13:06:36 +00:00
# .format kann Strings formatieren
"{} können {} werden".format("Strings", "formatiert")
# Schneller geht das mit Wiederholungen
"{0} mag Spagetthi, {0} liebt es zu Schwimmen und ganz besonders mag {0} {1}".format("Hans", "Blattsalat")
#=> "Hans mag Spagetthi, Hans liebt es zu Schwimmen und ganz besonders mag Hans Blattsalat"
2013-08-17 10:40:17 +00:00
# None ist ein Objekt
None #=> None
2013-08-17 16:44:05 +00:00
# Verwendet nicht das Symbol für Gleichheit `==`, um Objekte mit None zu vergleichen
2016-06-26 13:06:36 +00:00
# Benutzt stattdessen `is`. Dieser Operator testet Objektidentität
2013-08-17 10:40:17 +00:00
"etc" is None #=> False
None is None #=> True
# None, 0, und leere Strings/Listen werden alle als False bewertet.
# Alle anderen Werte sind True
2016-06-26 13:06:36 +00:00
bool(0) # => False
bool("") # => False
bool([]) #=> False
bool({}) #=> False
2013-08-17 10:40:17 +00:00
####################################################
## 2. Variablen und Collections
####################################################
2013-08-18 21:39:09 +00:00
# Textausgabe ist sehr einfach
2017-09-22 20:41:13 +00:00
print("Ich bin Python. Schön, dich kennenzulernen!")
2013-08-17 10:40:17 +00:00
# Es gibt keinen Grund, Variablen vor der Zuweisung zu deklarieren.
some_var = 5 # kleinschreibung_mit_unterstrichen entspricht der Norm
some_var #=> 5
2018-06-24 16:10:33 +00:00
# Das Ansprechen einer noch nicht deklarierten Variable löst eine Exception aus.
2013-08-18 21:39:09 +00:00
# Unter "Kontrollstruktur" kann noch mehr über
# Ausnahmebehandlung erfahren werden.
2016-06-26 13:06:36 +00:00
some_unknown_var # Löst einen NameError aus
2013-08-17 10:40:17 +00:00
# Listen speichern Sequenzen
li = []
2013-08-17 16:44:05 +00:00
# Wir können mit einer bereits gefüllten Liste anfangen
2013-08-17 10:40:17 +00:00
other_li = [4, 5, 6]
2013-08-17 16:44:05 +00:00
# append fügt Daten am Ende der Liste ein
2013-08-17 10:40:17 +00:00
li.append(1) #li ist jetzt [1]
li.append(2) #li ist jetzt [1, 2]
li.append(4) #li ist jetzt [1, 2, 4]
li.append(3) #li ist jetzt [1, 2, 4, 3]
# Vom Ende der Liste mit pop entfernen
li.pop() #=> 3 und li ist jetzt [1, 2, 4]
2013-08-18 21:39:09 +00:00
# und dann wieder hinzufügen
2013-08-17 10:40:17 +00:00
li.append(3) # li ist jetzt wieder [1, 2, 4, 3].
# Greife auf Listen wie auf Arrays zu
li[0] #=> 1
# Das letzte Element ansehen
li[-1] #=> 3
2015-03-03 11:20:57 +00:00
# Bei Zugriffen außerhalb der Liste kommt es jedoch zu einem IndexError
2016-06-26 13:06:36 +00:00
li[4] # Verursacht einen IndexError
2013-08-17 10:40:17 +00:00
2013-08-17 16:44:05 +00:00
# Wir können uns Ranges mit Slice-Syntax ansehen
2013-08-17 10:40:17 +00:00
li[1:3] #=> [2, 4]
# Den Anfang auslassen
li[2:] #=> [4, 3]
# Das Ende auslassen
li[:3] #=> [1, 2, 4]
2016-06-26 13:06:36 +00:00
# Jeden Zweiten Eintrag auswählen
li[::2] # =>[1, 4]
# Eine umgekehrte Kopie zurückgeben
li[::-1] # => [3, 4, 2, 1]
# Jegliche Kombination dieser Syntax machen fortgeschrittene Slices möglich
# li[Start:Ende:Schritt]
2013-08-17 10:40:17 +00:00
# Ein bestimmtes Element mit del aus der Liste entfernen
del li[2] # li ist jetzt [1, 2, 3]
2013-08-17 16:44:05 +00:00
# Listen können addiert werden
2013-08-17 10:40:17 +00:00
li + other_li #=> [1, 2, 3, 4, 5, 6] - Hinweis: li und other_li werden in Ruhe gelassen
2013-08-17 16:44:05 +00:00
# Listen mit extend verknüpfen
2013-08-17 10:40:17 +00:00
li.extend(other_li) # Jetzt ist li [1, 2, 3, 4, 5, 6]
2013-08-17 16:44:05 +00:00
# Mit in auf Existenz eines Elements prüfen
2013-08-17 10:40:17 +00:00
1 in li #=> True
2013-08-17 16:44:05 +00:00
# Die Länge der Liste mit len ermitteln
2013-08-17 10:40:17 +00:00
len(li) #=> 6
2013-08-17 16:44:05 +00:00
# Tupel sind wie Listen, nur unveränderlich.
2013-08-17 10:40:17 +00:00
tup = (1, 2, 3)
tup[0] #=> 1
2013-08-17 16:44:05 +00:00
tup[0] = 3 # Löst einen TypeError aus
2013-08-17 10:40:17 +00:00
2013-08-17 16:44:05 +00:00
# Wir können all diese Listen-Dinge auch mit Tupeln anstellen
2013-08-17 10:40:17 +00:00
len(tup) #=> 3
tup + (4, 5, 6) #=> (1, 2, 3, 4, 5, 6)
tup[:2] #=> (1, 2)
2 in tup #=> True
2013-08-17 16:44:05 +00:00
# Wir können Tupel (oder Listen) in Variablen entpacken
2013-08-17 10:40:17 +00:00
a, b, c = (1, 2, 3) # a ist jetzt 1, b ist jetzt 2 und c ist jetzt 3
2015-03-03 11:20:57 +00:00
# Tupel werden standardmäßig erstellt, wenn wir uns die Klammern sparen
2013-08-17 10:40:17 +00:00
d, e, f = 4, 5, 6
2020-02-14 23:00:05 +00:00
# Es ist kinderleicht, zwei Werte zu tauschen
2018-06-24 16:10:33 +00:00
e, d = d, e # d ist nun 5 und e ist nun 4
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Dictionarys (Wörterbucher) speichern Schlüssel-Werte-Paare
2013-08-17 10:40:17 +00:00
empty_dict = {}
2013-08-17 16:44:05 +00:00
# Hier ein gefülltes Wörterbuch
2013-08-17 10:40:17 +00:00
filled_dict = {"one": 1, "two": 2, "three": 3}
2013-08-17 16:44:05 +00:00
# Wir können Einträge mit [] nachschlagen
2013-08-17 10:40:17 +00:00
filled_dict["one"] #=> 1
2013-08-17 16:44:05 +00:00
# So holen wir alle Keys (Schlüssel) als Liste
2016-06-26 13:06:36 +00:00
list(filled_dict.keys()) #=> ["three", "two", "one"]
2013-08-17 16:44:05 +00:00
# Hinweis - Die Reihenfolge von Schlüsseln in der Liste ist nicht garantiert.
# Einzelne Resultate können anders angeordnet sein.
2013-08-17 10:40:17 +00:00
# Alle Values (Werte) als Liste
2016-06-26 13:06:36 +00:00
list(filled_dict.values()) #=> [3, 2, 1]
2013-08-17 16:44:05 +00:00
# Hinweis - Hier gelten dieselben Einschränkungen für die Reihenfolge wie bei Schlüsseln.
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Das Vorhandensein eines Schlüssels im Wörterbuch mit "in" prüfen
2013-08-17 10:40:17 +00:00
"one" in filled_dict #=> True
1 in filled_dict #=> False
2013-08-17 16:44:05 +00:00
# Einen nicht vorhandenenen Schlüssel zu suchen, löst einen KeyError aus
2013-08-17 10:40:17 +00:00
filled_dict["four"] # KeyError
# Mit der get-Methode verhindern wir das
filled_dict.get("one") #=> 1
filled_dict.get("four") #=> None
2013-08-17 16:44:05 +00:00
# Die get-Methode unterstützt auch ein Standardargument, falls der Wert fehlt
2013-08-17 10:40:17 +00:00
filled_dict.get("one", 4) #=> 1
filled_dict.get("four", 4) #=> 4
2013-08-17 16:44:05 +00:00
# Die setdefault-Methode ist ein sicherer Weg, ein neues Schlüssel-Wert-Paar anzulegen
2013-08-17 10:40:17 +00:00
filled_dict.setdefault("five", 5) #filled_dict ["five"] wird auf 5 gesetzt
filled_dict.setdefault("five", 6) #filled_dict ["five"] ist noch immer 5
2016-06-26 13:06:36 +00:00
# Einträge zu einem Wörterbuch hinzufügen
filled_dict.update({"four":4}) #=> {"one": 1, "two": 2, "three": 3, "four": 4}
#filled_dict["four"] = 4 # noch ein Weg, Werte hinzuzufügen
# Schlüssel von einem Wörterbuch entfernen
del filled_dict["one"] # Entfert den Schlüssel "one"
2013-08-17 10:40:17 +00:00
# Sets speichern Mengen
empty_set = set()
# Initialisieren wir ein Set mit ein paar Werten
2016-06-26 13:06:36 +00:00
some_set = {1, 1, 2, 2, 3, 4} # some_set ist jetzt {1, 2, 3, 4}
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Neue Variablen können einer Menge gleichgesetzt werden
filled_set = some_set
2013-08-17 10:40:17 +00:00
2013-08-17 16:44:05 +00:00
# Mehr Elemente hinzufügen
2016-06-26 13:06:36 +00:00
filled_set.add(5) # filled_set ist jetzt {1, 2, 3, 4, 5}
2013-08-17 10:40:17 +00:00
# Schnittmengen werden mit & gebildet
other_set = {3, 4, 5, 6}
filled_set & other_set #=> {3, 4, 5}
# Mengen werden mit | vereinigt
filled_set | other_set #=> {1, 2, 3, 4, 5, 6}
# Die Differenz einer Menge mit - bilden
{1,2,3,4} - {2,3,5} #=> {1, 4}
2013-08-18 21:39:09 +00:00
# Auf Vorhandensein von Elementen mit in prüfen
2013-08-17 10:40:17 +00:00
2 in filled_set #=> True
10 in filled_set #=> False
####################################################
2016-06-26 13:06:36 +00:00
## 3. Kontrollstruktur und Iteratoren
2013-08-17 10:40:17 +00:00
####################################################
# Erstellen wir mal eine Variable
some_var = 5
2013-08-17 16:44:05 +00:00
# Hier eine if-Anweisung. Die Einrückung ist in Python wichtig!
2013-08-17 10:40:17 +00:00
# gibt "some_var ist kleiner als 10" aus
if some_var > 10:
2017-09-22 20:41:13 +00:00
print("some_var ist viel größer als 10.")
2013-08-17 10:40:17 +00:00
elif some_var < 10: # Dieser elif-Absatz ist optional .
2017-09-22 20:41:13 +00:00
print("some_var ist kleiner als 10.")
2013-08-17 10:40:17 +00:00
else: # Das hier ist auch optional.
2017-09-22 20:41:13 +00:00
print("some_var ist tatsächlich 10.")
2013-08-17 10:40:17 +00:00
"""
2013-08-17 16:44:05 +00:00
For-Schleifen iterieren über Listen
2013-08-17 10:40:17 +00:00
Ausgabe:
2013-08-17 16:44:05 +00:00
hund ist ein Säugetier
katze ist ein Säugetier
maus ist ein Säugetier
2013-08-17 10:40:17 +00:00
"""
for animal in ["hund", "katze", "maus"]:
2016-06-26 13:06:36 +00:00
# Wir können Strings mit format() formatieren
print("{} ist ein Säugetier".format(animal))
2013-08-17 10:40:17 +00:00
"""
`range(Zahl)` gibt eine null-basierte Liste bis zur angegebenen Zahl wieder
Ausgabe:
0
1
2
3
"""
for i in range(4):
2017-09-22 20:41:13 +00:00
print(i)
2016-06-26 13:06:36 +00:00
"""
"range(unten, oben)" gibt eine Liste von der unteren Zahl bis zur oberen Zahl aus
Ausgabe:
4
5
6
7
"""
for i in range(4, 8):
print(i)
2013-08-17 10:40:17 +00:00
"""
2013-08-17 16:44:05 +00:00
While-Schleifen laufen, bis eine Bedingung erfüllt ist.
2013-08-17 10:40:17 +00:00
Ausgabe:
0
1
2
3
"""
x = 0
while x < 4:
2017-09-22 20:41:13 +00:00
print(x)
2013-08-17 16:44:05 +00:00
x += 1 # Kurzform für x = x + 1
2013-08-17 10:40:17 +00:00
# Ausnahmebehandlung mit einem try/except-Block
try:
# Mit raise wird ein Fehler ausgegeben
raise IndexError("Das hier ist ein Index-Fehler")
except IndexError as e:
2013-08-17 16:44:05 +00:00
pass # Pass ist nur eine no-op. Normalerweise würden wir hier den Fehler klären.
2016-06-26 13:06:36 +00:00
except (TypeError, NameError):
pass # Mehrere Fehler können zusammen geklärt werden, falls erforderlich.
else: # Optional, hinter allen except-Blöcken
print("Keine Probleme!") # Wird nur ausgeführt, wenn keine Ausnahmen aufgetreten sind
finally: # Wird immer ausgeführt
print("Hier können wir Ressourcen aufräumen")
# alternativ zu einem try/finally Block um Aufzuräumen:
with open("meineDatei.txt") as f:
for line in f:
print(line)
# Python bietet ein fundamentales Konzept der Iteration.
2020-02-14 23:00:05 +00:00
# Das Objekt, auf das die Iteration, also die Wiederholung einer Methode
# angewandt wird, heißt auf Englisch "iterable".
2018-06-24 16:10:33 +00:00
# Die range Methode gibt ein solches Objekt aus.
2016-06-26 13:06:36 +00:00
filled_dict = {"one": 1, "two": 2, "three": 3}
our_iterable = filled_dict.keys()
print(our_iterable) #=> range(1,10). Dies ist ein "iterable" Objekt.
# Über dieses können wir auch iterieren
for i in our_iterable:
print(i) # Gibt one, two, three aus
2020-02-14 23:00:05 +00:00
# Allerdings können wir die einzelnen Elemente nicht mit ihrem Index ausgeben
2016-06-26 13:06:36 +00:00
our_iterable[1] # TypeError
# Ein iterable ist ein Objekt, das weiß wie es einen Iteratoren erschafft.
our_iterator = iter(our_iterable)
2013-08-17 10:40:17 +00:00
2020-02-14 23:00:05 +00:00
# Unser Iterator ist ein Objekt, das sich merkt, welchen Status es gerade hat
# während wir durch es gehen. Das jeweils nächste Objekt bekommen wir mit "next()"
2016-06-26 13:06:36 +00:00
next(our_iterator) #=> "one"
# Es hält den vorherigen Status
next(our_iterator) #=> "two"
next(our_iterator) #=> "three"
# Nachdem alle Daten ausgegeben worden sind, kommt eine StopIterator Ausnahme zurück
next(our_iterator) # Gibt StopIteration aus
# Alle Elemente können mit "list()" ausgegeben werden
list(filled_dict.keys()) #=> ["one", "two", "three"]
2013-08-17 10:40:17 +00:00
####################################################
## 4. Funktionen
####################################################
# Mit def neue Funktionen erstellen
def add(x, y):
2017-09-22 20:41:13 +00:00
print("x ist %s und y ist %s" % (x, y))
2013-08-17 16:44:05 +00:00
return x + y # Werte werden mit return zurückgegeben
2013-08-17 10:40:17 +00:00
# Funktionen mit Parametern aufrufen
2013-08-17 16:44:05 +00:00
add(5, 6) #=> Ausgabe ist "x ist 5 und y ist 6" und gibt 11 zurück
2013-08-17 10:40:17 +00:00
2013-08-17 16:44:05 +00:00
# Ein anderer Weg des Funktionsaufrufs sind Schlüsselwort-Argumente
add(y=6, x=5) # Schlüsselwörter können in beliebiger Reihenfolge übergeben werden.
2013-08-17 10:40:17 +00:00
2013-08-17 16:44:05 +00:00
# Wir können Funktionen mit beliebiger Anzahl von # Positionsargumenten definieren
2013-08-17 10:40:17 +00:00
def varargs(*args):
return args
varargs(1, 2, 3) #=> (1,2,3)
2013-08-17 16:44:05 +00:00
# Wir können auch Funktionen mit beliebiger Anzahl
# Schlüsselwort-Argumenten definieren
2013-08-17 10:40:17 +00:00
def keyword_args(**kwargs):
return kwargs
# Rufen wir es mal auf, um zu sehen, was passiert
keyword_args(big="foot", loch="ness") #=> {"big": "foot", "loch": "ness"}
2018-06-24 16:10:33 +00:00
# Wir können beides gleichzeitig machen, wenn wir wollen
2013-08-17 10:40:17 +00:00
def all_the_args(*args, **kwargs):
2017-09-22 20:41:13 +00:00
print(args)
print(kwargs)
2013-08-17 10:40:17 +00:00
"""
all_the_args(1, 2, a=3, b=4) Ausgabe:
(1, 2)
{"a": 3, "b": 4}
"""
2013-08-17 16:44:05 +00:00
# Beim Aufruf von Funktionen können wir das Gegenteil von varargs/kwargs machen!
# Wir benutzen dann *, um Tupel auszuweiten, und ** für kwargs.
2013-08-17 10:40:17 +00:00
args = (1, 2, 3, 4)
kwargs = {"a": 3, "b": 4}
2013-08-17 16:44:05 +00:00
all_the_args(*args) # äquivalent zu foo(1, 2, 3, 4)
all_the_args(**kwargs) # äquivalent zu foo(a=3, b=4)
all_the_args(*args, **kwargs) # äquivalent zu foo(1, 2, 3, 4, a=3, b=4)
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Anwendungsbereich von Funktionen
x = 5
def setX(num):
# lokale Variable x ist nicht die globale Variable x
x = num # => 43
print (x) # => 43
def setGlobalX(num):
global x
print (x) # => 5
x = num # globale Variable x ist jetzt 6
print (x) # => 6
setX(43)
setGlobalX(6)
2013-08-17 10:40:17 +00:00
# Python hat First-Class-Funktionen
def create_adder(x):
def adder(y):
return x + y
return adder
add_10 = create_adder(10)
add_10(3) #=> 13
# Es gibt auch anonyme Funktionen
(lambda x: x > 2)(3) #=> True
2013-08-17 16:44:05 +00:00
# Es gibt auch Funktionen höherer Ordnung als Built-Ins
2013-08-17 10:40:17 +00:00
map(add_10, [1,2,3]) #=> [11, 12, 13]
filter(lambda x: x > 5, [3, 4, 5, 6, 7]) #=> [6, 7]
2013-08-17 16:44:05 +00:00
# Wir können bei map- und filter-Funktionen auch List Comprehensions einsetzen
2013-08-17 10:40:17 +00:00
[add_10(i) for i in [1, 2, 3]] #=> [11, 12, 13]
[x for x in [3, 4, 5, 6, 7] if x > 5] #=> [6, 7]
####################################################
2016-06-26 13:06:36 +00:00
## 5. Klassen
2013-08-17 10:40:17 +00:00
####################################################
2016-06-26 13:06:36 +00:00
# Wir bilden die Unterklasse eines Objekts, um Klassen zu erhalten.
2013-08-17 10:40:17 +00:00
class Human(object):
# Ein Klassenattribut. Es wird von allen Instanzen einer Klasse geteilt
species = "H. sapiens"
2016-06-26 13:06:36 +00:00
# Ein simpler Konstruktor
2013-08-17 10:40:17 +00:00
def __init__ (self, name):
# Wir weisen das Argument name dem name-Attribut der Instanz zu
self.name = name
2016-06-26 13:06:36 +00:00
# Eine Instanzmethode. Alle Methoden erhalten self als erstes Argument.
2013-08-17 10:40:17 +00:00
def say(self, msg):
2016-06-26 13:06:36 +00:00
return "{name}: {message}".format(name=self.name, message=msg)
2019-04-06 18:18:14 +00:00
2013-08-17 10:40:17 +00:00
# Eine Klassenmethode wird von allen Instanzen geteilt.
# Sie werden mit der aufrufenden Klasse als erstem Argument aufgerufen
@classmethod
def get_species(cls):
return cls.species
# Eine statische Methode wird ohne Klasse oder Instanz aufgerufen
@staticmethod
def grunt():
return "*grunt*"
2016-06-26 13:06:36 +00:00
# Eine Instanz einer Klasse erstellen
i = Human(name="Ian")
2017-09-22 20:41:13 +00:00
print(i.say("hi")) # gibt "Ian: hi" aus
2016-06-26 13:06:36 +00:00
j = Human("Joel")
2017-09-22 20:41:13 +00:00
print(j.say("hello")) #gibt "Joel: hello" aus
2016-06-26 13:06:36 +00:00
# Rufen wir mal unsere Klassenmethode auf
i.get_species() #=> "H. sapiens"
# Ändern wir mal das gemeinsame Attribut
Human.species = "H. neanderthalensis"
i.get_species() #=> "H. neanderthalensis"
j.get_species() #=> "H. neanderthalensis"
# Aufruf der statischen Methode
Human.grunt() #=> "*grunt*"
2019-04-06 18:18:14 +00:00
####################################################
2016-06-26 13:06:36 +00:00
## 6. Module
2019-04-06 18:18:14 +00:00
####################################################
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Wir können Module importieren
import math
2019-02-06 01:56:25 +00:00
print(math.sqrt(16)) #=> 4.0
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Wir können auch nur spezielle Funktionen eines Moduls importieren
from math import ceil, floor
2017-09-22 20:41:13 +00:00
print(ceil(3.7)) #=> 4.0
print(floor(3.7)) #=> 3.0
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Wir können auch alle Funktionen eines Moduls importieren
# Warnung: Dies wird nicht empfohlen
from math import *
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Wir können Modulnamen abkürzen
import math as m
math.sqrt(16) == m.sqrt(16) #=> True
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
# Module sind in Python nur gewöhnliche Dateien. Wir
# können unsere eigenen schreiben und importieren. Der Name des
# Moduls ist der Dateiname.
# Wir können auch die Funktionen und Attribute eines
# Moduls herausfinden.
import math
dir(math)
2013-08-17 10:40:17 +00:00
####################################################
2016-06-26 13:06:36 +00:00
## 7. Fortgeschritten
####################################################
2020-02-14 23:00:05 +00:00
# Generatoren helfen, um Code schnell und einfach zu schreiben
2019-04-06 18:18:14 +00:00
def double_numbers(iterable):
for i in iterable:
yield i + i
2016-06-26 13:06:36 +00:00
# Ein Generator erschafft Werte spontan
# Statt alle Werte auf einmal, wird bei jeder Iteration einer erschaffen.
# iteration. Das heißt, Werte größer als 15 werden nicht behandelt.
# Die range-Methode ist auch ein Generator. Im Fall einer Liste von 1-900000000
# würde das sehr viel Zeit in Anspruch nehmen.
2020-02-14 23:00:05 +00:00
# Wenn wir eine Variable mit einem Namen erschaffen wollen, das
2016-06-26 13:06:36 +00:00
# normalerweise mit einem Python - Schlüsselwort kollidieren würde,
# benutzen wir einen Unterstrich nach dem Wort.
range_ = range(1, 900000000)
# Alle Nummern bis zu einem Ergebnis von >=30 werden verdoppelt
for i in double_numbers(range_):
2019-04-06 18:18:14 +00:00
print(i)
if i >= 30:
break
2016-06-26 13:06:36 +00:00
# Dekoratoren
# In diesem Beispiel die Methode beg umwickelt say
2020-02-14 23:00:05 +00:00
# Beim Aufruf von beg, wird say aufgerufen
2016-06-26 13:06:36 +00:00
# Falls say_please true ist, ändert sich die ausgegebene Nachricht
2019-04-06 18:18:14 +00:00
from functools import wraps
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
2019-04-06 18:18:14 +00:00
def beg(target_function):
@wraps (target_function)
def wrapper(*args, **kwargs):
msg, say_please = target_function(*args, **kwargs)
if say_please:
return "{} {}".format(msg, "Please! I am poor :(")
return msg
2013-08-17 10:40:17 +00:00
2019-04-06 18:18:14 +00:00
return wrapper
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
2019-04-06 18:18:14 +00:00
@beg
def say(say_please=False):
msg = "Can you buy me a beer?"
return msg, say_please
2013-08-17 10:40:17 +00:00
2016-06-26 13:06:36 +00:00
print(say()) # Can you buy me a beer?
2019-04-06 18:18:14 +00:00
print(say(say_please=True)) # Can you buy me a beer? Please! I am poor :(
2013-08-17 10:40:17 +00:00
```
## Lust auf mehr?
### Kostenlos online (Englisch)
2016-06-26 13:06:36 +00:00
* [Automate the Boring Stuff with Python ](https://automatetheboringstuff.com )
2013-08-17 10:40:17 +00:00
* [Learn Python The Hard Way ](http://learnpythonthehardway.org/book/ )
* [Dive Into Python ](http://www.diveintopython.net/ )
2016-06-26 13:06:36 +00:00
* [Ideas for Python Projects ](http://pythonpracticeprojects.com )
* [The Official Docs ](http://docs.python.org/3/ )
2013-08-17 10:40:17 +00:00
* [Hitchhiker's Guide to Python ](http://docs.python-guide.org/en/latest/ )
2016-06-26 13:06:36 +00:00
* [A Crash Course in Python for Scientists ](http://nbviewer.ipython.org/5920182 )
* [Python Course ](http://www.python-course.eu/index.php )
* [First Steps With Python ](https://realpython.com/learn/python-first-steps/ )
2013-08-17 10:40:17 +00:00
### Totholz (Englisch)
* [Programming Python ](http://www.amazon.com/gp/product/0596158106/ref=as_li_qf_sp_asin_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0596158106&linkCode=as2&tag=homebits04-20 )
* [Dive Into Python ](http://www.amazon.com/gp/product/1441413022/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1441413022&linkCode=as2&tag=homebits04-20 )
* [Python Essential Reference ](http://www.amazon.com/gp/product/0672329786/ref=as_li_tf_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=0672329786&linkCode=as2&tag=homebits04-20 )