Python 3: neue "minor"-Version (z.B. 3.9) wird jeden Oktober veröffentlicht
Python 2: Unterstützung endete 2019, zu diesem Zeitpunkt nutzten es noch 10% der Entwickelr
# this is a comment
a = 3
b = 4
print(a * b)
if a * b > 10:
print('greater')
Download von https://python.org
Während der Installation: Häkchen bei "Add Python 3.x to PATH" setzen
Überprüfen der Installation:
python --version
sollte die Versionsnummer anzeigen
pip install requests
sollte ein kleines Python-Paket namens requests erfolgreich herunterladen und installieren
Python Installation beinhaltet:
Optionen, um Python-Code auszuführen:
Möglichkeiten:
Starten:
python
Beenden:
exit()
einfach:
Jupyter Notebooks:
birth_year = 1970
current_year = 2020
age = current_year - birth_year
Variablennamen werden üblicherweise klein geschrieben; Wörter werden durch Unterstriche getrennt
Variablennamen dürfen nur aus Buchstaben, Ziffern und Unterstrichen bestehen
Ãœberschreiben (neu setzen) von Variablen:
name = "John"
name = "Jane"
a = 3
a = a + 1
int
(integer): Ganzzahlfloat
: Kommazahlstr
(string): Textbool
(boolean): Ja/Nein - Wert (Wahrheitswert)Beispiel:
(7 - 3) * 0.5 / 3.5
Ein String - auch Zeichenkette - repräsentiert Text
Begrenzung durch einfache oder doppelte Anführungszeichen
greeting = "Hello"
name = 'John'
name = 'John'
Variablen einsetzen (f-Strings):
message1 = f"Hello, {name}!"
Strings zusammensetzen:
message2 = "Hello, " + name + "!"
Problem: Wie schreiben wir Zeichen wie z.B. "
innerhalb eines Strings?
Ungültig:
text = "He said: "hi!""
Lösung:
text = "He said: \"hi!\""
Python interpretiert die Zeichenfolge \"
wie ein einzelnes "
Zeilenumbruch: \n
a = 'line 1\nline 2'
einzelner Backslash: \\
b = 'C:\\docs'
Boolescher Wert: Ja/Nein - Wert
In Python: True
oder False
beachte Großschreibung
Wert ist unbekannt oder fehlt
first_name = "John"
middle_name = None
last_name = "Doe"
Den Typ einer Variablen stellen wir mit type()
fest:
a = 4 / 2
type(a)
Datentypen können mit Funktionen wie int()
, float()
, str()
, bool()
, ... ineinander umgewandelt werden
pi = 3.1415
pi_int = int(pi)
message = "Pi is approximately " + str(pi_int)
Eine Funktion ist ein "Unterprogramm", das eine bestimmte Aufgabe erledigen kann
Beispiele für vordefinierte Funktionen:
len()
kann die Länge eines Strings bestimmen (oder einer Liste, ...)id()
kann die interne ID eines Objekts bestimmentype()
kann den Typ eines Objekts bestimmenprint()
kann Ausgaben in das Terminal schreibenFunktionen können Parameter übergeben bekommen und einen Rückgabewert zurückliefern.
Beispiel: len()
kann einen String als Parameter übergeben bekommen und einen Int als Rückgabewert liefern
Beispiel: print()
kann verschiedene Objekte als Parameter entgegennehmen; es liefert keinen expliziten Rückgabewert
Methode: eine Funktion, die zu einem bestimmten Objekttyp gehört (z.B. zu str)
Beispiele für String-Methoden:
first_name.upper()
first_name.count("a")
first_name.replace("a", "@")
Dicts (dictionaries) sind Zuordnungen, die bestimmten Einträgen zugehörige Werte zuweisen.
person = {
"first_name": "John",
"last_name": "Doe",
"nationality": "Canada",
"birth_year": 1980
}
Elementzugriff bei dicts
person["first_name"]
person["first_name"] = "Jane"
Ãœbung:
Erstelle und verändere Dictionaries, die verschiedene Objekte repräsentieren - z.B.:
Listen sind ein Datentyp, der eine Folge von anderen Objekten repräsentiert
primes = [2, 3, 5, 7, 11]
users = ["Alice", "Bob", "Charlie"]
products = [
{"name": "IPhone 12", "price": 949},
{"name": "Fairphone", "price": 419},
{"name": "Pixel 5", "price": 799}
]
Auslesen von Listenelementen mittels Listenindex (bei 0 beginnend)
users = ["Alice", "Bob", "Charlie"]
users[0]
users[1]
users[-1] # last element
Ãœberschreiben von Listenelementen
users[0] = "Andrew"
Anhängen von Listenelementen
users.append("Dora")
Entfernen des letzen Elements:
users.pop()
Entfernen anhand des Index:
users.pop(0)
Die Länge einer Liste bestimmen:
len(users)
Ãœbungen:
Erstelle und ändere Daten, die aus dicts und lists bestehen und die verschiedene Objekte repräsentieren, z.B.:
date = (1973, 10, 23)
Anwendungsbereich: ähnlich wie dict:
point_dict = {"x": 2, "y": 4}
point_tuple = (2, 4)
date_dict = {
"year": 1973,
"month": 10,
"day": 23
}
date_tuple = (1973, 10, 23)
Jeder Eintrag in einem Tupel hat eine bestimmte Bedeutung
Verhalten: ähnlich wie Listen:
date_tuple[0] # 1973
len(date_tuple) # 3
Im Gegensatz zu Listen sind Tupel unveränderlich (kein .append
/ .pop
/ ...)
erstelle und ändere Datenstrukturen, die dicts, lists und tuples beinhalten
Was ist der Wert von a
am Ende dieses Programms?
a = [1, 2, 3]
b = a
b.append(4)
Eine Zuweisung (z.B. b = a
) versieht ein existierendes Objekt mit einem neuen (zusätzlichen) Namen.
Im Hintergrund steht nach wie vor nur ein einzelnes Objekt.
Falls das Original erhalten bleiben soll, kann es kopiert werden oder die abgeänderte Variante basierend auf dem alten Objekt erstellt werden:
a = [1, 2, 3]
# creating a new copy
b = a.copy()
# modifying b
b.append(4)
a = [1, 2, 3]
# creating a new object b based on a
b = a + [4]
Manche Objekte in Python können direkt verändert (mutiert) werden - z.B. via .append()
, .pop()
, ...
Beispiele: list
, dict
Viele einfache Objekte sind nach ihrer Erstellung unveränderlich.
Beispiele: int
, float
, str
, bool
, tuple
Ressourcen:
Interaktive Hilfe zu Objekten in der Python-Konsole:
help(list)
(Navigieren durch lange Ausgaben via Leertaste und Enter, Beenden via Q)
Dokumentation zu Built-Ins und der Standard Library:
https://docs.python.org/3/library/index.html (Google: "python library")
Bietet ähnliches wie die Funktion help
, oft mit etwas ausführlicheren Beschreibungen
hilfreiche Website mit Antworten für viele häufige Fragen: StackOverflow
weitere kostenlose Ressourcen:
Beispiel für Code, der eine Fehlermeldung erzeugt:
open("foo.txt")
Fehlermeldung:
Traceback (most recent call last):
File "xyz.py", line 1, in <module>
open("foo.txt")
FileNotFoundError: [Errno 2] No such file or directory: 'foo.txt'
Letzte Zeile: Beschreibung des Fehlers
darüber: Ursprung des Fehlers
Beispielcode mit einer Kette von Funktionsaufrufen:
import shutil
def demo_remove_dir_error():
shutil.rmtree("./does_not_exist")
demo_remove_dir_error()
Fehlermeldung mit einer Kette von Funktionsaufrufen:
Traceback (most recent call last):
File "...\demo_remove_dir_error.py", line 5, in <module>
demo_remove_dir_error()
File "...\demo_remove_dir_error.py", line 3, in demo_remove_dir_error
shutil.rmtree("./does_not_exist")
File "...\lib\shutil.py", line 748, in rmtree
return _rmtree_unsafe(path, onerror)
File "...\lib\shutil.py", line 607, in _rmtree_unsafe
onerror(os.scandir, path, sys.exc_info())
File "...\lib\shutil.py", line 604, in _rmtree_unsafe
with os.scandir(path) as scandir_it:
FileNotFoundError: [WinError 3] The system cannot find the
path specified: './does_not_exist'
verbreitete Entwicklungsumgebungen für Python:
Grundlegendes:
Funktionalität:
Installation:
Registrierung der Python-Installation in VS Code:
mittels File - Preferences - Settings
mögliche Einstellungen:
Befehlspalette: via F1 oder Ctrl + Shift + P
Beispiele für Befehle:
Debug - Start Without Debugging (Ctrl + F5) (führt Programm im Projektordner aus)
oder
grünes Play-Symbol zur Editoransicht (führt Programm im aktuellen "working directory" im Terminal aus)
in einer interaktiven Konsole / einem interaktiven Notebook
generiert der letzte Befehl in einer Zelle einen Wert, wird dieser automatisch als Ausgabe geschrieben
allgemeiner Weg, um Textausgabe zu erzeugen: print()
print("Hello, world!")
Wir legen eine Datei namens greeting.py
an.
Unser Programm soll den Benutzer nach seinem Namen fragen und ihn dann begrüßen.
Eingabe: Mit Hilfe von input()
:
print("What is your name?")
name = input()
input
liefert immer einen String zurück
Ausgabe der Begrüßung
print("Nice to meet you, " + name)
in der Kommandozeile via python greeting.py
in VS Code (Python-Erweiterung muss installiert sein):
grünes Play-Symbol zur Editoransicht
oder
Run - Run Without Debugging (Ctrl + F5)
Schreibe ein Programm namens age.py
, das den Benutzer nach seinem Geburtsjahr fragt und dann angibt, wie alt diese Person im Jahr 2022 wird.
Schreibe ein Programm, das den Benutzer nach seinem Namen fragt. Es soll angeben, aus wie vielen Zeichen der Name besteht.
Verwende dazu die Funktion len(...)
, um die Länge eines Strings zu ermitteln
Kommentare dienen Entwicklern, um den Code zu beschreiben und zu erklären. Sie werden von Python ignoriert.
Ein Kommentar beginnt mit einem #
-Zeichen und reicht bis zum Ende der Zeile.
Ãœblicherweise stehen Kommentare oberhalb des Codes, den sie beschreiben
# determine the length of the name
name_length = len(name)
Dokumentation: https://docs.python.org/3/library/index.html
unter anderem:
print()
input()
len()
max()
min()
open()
range()
round()
sorted()
sum()
type()
Die Standard Library bietet zusätzliche Module, die importiert werden können.
Beispiel (abrunden):
import math
print(math.floor(3.6))
oder
from math import floor
print(floor(3.6))
interessante Module:
pprint
(formatierte Ausgabe)random
math
datetime
os
(Betriebssystem, Dateisystem)urllib.request
(HTTP-Anfragen)webbrowser
(einfache Steuerung des Standard-Browsers)Ausgabe mehrerer Elemente:
print(1, 2, 3, sep=", ", end="\n\n")
1, 2, 3
import pprint
pprint.pprint(['Mercuy', 'Venus', 'Earth', 'Mars', 'Jupiter',
'Saturn', 'Uranus', 'Neptune', 'Pluto'])
['Mercuy',
'Venus',
'Earth',
'Mars',
'Jupiter',
'Saturn',
'Uranus',
'Neptune',
'Pluto']
Textdatei zum Schreiben öffnen:
file = open("message.txt", mode="w", encoding="utf-8")
file.write("hello\n")
file.write("world\n")
file.close()
Datei muss zuvor nicht existieren
Abfrage von Web-Inhalten (und Speichern in einer Datei)
import urllib.request
# make a HTTP request
req = urllib.request.urlopen("https://en.wikipedia.org")
# read content as utf-8 string
content = req.read().decode("utf-8")
# save to file
file = open("wikipedia.html", "w", encoding="utf-8")
file.write(content)
file.close()
import random
print(random.randint(1, 6))
print(random.choice(["heads", "tails"]))
Mit Kontrollstrukturen können wir bestimmten Code z.B. wiederholt ausführen lassen, oder Code nur in bestimmten Situationen ausführen lassen.
wichtigste Konstrollstrukturen in Programmiersprachen:
if ... else ...
while
for ... in ...
for ... in range(...)
Um if
und while
nutzen zu können, müssen wir Werte vergleichen können:
a = 2
b = 5
print(a == b) # a is equal to b
print(a != b) # a not equal to b
print(a < b) # a is smaller than b
print(a > b)
print(a <= b) # a is smaller than or equal to b
print(a >= b)
Das Resultat eines Vergleichs ist ein boolescher Wert (True
/ False
)
Wir können das Resultat in einer Variablen speichern:
is_adult = age >= 18
Beispiele:
if age >= 18 and country == "de":
print("may drink alcohol")
if temperature < -10 or temperature > 30:
print("extreme weather")
if not value > 10:
print("value not greater than 10")
Beispiel:
age = 30
age_seconds = age * 365 * 24 * 60 * 60
if age_seconds < 1000000000:
print("You are less than 1 billion seconds old")
else:
print("You are older than 1 billion seconds")
if age_seconds < 100000000:
print("You are less than 100 million seconds old")
elif age_seconds < 1000000000:
print("You are between 100 million and 1 billion seconds old")
elif age_seconds < 2000000000:
print("You are between 1 billion and 2 billion seconds old")
else:
print("You are older than 2 billion seconds")
Codeblock = Zusammengehörige Codezeilen, die z.B. als Resultat einer if-Abfrage ausgeführt werden.
In Python endet die Zeile vor einem Codeblock mit einem :
, der Codeblock ist eingerückt (meist mit 4 Leerzeichen).
Simuliere einen zufälligen Münzwurf mittels random.choice(["heads", "tails"])
Lasse den Benutzer das Ergebnis raten und sage ihm, ob er richtig lag
Mit for-Schleifen können wir die Inhalte einer Liste (oder ähnlicher Objekte) durchlaufen.
Bezeichnung in manchen anderen Programmiersprachen: for-each
names = ["Alice", "Bob", "Charlie"]
for name in names:
print("Hello, " + name + "!")
Beginne mit einer Liste von Zahlen, z.B. [2, 5, -3, 8, 1, -5]
Gib alle positiven Einträge aus, z.B. 2, 5, 8, 1
Gib den größten Eintrag aus, z.B. 8
Folgendermaßen können wir in Python von 0 bis 9 zählen:
for i in range(10):
print(i)
Der Aufruf range(10)
erstellt ein Objekt, das sich wie die Liste [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
verhält.
typischer Variablenname in Zählschleifen: i
Ãœbung: Erstelle eine Multiplikationstafel
1 x 7 = 7
2 x 7 = 14
3 x 7 = 21
4 x 7 = 28
...
Eine if-Abfrage führt einen Codeblock einmal aus, wenn ein Kriterium zutrifft
Eine while-Schleife wiederholt einen Codeblock, solange ein Kriterium zutrifft
Beispiel:
a = 1
while a < 2000:
print(a)
a = a * 2
Ãœbungen:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
erstelltBeispiel: Einkaufsliste
Beispielhafter Programmlauf:
enter an item or "x" to quit:
milk
enter an item or "x" to quit:
bread
enter an item or "x" to quit:
apples
enter an item or "x" to quit:
x
your shopping list is:
["milk", "bread", "apples"]
Schlüsselwort break
: kann verwendet werden, um die aktuelle Schleife zu beenden
Beispiel (do-while-Schleife):
a = 1
while True:
a = a * 2
print(a)
if (a > 1000):
break
leere Codeblöcke mittels des pass
-Statements:
# TODO: warn the user if path doesn't exist
if not os.path.exists(my_path):
pass
Ein Statement kann über mehrere Zeilen gehen, wenn wir entsprechend Klammern setzen
a = (2 + 3 + 4 + 5 + 6 +
7 + 8 + 9 + 10)
Alternative: Escapen von Zeilenumbrüchen mit \
a = 2 + 3 + 4 + 5 + 6 + \
7 + 8 + 9 + 10
Ausdruck = etwas, das einen Wert ergibt (der Wert könnte None
sein)
Ausdruck = alles, was auf der rechten Seite einer Zuweisung (=
) stehen kann
Beispiele für Ausdrücke
(7 - 3) * 0.5
(7 - 3)
7
round(3.5)
x == 1
siehe https://github.com/marko-knoebl/slides/tree/master/exercises/python-beginner
Aufruf von open
:
mit positionalen Parametern:
f = open("myfile.txt", "w", -1, "utf-8")
mit Schlüsselwortparametern:
f = open("myfile.txt", encoding="utf-8", mode="w")
Die Namen der Schlüsselwortparameter entnehmen wir der Dokumentation (z.B. via help(open)
)
Bei manchen Funktionen sind Parameter optional (sie haben einen Standardwert)
Beispiel: Bei der Funktion open()
ist nur der erste Parameter zwingend anzugeben
Die Werte der Standardparameter entnehmen wir der Dokumentation
Beispiel:
def average(a, b):
m = (a + b) / 2
return m
Folgendermaßen definieren wir Standardwerte für Parameter:
def shout(phrase, end="!"):
print(phrase.upper() + end)
shout("hello") # HELLO!
shout("hi", ".") # HI.
Eine Funktionsdefinition öffnet einen neuen Scope, einen Geltungsbereich für Variablen
Im folgenden Beispiel gibt es zwei separate Variablen, die beide mit m
benannt sind:
m = "Hello, world"
def average(a, b):
m = (a + b) / 2
return m
x = average(1, 2)
print(m) # prints "Hello, world"
Innerhalb einer Funktion gilt: Variablen, die außerhalb definiert sind, können gelesen, aber nicht geschrieben werden
In anderen Programmiersprachen: auch Konstrukte wie if
oder for
eröffnen einen neuen Scope - nicht so in Python
True
oder False
zurückgibtfür Strichcodes / Primzahlen: Recherchiere den % - Operator
Siehe: https://github.com/marko-knoebl/slides/tree/master/exercises/python-beginner
(Pakete sind eigenlich eine besondere Form von Modulen)
urllib
= Paketurllib.request
= Modulurllib.request.urlopen
= Funktionsys
= Modulsys.path
= ObjektTypische Imports:
import module1
from package2 import module2a, module2b
from module3 import object3a, object3b
from package4.module4 import object4a, object4b
Konkrete Beispiele:
import os
from urllib import request, response
from math import sqrt, pi
from http.client import HTTPConnection, HTTPSConnection
Insbesondere in der interaktiven Konsole sinnvoll, wenn Tipparbeit gespart werden soll:
Kurznamen beim import:
import numpy as np
import matplotlib.pyplot as plt
import tkinter as tk
Alles aus einem Modul importieren (eher nicht empfohlen):
from math import *
Beim Import mancher Pakete werden automatisch auch Untermodule importiert.
Beispiele:
import os
import numpy as np
os.path.join(...)
np.random.randint(10)
Gegenbeispiel - schlägt fehl:
import urllib
urllib.request.urlopen(...)
einfache Verwendung aus dem Terminal:
pip install package_a package_b
Website des Python Package Index:
Ãœbung:
Verwandle den folgenden Markdown-String ind HTML - suche hierfür ein passendes Paket von PyPI
markdown_string = """
# Important packages
- requests
- numpy
- sqlalchemy
"""
mögliche Lösung:
pip install markdown
import markdown
html_string = markdown.markdown(
markdown_string
)
wir können lokale Python-Dateien als Module importieren
Beispiel: lokale Datei messages.py
import messages
print(messages.message1)
Zusammenfassung von Modulen in Pakete (via Ordnern)
Beispiel: Ordner phrases/, Dateien phrases/messages.py und phrases/greetings.py
from phrases import greetings
print(greetings.greeting1)
Suchreihenfolge von Imports:
Vermeide Namensgleichheit mit existierenden Modulen / Paketen!