Python Syntax

Hinweise zum Lesen:

- Nach dem Code-Block ist jeweils die Konsolen-Ausgabe sichtbar

1. Grundlagen

Grundrechenarten und Regeln

In [1]:
print(5 + 4) # Addition
print(5 - 4) # Subtraktion
print(5 * 4) # Multiplikation
print(5 / 4) # Division
print(5 ** 4)# Exponent
print(5 % 4) # Modulus/Remaider
print(5 // 4)# Integer division
print((5 + 4) *3) #Punkt vor Strich
9
1
20
1.25
625
1
1
27

Datentypen

Zahlen

Bei Zahlen wird zwischen Integers (ganzen Zahlen) und Floating-pint Numbers (Kommazahlen) oder kurz Floats unterschieden.

In [2]:
print(1) # Zahlen können ohne Markup eingefügt werden
print(1.5) # Kommata werden anstatt mit ',' mit einem '.' geschrieben
1
1.5

Strings (Zeichenketten)

Zeichen die zwischen Anführungszeichen stehen

In [3]:
print("Hallo Welt") #Einfacher String in Anführungszeichen
name ="Alex"  # Strings können in Variablen gespeichert werden
print(name)
Hallo Welt
Alex

Strings zusammenführen

Mehrere Strings können durch + oder Leerzeichen zusammengefügt werden

In [4]:
print("Mein Name ist Alex. " + "Wie ist dein Name?")
print("Mein Name ist Alex. "  "Wie ist dein Name?")
Mein Name ist Alex. Wie ist dein Name?
Mein Name ist Alex. Wie ist dein Name?

Strings replizieren

Strings können einfach repliziert werden.

In [5]:
print("Alex" * 5)
AlexAlexAlexAlexAlex

Strings kürzen

Strings können über [Zahl:Zahl] gekürzt werden. Wobei die Zahlen die zu überspringenden Zeichen angeben.

In [6]:
print("Hallo Welt!"[6:-1]) #Die ersten 0-6 Zeichen werden übersprungen
Welt

Bestimmte Zeichen eines Strings ausgeben

Einzelne String-Zeichen können mittel [Zahl] ausgegeben werden, wobei Zahl die gesuchte Position ist

In [7]:
print("Hallo Welt"[6]) # das 7. Zeichen wird ausgegeben
W

Boolean

Für Wahr oder Falsch werden die Booleans True und False ausgegeben

In [8]:
b = False
print(b)
False

Variablen

Variablen können benutzt werden, um Werte zuzuweisen und später einfach aufzurufen.
Für Variablen gelten drei Regeln:

  • nur ein Wort
  • nur Buchstaben, Zahlen und der Underscore (_)
  • darf nicht mit einer Zahl beginnen
In [9]:
a = 5         # Einfache Variable
print(a)
b = 5 + 6     # Zahlen können in Variablen verrechnet werden
print(b)
print(a + b)  # Variablen können verrechnet werden
5
11
16

Kommentare

Kommentare im Code erleichtern die Lesbarkeit und werden nicht ausgeführt. Dafür nutzt man #

In [10]:
# Dies ist ein Kommentar
# print("Hallo Welt")  Diese Zeile wird nicht ausgeführt
print("Hello Welt")  # Diese Zeile wird ausgeführt
Hello Welt

Grundfunktionen

Python liefert einige Grundfunktionen.

Print() - Funktion

Mit der print()-Funktion können Ausgaben über die Konsole getätigt werden. Die erforderliche Ausgabe wird in den Klammern () getätigt. Für Funktionen die in dieser Klammer ausgeführt werden, wird nur das Ergebnis ausgegeben.

In [11]:
print("dies ist ein String")
print(1) # eine Zahl
print(1 + 2) # eine Rechnung in der Print()-Funktion
dies ist ein String
1
3

input Function

Mithilfe der input() Funktion können Eingaben über die Konsole an das Programm übergeben werden. Die Eingabe kann in einer Variable gespeichert werden.

In [12]:
print('Wie ist dein Name?')   # ask for their name
myName = input() # eine Zeile mit Eingabe wird geöffnet
print('Hallo {}'.format(myName))
Wie ist dein Name?
Alex
Hallo Alex

len Function

Berechnet die Länge eines Strings als Integer

In [13]:
len('hello')
Out[13]:
5

Strings aus einer Liste zu einem String zusammenfügen

join()-Befehl auf einen String: string.join(liste)

In [14]:
students = ["Alex", "Bob", "Cedric", "Erika"]
print(", ".join(students))
Alex, Bob, Cedric, Erika

2. Datenstrukturen

  • Listen: Geordnete Auflistung von Elementen. Bsp: liste = ["Hallo", "Welt"]
  • Dictionaries: Zuordnung von Schlüssel zu Wert. Bsp: d = {"Hallo": 5, "Welt": 4}
  • Tupel: Geordnete Auflistung von Elementen, jedoch unveränderlich
  • Set: Ungeordnete Sammlung von Elementen, deren Elemente innerhalb nur einmal vorkommen dürfen
  • Queue: Ähnlich wie Liste, sind Elemente sortiert und werden in Reihenfolge der Eingabe ausgegeben
  • PriorityQueue (Prioritätswarteschlange): Automatische Sortierung der Elemente

Listen

Listen können mehrere Elemente enthalten und sind veränderliche Datenstruktur.
Listenname = ["Element1", Element2", ... ]

  • Kann nachträglich erweitert werden
  • Reihenfolge wird beibehalten
  • Elemente dürfen mehrfach vorkommen
In [15]:
students = ["Alex", "Bob", "Cedric", "Erika"]
print(students)
['Alex', 'Bob', 'Cedric', 'Erika']

Element aus Liste auswählen

Elemente einer Liste sind aufsteigend von 0 an nummeriert.
Per Index kann ein einzelnes Element über seine Listenposition angewählt werden: Listenname[Position]

In [16]:
print(students[0])
Alex

Über eine negative Positionsnummer kann die Liste vom Ende zum Anfang ausgelesen werden. Die Ausgabe ist wieder in Reihenfolge der orginalen Liste

In [17]:
print(students[-1])
Erika

Liste Trennen

Eine Liste kann auch aufgeteilt (gesliced) werden. Hierfür wird Zahl:Zahl. Wobei die Zahlen die zu überspringenden Indexe angeben.

In [18]:
print(students[2:4])
print(students[1:-1]) #auch hier können negative Positionen benutzt werden
print(students[1:]) # mit auslassen einer Zahl wird die Liste bis zum Ende ausgeführt
['Cedric', 'Erika']
['Bob', 'Cedric']
['Bob', 'Cedric', 'Erika']

Element einer Liste anhängen

über append() kann ein Element an das Ende einer Liste hinzugefügt werden

In [19]:
students.append("Franz")
print(students)
['Alex', 'Bob', 'Cedric', 'Erika', 'Franz']

ebenso mit + können weitere Elemente hinzugefügt werden

In [20]:
students = ["Alex", "Bob", "Cedric", "Erika"] + ["Ferdinand"]
print(students)
['Alex', 'Bob', 'Cedric', 'Erika', 'Ferdinand']

Elemente aus Liste entfernen

mit del kann ein bestimmtes Element anhand der Position aus einer Liste entfernt werden

In [21]:
del students[3]
print(students)
['Alex', 'Bob', 'Cedric', 'Ferdinand']

mit remove kann ein bestimmtes Element anhand des Strings aus einer Liste entfernt werden

In [22]:
students.remove("Alex")
print(students)
['Bob', 'Cedric', 'Ferdinand']

über .pop() kann das letzte Element aus der Liste entfernt werden

In [23]:
x = students.pop() #aus Students wird das letzte Element entfernt
print(students) #restliche Liste
print(x)  #entferntes Element
['Bob', 'Cedric']
Ferdinand

List Comprehension

Einfache Umwandlung bzw Neuerstellung einer Liste. Beachte, dass die Variablen ungleich der Listennamen vergeben werden müssen!

In [24]:
xs = [1,2,3,4]
ys = [x * x for x in xs] # für jeden Wert in xs wird das Quadrat in ys gespeichert
print(xs)
print(ys)
[1, 2, 3, 4]
[1, 4, 9, 16]
In [25]:
students = ["Alex", "Bob", "Cedric", "Erika", "Ferdinand"]
lengths = [len(student) for student in students] 
#für jede Länge eines Studentennames wird das Ergebnis in "lenghts" gespeichert
print(lengths)
[4, 3, 6, 5, 9]
In [26]:
#Zu viele Zeilen!
xs = []
for x in range(0,10):
    xs.append(x/10)
print(xs)

#einfacher:
xs = [x/10 for x in range(0,10)]
print(xs)
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
[0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]

Listen verschachteln

Listen können ineinander verschachtelt werden um z.B. eine Matrix zu modellieren.
[[Liste1],[Liste2]]
Beachte, dass verschachtelte Listen mit einem Kommata getrennt werden.

In [27]:
liste = [
    ["Element1", "Element2", "Element3"],
    ["Element4", "Element5", "Element6"]
]
print(liste[0][2])
print(liste[1][1])
Element3
Element5

Dictionaries

Die Verknüpfung verschiedener Strings und Listen wird mit Dictionaries erfolgen.

  • Speichert eine Zuordnung von einem Schlüssel (key) zu einem Wert (value)
  • Reihenfolge wird nicht beibehalten
  • Werte dürfen mehrfach vorkommen
  • Jeder Schlüssel darf aber nur 1x existieren
In [28]:
d = {"Berlin":"BER", "Helsinki":"Hel", "Barcelona":"BAC"} # Aufbau eines Dictionaries
print(d) # Ausgabe des gesamten Dictionaries
print(d["Helsinki"]) # Ausgabe der Wertzuweisung für den Schlüssel "Helsinki"
print(d.get("Helsinki")) # vermeidet Fehler falls Schlüssel nicht im Dictionarie enthalten
print(d.get("Budapest")) # Beispiel für nicht-existenz
print(d.items())  # Ausgabe des Dictionaries als Liste mit Tupel
{'Berlin': 'BER', 'Helsinki': 'Hel', 'Barcelona': 'BAC'}
Hel
Hel
None
dict_items([('Berlin', 'BER'), ('Helsinki', 'Hel'), ('Barcelona', 'BAC')])

Dictionaries kann jedem Element/Schlüssel auch eine Definition zugewiesen werden

In [29]:
for key, wert in d.items():

    print(key + " : " + wert)  
Berlin : BER
Helsinki : Hel
Barcelona : BAC

Listen in Dictionaries

In [30]:
staedte = {
    "München": ["MUC", "Bayern"],
    "Berlin": ["BER", "Berlin"]
}

print(staedte["Berlin"])
['BER', 'Berlin']

Tupel

Ähnlich zu Listen, jedoch unveränderliche Datenstruktur (nicht erweiterbar).

In [31]:
t = (1, 2, 3) # ein Tupel wird mit runden Klammern gebildet

print(t)      # abrufen des gesamten Tupel

print(t[1])   # abrufen eines bestimmten Tupel-Elements
(1, 2, 3)
2

Tupel definieren

Der Inhalt eines Tupels kann durch Variablen definiert und zugewiesen werden. Erleichtert den Zugriff und das Entpacken

In [32]:
student = ("Max Mustermann", 20, "Maschinenbau") # Tupel bilden
name, alter, fach = student # Tupel entpacken und Definition zuweisen
print(fach)   # Information aus Tupel anhand der Definition entpacken
Maschinenbau

Eine Liste mit Tupel

In [33]:
students = [
    ("Max", 20), # Komma zwischen Tupel nicht vergessen!
    ("Alex", 30)
]

for name, alter in students: # Definitionen zuweisen 
    print(name)
Max
Alex

Set

Ungeordnete Sammlung von Elementen, deren Elemente innerhalb nur einmal vorkommen dürfen.

- Kann nachträglich erweitert werden
- Reihenfolge wird nicht beibehalten
- Index - Schreibweise s[15] wird nicht unterstützt
- Jedes Element kommt nur 1x vor
In [34]:
s = ["Hallo", "Welt"]
print(s)
s.append("Mars")
print(s)
['Hallo', 'Welt']
['Hallo', 'Welt', 'Mars']
In [35]:
if "Mars" in s:
    print("Mars ist im Set")
Mars ist im Set

Queue

Ähnlich wie Liste, sind Elemente sortiert und werden in Reihenfolge der Eingabe ausgegeben

In [36]:
import queue
q = queue.Queue()     # Queue erstellen

q.put("Hallo")        # Elemente einfügen
q.put("Welt")

print(q)
print(q.get())        # Element ausgeben
print(q.get())

q.empty()             # überprüfen ob Queue leer ist
<queue.Queue object at 0x0000025AEDBD8780>
Hallo
Welt
Out[36]:
True

PriorityQueue

Ähnlich wie Queue. Elemente werden mit unterschiedlicher "Dringlichkeit" eingegeben und nach "Dringlichkeit" ausgegeben. Automatische Sortierung der Elemente nach "Dringlichkeit".

- Optimierte Datenstruktur, um Elemente nach einer Priorität zu sortieren
- Elemente werden quasi automatisch nach ihrer Priorität sortiert
- Direkter Zugriff auf die Elemente nicht möglich
- Man kann nur auf das erste Element zugreifen, bzw. das erste Element entfernen
In [37]:
import queue
q = queue.PriorityQueue()    #PriotityQueue erstellen

q.put((10, "Hallo Welt"))    # Elemente mit Priorität einfügen
q.put((5, "Wichtig"))
q.put((15, "Mars"))

print(q.get())                      # Element von kleinster nach größter Priorität ausgeben
q.get()
(5, 'Wichtig')
Out[37]:
(10, 'Hallo Welt')

3. Daten(-strukturen umwandeln

Einen String in eine Ganzzahl umwandeln

int()-Befehl auf einen String: int(string)

In [38]:
a = int("5")
print(a)
5

Einen String in eine Kommazahl umwandeln

float()-Befehl auf einen String: float(string)

In [39]:
a = float("5.5")
print(a)
5.5

Eine Zahl in einen String umwandeln

str()-Befehl auf eine Ganzzahl oder Kommazahl: str(zahl)

In [40]:
age = str(21)
print(age)
21

Einen String in eine Liste aufspalten

split()-Befehl auf einen String: string.split()

In [41]:
students = "Alex, Bob, Cedric, Erika"
print(students.split()) # Kommata werden übernommen
print(students.split(", ")) # Kommata werden ausgelassen
['Alex,', 'Bob,', 'Cedric,', 'Erika']
['Alex', 'Bob', 'Cedric', 'Erika']

4. Operatoren & Gatter

Vergleichoperatoren

Verschiedene Operatoren zum Vergleichen von Variablen/Zahlen

  • a == b Werte sind gleich
  • a != b Werte sind ungleich
  • a < b Wert b ist größer als Wert a
  • a > b Wert a ist größer als Wert b
  • a <= b Wert b ist größer-gleich Wert a
  • a >= b Wert a ist größer-gleich Wert a Die Ausgabe über print() gibt die Booleans True(Wahr) oder False(Falsch) aus
In [42]:
a = 5
b = 6
print(a == b)  # Gleichheit
print(a != b)  # Ungleichheit
print(a < b)   # kleiner als
print(a > b)   # größer als
print(a <= b)  # kleiner-gleich als
print(a >= b)  # größer-gleich als
print( "Hallo" == "World") # auch Strings können verglichen werden
print(True is True) # für Boolean Werte keine '='-Zeichen benutzen!
print(True is not True) # Boolean werden mit 'is' und 'is not' abgefragt
False
True
True
False
True
False
False
True
False

Gatter

In [43]:
# Für and müssen beide Variablen den gleichen Wert annehmen
print(True and True)
print(True and False)
print(False and True)
print(False and False)
True
False
False
False
In [44]:
# Für or muss eine der Variablen True annehmen
print(True or True)
print(True or False)
print(False or True)
print(False or False)
True
True
True
False
In [45]:
# 'not' Gatter negieren Ihr Ergebnis
print(not True)
print(not False)
False
True

Der in-Operator

mit in-Operatoren kann man überprüfen, ob ein Element in einem anderen Element enthalten ist

der in-Operator mit Listen:

In [46]:
students = ["Alex", "Bob", "Cedric", "Erika"]
print("Monika" in students) # Monika ist nicht in der Liste
print("Bob" in students) # Bob ist in der Liste
False
True

der in-Operator mit Strings

In [47]:
satz ="Ja dieser Text ist ein String!"
print("Ja" in satz) # "Ja" ist in dem String enthalten 
True

Der not-Operator

Der not-Operator negiert das Ergebnis bzw. die Abfrage.

Beachte, dass der not-Operator vor und nach der Variable kommen kann

In [48]:
print( not 5 == 5) # Das Erbgenis von "5 == 5" ist wahr, "not" negiert das Ergebnis

# Es können auch Listen abgefragt werden:
names = ["Andreas", "Bertold"]
print("Alex" not in names)
False
True

Mehr Operatoren

In [49]:
i = 5
print(i)
i += 1  # Mit += kann die Variable mit den nachstehenden Wert addiert und in i gespeichert werden
print(i)
i -= 1  # Mit -= kann die Variable mit den nachstehenden Wert subtrahiert und in i gespeichert werden
print(i)
5
6
5

5. Schleifen

if-else-Struktur

Ausführen bestimmter Abschnitte nur bei bestimmter Bedingung in if-else-Struktur. if fordert eine Bedingung, wird diese Bedingung erfüllt wird der eingrückte nachstehende Code ausgeführt. else wird ausgeführt, wenn die Bedingung nicht erfüllt wird

Jeder Codeblock wird nur einmal ausgeführt. Beachte die Einrückung für den Codeabschnitt!

if Bedingung:
      Auszuführender_Code
else:
      Sonst-Auszuführender_Code

In [50]:
x = 5
if x < 10:
    print("x ist kleiner als 10")
else:
    print("x ist größer als 9")
print("Ich bin nicht mehr Eingerückt")
x ist kleiner als 10
Ich bin nicht mehr Eingerückt

Müssen mehr als zwei if-else Fälle abgefragt werden, nutzt man elif nächste_Bedinung: als Kurzfassung.

In [51]:
x = 5
if x == 8:
    print("x ist 8")
elif x==7:
    print("x ist 7")
elif x==6:
    print("x ist 6")
elif x==5:
    print("x ist 5")
else:
    print("x ist nicht zwischen 4 und 9")
x ist 5

for-Schleife

Die for-Schleife durchläuft eine anzugebende Sequenz

In [52]:
# Das Funktioniert sowohl mit Zahlen als auch Strings
liste = [1, 2, 5]
for i in liste:
    print(i)
    
liste = ["Max", "Mustermann", "Michael"]
for i in liste:
    print(i)
1
2
5
Max
Mustermann
Michael

Das range-Objekt wird dazu genutzt, die Sequenzlänge vorzugeben. D.h. wie oft die Schleife durchlaufen werden soll.

In [53]:
for i in range(0, 5): # von 0 bis 4 werden alle Zahlen ausgegeben
    print(i)
0
1
2
3
4

while-Schleife

while-Schleifen führen einen Code-Block mehrmals hintereinander aus, bis eine Abbruchbedingung erfüllt ist. Innerhalb einer while-Schleife muss ein Zustand verändert werden, damit das Programm die Schleife auch wieder verlassen kann!

In [54]:
zähler = 0
while zähler < 3:
    print(zähler)
    zähler += 1
0
1
2

Continue & Break

Während eines Schleifendurchlaufs kann der man vorzeitig abbrechen und mit dem nächsten Schleifendurchlauf fortfahren (continue) oder die gesamte Schleife abbrechen (break).

In [55]:
for i in range(0, 4):
    if i == 2:
        continue  # anstatt print(2) auszuführen wird 2 übersprungen und mit dem nächsten Durchlauf fortgesetzt
    print(i)
0
1
3
In [56]:
for i in range(0, 4):
    if i == 2:
        break  # an dieser Stelle wird die Schleife abgebrochen und nicht weiter ausgeführt 
    print(i)
0
1

6. Funktionen

Funktionen sind t´zusammengefasste Codeblöcke. Mittels Funktionen vermeidet man mehrmals verwendete Codeblöcke. Eine Funktion kann merhmals im Programm aufgerufen werden, nachdem sie definiert wurde.
Beachte, der Funktion oder ihren Variablen keine Dopplungen aus deinem Code zu geben!

Funktionen definieren und Aufrufen

def Funktionname():
      Code

In [57]:
def print_more():    # Das Definieren der Funktion
    print("hi")
    print("there")
    
print_more()    # Das Aufrufen der Funktion mit ihrem Funktionsnamen()
hi
there

Funktionen können auch mit einem oder mehreren Argumenten arbeiten

def Funktionname(Argument):
      Code

In [58]:
def print_name(name): # hier wird in Klammern ein Argument übergeben, ein Argument kann frei definiert werden
    print("Hallo mein Name ist " + name + ".") #das Argument wird mit Argument-Namen übernommen und kann verwendet werden

print_name("Hans")
Hallo mein Name ist Hans.
In [59]:
def print_more(name, count):
    for i in range(0, count):
        print(name)
        
print_more("Hallo!", 3)
Hallo!
Hallo!
Hallo!

Ineinander verschachtelte Funktionen sind auch möglich

In [60]:
def print_name(name):
    print("Hallo mein Name ist " + name + ".")
def print_alter(alter):
    print("Ich bin " + str(alter) + " Jahre alt.")

def NameUndAlter(name, alter):
    print_name(name)
    print_alter(alter)

NameUndAlter("Hans", 23)
Hallo mein Name ist Hans.
Ich bin 23 Jahre alt.

Werte zurückgeben mit 'return'

Mit dem Befehl return können Werte aus einer Funktion zurückgegeben werden. Funktionen mit return können wie Variablen behandelt werden.

In [61]:
def return_element(name):
    return name

print(return_element("Hi"))
Hi

Mehr Funktionen

Neben selbst erstellten Funktionen bietet Python selbst vordefinierte Funktionen, diese findet man hier.

7. Dateien

Einfaches öffnen und schließen von Dateien kann mit open() und close() realisiert werden.
Mit dem with-Konstruktor müssen geöffnete Dateien danach nicht mit der close() -Methode geschlossen werden.

open("dateiname", "operator")
       write.CodeMitDatei
close()

with open("dateiname.dateiendung", "operator") as dateiname_in_funktion:
       Code

Mögliche Dateien sind .txt, .csv (comma seperated values), ...

Textdateien schreiben

Zum schreiben einer neuen Datei nutzt man den Operator w (write)
Soll nichts überschrieben werden oder Text angehängt werden nutzt man den Operator a (append)

In [62]:
file = open("test.txt", "w")
file.write("Diese Datei wurde mit Phyton geschrieben. \n")
file.close()

Textdateien lesen und Inhalt ausgeben

Zum lesen einer Datei nutzen wir den Operator "r" (read)

In [63]:
file = open("test.txt", "r")
for line in file:  # Alle Zeilen nacheinander auslesen
    print(line.strip()) #eine Zeile ohne Zeilenumbruch ausgeben
file.close()
Diese Datei wurde mit Phyton geschrieben.

Zeichen aus Datei entfernen

das Entfernen bestimmter Zeichen ist mit Python einfach realisierbar. Es wurde schon im oberen Beispiel gezeigt:
.strip entfernt Sonderzeichen wie z.B. \n (Zeilenumbruch)

8. Module

Mit Modulen können Funktionen und Rechnungen aus anderen Python-Programmen in einem anderen Wiederbenutzt werden.
Dafür erstellt man erst ein Python-Programm (Datei mit .py-Endung). Diese wird über den import-Befehl geladen.

In [64]:
# Das 'hallo.py' Programm:
def welt():
    print("Hallo Welt")
welt()
Hallo Welt
In [65]:
import hallo # die Datei hallo.py wird in das aktuelle Programm eingebunden
hallo.welt() # die Funktion welt() im hallo.py-Programm wird in unserem aktuellen Skript ausgeführt
Hallo Welt
In [66]:
from hallo import welt # damit wird explizit nur die Funktion 'welt()' in das aktuelle Programm geladen, jede weitere mit ',' getrennt
welt() # die Funktion kann damit direkt benutzt werden
# Achte auf Dopplungen von Funktionsnamen in unterschiedlichen Programmen!
Hallo Welt
In [67]:
from hallo import * # mit dem '*' werden alle Funktionen aus 'hallo.py' in das aktuelle Programm geladen
welt() 
Hallo Welt
In [68]:
import hallo as h # mit der 'as'-Methode wird zum Aufrufen eines Programms im Skript ein 'Ersatzname' genutzt
h.welt() # diese Variante kann lange Programmnamen abkürzen
Hallo Welt

Modulordner definieren und strukturieren

Um viele Programme und Module strukturiert zu halten ist es oft praktisch diese in einem extra Ordner zu speichern. Hierbei ist es vorteilhaft eine Modul-Datei mit der Auflistung aller möglichen Programme zu führen.

In [69]:
# Modul-Datei: __init__.py
__all__ = ["datei"] # all Beschreibt alle Module, "datei" ist ein Programm namens 'datei.py' im Modulordner
In [70]:
# hier wird der Vorteil der Modul-Datei gezeigt
from ordner import * # alle Funktionen aus dem Ordner 'ordner' werden geladen
datei.f()
datei.py - Funktion f()

Module importieren

für zusätzliche Funktionen können externe bzw. fertige Module in Python importiert werden.
Den Python-Modul-Indes findet man hier: https://docs.python.org/3/py-modindex.html
Einige der wichtigsten Module werden folgend vorgestellt

Mathe plotten

mit der Bibliothek für Matheplotter (mathplotlib.pyplot) können Funktionen und Zahlen Grafisch visualisiert werden.

In [71]:
%matplotlib inline 
import matplotlib.pyplot as plt # hier wird das Matplolib-Modul importiert und mit der Variable plt verknüpft
plt.scatter([1, 2 , 3], [4, 3, 2])  # plt. kann dann für das Modul benutzt werden
plt.show()

Programm Beenden/Abbrechen

Mit sys.exit (muss importiert werden) kann ein laufendes Programm vorzeitig abgebrochen werden.

In [72]:
import sys
#sys.exit() (Bei Anwendung hier kann der weitere Verlauf nicht umgesetzt werden)

Programm pausieren

Manchmal ist es notwenig das Programm pausieren zu lassen (Bsp Crawler auf Webseite). Dafür nutzt man das Modul time

In [73]:
import time     # Time-Modul importieren
time.sleep(1)   # '1'-Sekunde Programmpause

Webseiten runterladen

Mit einem request kann eine bestimmte Webseite heruntergeladen und der HTML-Code ausgegeben werden (http://docs.python-requests.org/en/master/).

In [74]:
import requests
r = requests.get("http://www.google.de")

print(r.status_code)
200

Elemente in HTML finden

Aus html-Dateien kann man mit BeautifulSoup (https://www.crummy.com/software/BeautifulSoup/bs4/doc/) Informationen zerlegen und extrahieren.

In [75]:
from bs4 import BeautifulSoup      # BeautifulSoup importieren

# Beispiel HTML-Datei 
htmlDatei = """ 
    <html>
        <body>
            <p class="something">Ich bin ein Absatz!</p>
            <p>Ich bin noch ein Absatz</p>
        </body>
    </html>
"""

doc = BeautifulSoup(htmlDatei, "html.parser") # HTML-Datei mit BeautifulSoup Parsen/Einlesen

for p in doc.find_all("p"):   # im Dokument alle <p>-Konstruktoren finden
    print(p.attrs)            # für alle <p> dessen Attribute ausgeben
    print(p.text)             # für alle <p> dessen Text ausgeben
{'class': ['something']}
Ich bin ein Absatz!
{}
Ich bin noch ein Absatz

relative URLs

Einige Elemente (z.B. Bilder) sind auf Webseiten nur relativ zu Ihrer Webseite verlinkt. Beim Crawlen kann der gesamte Bildpfad mit urljoin hergestellt werden.

In [76]:
from urllib.parse import urljoin   # urljoin importieren
from bs4 import BeautifulSoup      # BeautifulSoup importieren

url = "http://python.beispiel.programmierenlernen.io/index.php" #Webseiten-URL die durchsucht wurde

r = requests.get(url)
doc = BeautifulSoup(r.text, "html.parser") # HTML-Datei mit BeautifulSoup Parsen/Einlesen
    
for card in doc.select(".card"):
    image = card.select_one("img").attrs["src"]
    imageURL = urljoin(url, image)
    print("relative URL: " + image + " gesamte URL: " + imageURL)
relative URL: ./img/1.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/1.jpg
relative URL: ./img/2.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/2.jpg
relative URL: ./img/3.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/3.jpg
relative URL: ./img/4.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/4.jpg
relative URL: ./img/5.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/5.jpg
relative URL: ./img/6.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/6.jpg
relative URL: ./img/7.jpg gesamte URL: http://python.beispiel.programmierenlernen.io/img/7.jpg

9. Generatoren

Generatoren erzeugen Listen (meist aus Crawlern) die viele Einträge enthält. Aus dieser Liste können eine bestimmte Anzahl an Einträgen ausgegeben werden. Die .fetch()-Methode erkennt dies dadurch automatisch.

In [77]:
def gen_generator():
    for i in range(0, 3):
        print("gen: " + str(i))
        yield i

for element in gen_generator():      # Alle Elemente der Liste ausgeben
    print("for: " + str(element))

print("####")

for element in gen_generator():      # die ersten 2 Elemente ausgeben
    if element == 1:
        break
    print("for: " + str(element))
gen: 0
for: 0
gen: 1
for: 1
gen: 2
for: 2
####
gen: 0
for: 0
gen: 1

10. Objektorientierung

Klassen sind Baupläne für Objekte. Die erzeugten Objekte nennt man Instanzen dieser Klasse.

In [78]:
class Student():               # Klasse Student erstellen, Klassennamen beginnen gemäß Konvention mit Großbuchstaben
    pass                       # Leere Klasse zulassen

erik = Student()               # Instanz erzeugen
erik.firstname = "Erik"        # zwei Variablen für das Objekt,
erik.lastname = "Mustermann"   # auf díe über das Objekt per Punktschreibweise zugegriffen werden kann

print(erik.firstname)          
Erik
In [79]:
class Student():                      
    def __init__(self, firstname, lastname): # durch Definition der Variablen mittel einer Methode
        self.firstname = firstname           # können Instanzen einfach hinzugefügt werden
        self.lastname = lastname

monika = Student("Monika", "Mueller") # Kurzschreibweise für Instanz

print(monika.lastname)
Mueller

Methoden und Definitionen können innerhalb von Objekten gebildet werden um Namensübertretungen zu verhindern bzw. innerhalb eines Objekts alle Namenskonventionen festzuhalten.
self ist ein Schlüsselwort, es fungiert gewissermassen als Platzhalter für die jeweilige Instanz

In [80]:
class Student():
    def name(self): # ein Konstruktor, der eine Funktion für das Objekt definiert
        print(self.firstname + " " + self.lastname)

erik = Student()              
erik.firstname = "Erik"       
erik.lastname = "Mustermann"
erik.name()     
Erik Mustermann
In [81]:
class Student():
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname
        self.term = 1 # Hier initialisiert die neue Variable term (Eigenschaft)
        
    def increase_term(self): # Mit dieser Methode erhöht die Variable term um 1
        self.term = self.term + 1
    
    def name(self): # name() gibt Name und Anzahl der Semester aus
        print(self.firstname + " " + self.lastname + 
              " (Semester: " + str(self.term) + ")")
        
erik = Student("Erik", "Mustermann")
erik.name()
erik.increase_term() #Semester erhöhen
erik.name()
Erik Mustermann (Semester: 1)
Erik Mustermann (Semester: 2)

Private Eigenschaften und Methoden

Private Eigenschaften erlauben sauberes Kapseln von Eigenschaften und Methoden. Dadurch können Variablen und Methoden vor außerhalb geschützt werden. Wichtig wenn diese Variablen / Methoden noch angeüasst werden.
Mit zwei Unterstrichen vor der Variable wird diese privat. Methoden könne auf dieselbe Weise eingeschränkt werden.

In [82]:
class Student():
    def increase_term(self):
        self.__term = self.__term + 1
        
    def get_term(self): # um von außen noch auf die Variable term zugreifen zu können
        return self.__term
    
    def __do_something(self):
        print("doSomething")

Vererbung

Durch Vererbung können Daten aufgeteilt und besser modelliert werden.
Als Parameter wird die Klasse übergeben, von der neue Eigenschaften und Methoden vererbt werden sollen (Mutterklasse).

In [83]:
class WorkingStudent(Student):
    
    def __init__(self, firstname, surname, company):        
        # mit super() wird Python gezeigt, dass die init()-Methode der Mutterklasse angewendet werden soll
        super().__init__(firstname, surname)
        self.company = company
    
    def name(self):
        return super().name() + " (" + self.company + ")"

Die type() und isinstance() Funktionen

Mit der type()-Funktion kann der Typ eines Objektes festgestellt werden.
Die Funktion isinstance() erhält zwei Parameter: die Variable und die Klasse bezüglich derer auf Zugehörigkeit der Variable geprüft werden soll. isinstance() liefert einen Bool zurück.

In [84]:
print(type(student))
print(isinstance(student, Student))
<class 'tuple'>
False

Statische Variablen

Anstatt Instanzen können auch Variablen an Klassen gebunden werden. Diese heißen statisch, weil sie nicht an einer einzelnen Instanz hängen. Werden die Variablen geändert, werden sie für alle Objekte geändert.

In [85]:
class Car:
    price = "expensive" # der Preis wird auf jedes Objekt übertragen das mit der Klasse 'Car' erstellt wurde

c = Car
print(c.price)
expensive

Styleguide für Klassen und Variablen

In Python verwendet man dazu nach Konvention:

  • PascalCase (IchBesteheAusMehrerenWoertern)
  • sneak_case (ich_bestehe_aus_mehreren_woertern)

Anders als in anderen Programmiersprachen benutzt man nicht:

  • camelCase (ichBesteheAusMehrerenWoertern)

Besondere Methoden

Die str-Funktion gibt für print(objekt) eine Definierte Form aus.
Die repr-Methode gibt für Objekt eine Definierte Form aus.
Die len-Methode gibt für print(len(Objekt)) die Länge aus.

In [86]:
class PhoneBook():
    def __init__(self):
        self.__entries = {}
    def add(self, name, phone_number):
        self.__entries[name] = phone_number
    def get(self, name):
        if name in self.__entries:
            return self.__entries[name]
        else:
            return None
    def __str__(self):
        return "PhoneBook(" + str(self.__entries) + ")"
    def __repr__(self):
        return "PhoneBook(" + str(self.__entries) + ")"
    def __len__(self):
        return len(self.__entries)

book = PhoneBook()
book.add("Mustermann", "1234")
book.add("Mueller", "9876")

print(book)      #für str-Funktion
book             #für repr-Funktion
print(len(book)) # für len-Funktion
PhoneBook({'Mustermann': '1234', 'Mueller': '9876'})
2

11. Exceptions

Während der Laufzeit eines Programms können Fehler auftreten. Damit das Programm dadurch nicht abgebrochen wird, kann man mit Exceptions (try: und except: Blöcke) arbeiten. Ein Code kann mehrere except-Blöcke enthalten. Es können auch eigene Fehlercodes programmiert werden.
Fehlercodes sollten nur in den seltensten Fällen benutzt werden!

In [87]:
try:
    print(5 / 0)                       # durch Null teilen ist nicht definiert -> Fehler
    print(4)                           # alles nach dem Fehler wird nicht ausgeführt
except ZeroDivisionError:              # tritt ein bestimmter Fehler auf wird der except-Block asugeführt
    print("Durch null teilen ist nicht erlaubt!")
print(5)                               # alles nach dem except Block wird wieder ausgeführt
Durch null teilen ist nicht erlaubt!
5

Eigene Fehler auslösen

Über den raise-Befehl können eigene Fehler ausgelöst werden.

In [88]:
class InvalidEmailError(Exception):
    pass

def send_mail(email, subject, content):
    if not "@" in email:
        raise InvalidEmailError("email does not contain an @")
try:     
    send_mail("hallo", "Betreff", "Inhalt")
except InvalidEmailError:
    print("Bitte gebe eine gültige E-Mail ein")
Bitte gebe eine gültige E-Mail ein

Code abschließen

Der finally-Befehl wird bei jedem Programmdurchlauf ausgeführt, auch wenn zuvor Fehler aufgetreten sind.

In [89]:
try:
    print(5 / 0)
except ZeroDivisionError:
    print("Durch null teilen ist nicht erlaubt!")
finally:
    print("Schluss")
Durch null teilen ist nicht erlaubt!
Schluss

12. Datenstrukturen

  • Listen: Geordnete Auflistung von Elementen. Bsp: liste = ["Hallo", "Welt"]
  • Dictionaries: Zuordnung von Schlüssel zu Wert. Bsp: d = {"Hallo": 5, "Welt": 4}
  • Set: Ungeordnete Sammlung von Elementen, deren Elemente innerhalb nur einmal vorkommen dürfen
  • PriorityQueue (Prioritätswarteschlange): Automatische Sortierung der Elemente
In [ ]: