bergziege/src/python_wahlmodul.typ
2025-10-29 14:16:29 +01:00

340 lines
14 KiB
Typst
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#import "@preview/cetz:0.4.1"
#import "@preview/cetz-venn:0.1.4"
== Python Wahlmodul
=== Virtuall Envirements
Python Umgebungen (Environments) sind isolierte Verzeichnisse, die eine spezifische Python-Version und Projektabhängigkeiten (Pakete) enthalten. Ihr Zweck ist die Trennung der Projekte voneinander, um Konflikte zu vermeiden und die Reproduzierbarkeit sicherzustellen. \
*Environment erstellen* \ Normalerweise werden die Environments ".venv" genannt.
#table(columns: 1fr, [```sh
python -m venv /path/to/venv
```])
*Environment betretten* \ Dafür gibt es zwei methoden.
#table(columns: 1fr, [```sh
. ./path/to/venv/bin/activate
# oder
source ./path/to/venv/bin/activate
```])
=== Datentyp
#table(columns: (0.7fr, 0.5fr, 1fr),
[Ganzzahl],[```py int ```], [```py x: int = 4 ```],
[Gleitkomma Zahl],[```py float ```], [```py x: float = 1.234 ```],
[Text (String)],[```py str ```], [```py x: str = "Hallo" ```],
[Wahr oder Falsch],[```py bool ```], [```py x: bool = True ``` \ ```py x: bool = False ```],
[Liste (Array)],[```py list ```], [```py x: list = [1, 2, "abc", 1.23] ```],
[Dicenary],[```py dict ```], [```py x: dict = {"a": 3, "b": 4} ```],
// [Ganzzahl],[```py set ```], [```py x: int = 4 ```],
)
=== Operatoren
#table(columns: (0.7fr, 1fr, 0.6fr),
fill: (x, y) => if y == 0 {gray.lighten(40%)},
[Python-Operatoren], [Erklärung], [Operatoren],
[Arithmetische Operatoren], [Verknüpfen zweier Zahlen zu einr neuen Zahl], [`+, -, *, /, //, %, **`],
[Vergleichsoperatoren], [Vergleichen zweier Ausdrücke miteinander], [`<, >, ==, !=, <=, >=`],
[Logische Operatoren], [Verknüpfen Ausdrücke im boolischen Kontext], [`and, or, not`],
[Identitäts Operatoren], [Feststellen ob zwei Namen auf dasselbe Objekt verweisen], [`is, is not`],
)
*Anmerkungen zu den Operatoren:* \
#table(columns: (0.4fr, 0.5fr, 0.5fr, 0.4fr, 1fr),
fill: (x, y) => if y == 0 {gray.lighten(40%)},
[Ausdruck], [Name], [Beispiel], [Ergebnis], [Beschreibung],
[`%`], [Modulo], [```py 7 % 3 ```], [1], [Gibt den Rest einer Division aus],
[`//`], [Floor division], [```py 7 // 3 ```], [2], [Ergebnis wird immer zur nächsten kleineren Ganzzahl abgerundet],
[`**`], [Hochrechnen], [```py 2**3 ```], [8], [Nichts anderes als: $2^3$],
)
=== Listen
#table(columns: (0.5fr, 0.7fr, 1fr),
fill: (x, y) => if y == 0 {gray.lighten(40%)},
[Operation], [Beispiel], [Beschreibung],
[Liste Zuweisen], [```py li = [10, 15, 20, 25, 30] ```], [Die Liste wurde der Variable "li" zugewiessen],
[Ein Element ausgeben], [```py print(li[1]) ``` \ -> 15], [Es Wird "15" ausgeben da das erste Element den Index 0 hat.],
[Das Letzte Element ausgeben], [```py print(li[-1]) ``` \ -> 30], [Mit dem "-" werden die Elemente von Hinten ausgeben. z.b. bei "-2" würde 25 ausgegeben werden],
[Alles ab x ausgeben], [```py print(li[2:]) ``` \ -> `[20, 25, 30]`], [Da kein ende hinter dem Doppelpunk definiert ist wird alles ausgeben],
[Alles bis x ausgeben], [```py print(li[:2]) ``` \ -> `[10, 15]`], [Es wird alles bis zum dritten Item ausgegeben],
[Von x bis y ausgeben], [```py print(li[2:4]) ``` \ -> `[20, 25]`], [Es wird der Start und stop definiert],
[Jedes x ausfeben], [```py print(li[::2]) ``` \ -> `[10, 20, 30]`], [Es wir jedes Zeite Item ausgegeben],
[Jedes x ausfeben mit erstem beginnen], [```py print(li[1::2]) ``` \ -> `[15, 25]`], [Es wir jedes Zeite Item ausgegeben, dedoch mit dem ersten Item beginnend],
[Elemente anhängen], [```py li.append(44) ``` \ -> `[10, ... 30, 44]`], [Das neue Element wird ans ende der Liste gesetzt],
[Elemente anhängen], [```py li.append([1, 2]) ``` \ -> `[10, ... 30, [1, 2]]`], [Wir eine Liste mit append an eine Lsiste angehäng so wird diese einfach eingefügt],
[Listen zusammenfügen], [```py li.extend([1, 2]) ``` \ -> `[10, ... 30, 1, 2]`], [Die Listen wir hinten an die andere Liste angehängt],
[Element ausgeben und gleichzeitig aus der liste entfernen], [```py li.pop(1) ``` \ -> `15` \ `[10, 20, 25, ...]`], [Das Zweite Element wid entfernt und ausgelesen z.b. ```py x = li.pop() ``` \ (ohne Index wird das letzte Element ausgeben)],
[Element an einer bestimmten Stelle einfügen], [```py li.insert(0, 23) ``` \ -> `[23, 10, 20, 25, ...]`], [Das Element wird an der Stelle des Index eingefügt und alle folgenden Element um eins nach hinten geschoben],
[Elemente sortieren], [```py li.sort() ``` \ -> `[10, 20, 25, ...]`], [Normalerweise wird es der grösse nach sortiert. ES ist aber möglich "key's" mitzugeben um z.b. nach der Länge zu sortiert, etc.],
)
==== Tuples
Tuples sind Listen welche nach dem erstellen nicht mehr verändert werden können weder in der länge(anzahl Elemente) oder dem wert der Elemente.
#table(columns: (1fr, 1fr),
[Tuple erstellen], [```py tu = (10, 23, 15, 1) ```],
[Element lesen], [```py tu[1] # -> 23 ```],
[Letztes Element lesen], [```py tu[-1] # -> 1 ```],
)
Bemerkung: Ist z.B. eine Liste in einer Tuple so kann die Liste verändert werden.
```py
li = [1 , 2 , 3]
tu = (10 , 23 , li , True ) # (10 , 23 , [1 , 2 , 3] , True )
li . extend ([4 , 5])
print ( tu ) # (10 , 23 , [1 , 2 , 3 , 4 , 5] , True )
```
=== Strings
#table(columns: (1fr, 1fr, 1fr),
[String Zuweisen], [```py s = "Hello World!" ```], [],
[Element ausgeben], [```py s[0] ```], ["H"],
[Letztes Element ausgeben], [```py s[-1] ```], ["!"],
[Bereich ausgeben], [```py s[1:5] ```], ["ello"],
[Bereich ausgeben], [```py s[7:] ```], ["orld!"],
[Sequenz ausgeben], [```py s[2:9:2] ```], ["loWr"],
[String verkehrt ausgeben], [```py s[::-1] ```], ["!dlroW olleH"],
[länge ausgeben], [```py len(s) ```], [12],
[Strings Zusammensetzen], [```py
s1 = "Hallo"
s2 = "Welt"
s1 + s2 ```], ["HalloWelt"],
[Strings Zusammensetzen mit join], [```py
s1 = "Hallo"
s2 = "Welt"
" ".join([s1, s2]) ```], ["Hallo Welt"],
)
*Methoden*
#table(columns: (1fr, 1fr, 1fr),
[String Zuweisen], [```py s = "das ist ein langer String" ```], [],
[Alles in grossbuchstaben], [```py s.upper() ```], ["DAS IST EIN LANGER STRING"],
[Alles in kleinbuchstaben], [```py s.lower() ```], ["das ist ein langer string"],
[Anfangsbuschstabe gross], [```py s.capitalize() ```], ["Das ist ein langer string"],
[Beginnt der String mit], [```py s.startswith("d") ```], [True],
[Endet der String mit], [```py s.endswith("?") ```], [False],
[String in Wörter aufteilen], [```py s.split(" ") ```], [`['das', 'ist', 'ein', 'langer', 'String']`],
[Zeichen ersetzen], [```py s.replace("a", "A") ```], ["dAs ist ein lAnger String"],
)
=== Set
In einem Set kann im Vergleichen zur Liste jedes Element nur einmal existieren und ist sommit *einmalig!*
#table(columns: (1fr, 1fr, 1fr),
[Set erstellen], [```py s = {"a", "b", "c", "a"} ```], [Das letzte "a" wird nicht hinzugefügt da es bereits im Set ist.],
[Liste in Set umwandeln], [```py s = set(["a", "b", "c", "a"]) ```], [],
[String im Set], [```py s = set("Python") ```], [Jeder buchstabe wird einzeln gespeicher. \ `s = {'n, y, p, h, o, t}`],
[Set erweitern], [```py s.add(5) ```], [],
[Element aus Set löschen], [```py s.remove(12) ```], [Gibt einen Error aus wenn das zu entfernende Element nicht im Set ist.],
[Element aus Set löschen ohne Error], [```py s.discard(12) ```], [Gibt keinen Error aus wenn das zu entfernende Element nicht im Set ist (Programm geht weiter).],
)
*Mathe* \
Mit den Set's können Mengen operationen gemacht werden. Hier Beispiele mit "A" und "B".
#table(columns: 1fr, [```py
A = {"10", 120, "a"}
B = {120, 5, 10}
```])
#let op_scale = 0.6
#table(columns: (1fr, 1fr, 0.5fr), stroke: (x: none), align: horizon,
[Vereinigung \ $A union B$ \ ```py print(A | B) ```], [`{5, 120, "10", 10, "a"}`], [
#cetz.canvas({
cetz.draw.scale(op_scale)
cetz-venn.venn2(
name: "Vereinigung",
a-fill: yellow.transparentize(40%),
b-fill: yellow.transparentize(40%),
ab-fill: yellow.transparentize(40%),
)
cetz.draw.content("Vereinigung.a", [A])
cetz.draw.content("Vereinigung.b", [B])
}) ],
[Schnittmenge \ $A inter B$ \ ```py print(A & B) ```], [`{120}`], [
#cetz.canvas({
cetz.draw.scale(op_scale)
cetz-venn.venn2(
name: "Durchschnitt",
a-fill: none,
b-fill: none,
ab-fill: yellow.transparentize(40%),
)
cetz.draw.content("Durchschnitt.a", [A])
cetz.draw.content("Durchschnitt.b", [B])
}) ],
[Mengendifferenz \ $A \\ B$ \ ```py print(A - B) ```], [`{"10", "a"}`], [
#cetz.canvas({
cetz.draw.scale(op_scale)
cetz-venn.venn2(
name: "Mengendifferenz",
a-fill: yellow.transparentize(40%),
b-fill: none,
ab-fill: none,
)
cetz.draw.content("Mengendifferenz.a", [A])
cetz.draw.content("Mengendifferenz.b", [B])
})
],)
=== Dictionary
Ein Dictionary ist wie ein Wörterbuch mit einem "Key" und einer dazugehörigen "vule". Die "Keys müssen dabei *einzigartig* sein und *hashabel* (keine Listen oder modifizerbare Objekte).
#table(columns: (1fr, 1fr, 1fr),
[Dictionary erstellen], [```py d1 = {"1": "1. Element", 2: [1, 2, 3]} ``` \ ```py d2 = {[1, 2]: 2} ```], [d2 ist ungültig weil Listen keine "Key's" sind.],
[Auf Element zugreifen], [```py d1[2] ```], [Gibt `[1, 2, 3]` zurück],
[Auf Element zugreifen], [```py d1["x"] ```], [Gibt einen Fehler da "x" nicht im Dictionary ist],
[Auf Element zugreifen mit get()], [```py d1.get(2) # [1, 2, 3] ``` \ ```py d1.get("x") ```], [Gibt keinen Fehler auch wenn "x" nicht im Dictionary ist],
[Element überschreiben], [```py d1[2] = 2 ```], [Die Liste wurde mit 2 überschrieben],
[Element hinzufügen], [```py d1["neuer key"] = 12 ```], [Neuses Element mit dem der "value" 12.],
)
*Methoden* \
```py d1 = { a : 10 , b : 27 , c : 12} ```
#table(columns: (1fr, 1fr, 1fr),
fill: (x, y) => if y == 0 {gray.lighten(40%)},
[Was], [Code], [ausgabe],
[Liefert den value zum zugehörigen key], [```py d1.get("a") ```], [`10`],
[Löscht den key & value zum zugehörigen key], [```py d1.pop("a") ```], [`[10, 27, 12]`],
[Liefert alle values eines Dictionaries als Liste], [```py d1.values() ```], [`[10, 27, 12]`],
[Liefert alle keys eines dictionaries als Liste], [```py d1.keys() ```], [`["a", "b", "c"]`],
[Liefert alle key/value-Paare eines Dictionary als Tuple], [```py d1.items() ```], [`[("a", 10), ("b", 27), ("c", 12)]`],
)
=== Kommentare
#table(columns: (1fr, 1fr),
[Einzeiliger Kommentar],[```py price = 5.50 # this is an inline comment ``` \ ```py # this is a short ```],
[Mehrzeiliger Kommentar],[```py
def prepare_data(self):
""" Prepares all data
[...]
write to the database """
self.db_connect ()
```],
)
=== input (Benutzer eingabe)
Mit der input() funktion können eingaben vom User angenommen werden.
#table(columns: 1fr, [```py
number = input("Geben Sie eine Nummer ein : ") # eingabe als string (Text)
int_number = int(number) # eingabe als intiger
```])
=== print (Benutzer ausgabe)
#table(columns: 1fr, [```py
print("Hallo ich bin ein String")
a , b = 10 , 12
print(a)
print(f"Hier ist die Variable a mit dem wert {a}") # Das ist ein "f" String
balance = 9876.9376
print(f"Balance: CHF {balance:.2f}") # Balance: CHF 9876.94 -> Ausgabe auf 2 Stellen nach dem Komma gekuerzt
```])
=== Entscheidungen
==== if
Das `if` in Python kann einzel verwendet werden oder in kombination mit `elif` oder `else`.
#table(columns: 1fr, [```py
number = 15
if number > 0:
print("The number is positive")
```])
#table(columns: 1fr, [```py
a = 200
b = 33
if b > a:
print("b is greater than a")
elif a == b:
print("a and b are equal")
else:
print("a is greater than b")
```])
==== march (switch case)
Mit dem march hat man in Python eine switch case option.
- `_`: der Underline ist der default parameter wenn keine bedingung erfühlt ist.
#table(columns: 1fr, [```py
day = 4
match day:
case 6:
print("Today is Saturday")
case 7:
print("Today is Sunday")
case _:
print("Looking forward to the Weekend")
```])
- `|`: mittels pipe können or verknüpfungen gemacht werden.
#table(columns: 1fr, [```py
day = 4
match day:
case 1 | 2 | 3 | 4 | 5:
print("Today is a weekday")
case 6 | 7:
print("I love weekends!")```])
=== Schleifen
==== for-loop
Alle Items werden ausgeprintet.
#table(columns: 1fr, [```py
for item in ["itemA" , "itemB" , "itemC"]:
print(item)
```])
==== while
Schleifen werden verwendet wen nicht bekannt ist wie lange es dauert bis die bedinung erfühlt ist. \
- ```py continue ```: mit dem continue statement springt die schleife wieder an den anfang und in dem fall wird 3 nicht geprintet.
- ```py break ```: mit dem break statement wird die schleife vorzeitig verlassen.
#table(columns: 1fr, [```py
i = 1
while i < 6:
if i == 3:
continue
if i == 5:
break
i += 1
print(i)
```])
=== range() (Exkurs)
Mit der ```py range() ``` funktion können Reihen geformt werden. Die Funktion hat drei parameter `range(start, stop, step)`
- start: (Optional). Ein Intiger Wert, welcher die Startposition festlegt. (default: 0)
- stop: (Required). Ein Intiger Wert, welcher die Endposition festlegt.
- step: (Optional). Ein Intiger Wert, welcher die Schrittweite festlegt. Kann auch negativ sein. (default: 1)
#table(columns: (1fr, 1fr),
[```py
for i in range(5):
print(i)
```], [`0, 1, 2, 3, 4`],
[```py
for i in range(0, 5, 1):
print(i)
```], [`0, 1, 2, 3, 4`],
[```py
for i in range(0, 5, 2):
print(i)
```], [`0, 2, 4`],
[```py
for i in range(10, 5, -1):
print(i)
```], [`10, 9, 8, 7, 6`],
)
=== Funktionen
Mit einer Funktion können wir code wiederholen ohne ihn mehrmals zu schreiben.
#table(columns: 1fr, [```py
def funktionsname(a, b, c=3):
# code
return something
```])
Erklärung:
- ```py def ```: Schlüsselwort zum `definieren` einer Funktion.
- ```py funktionsname ```: Name mit der die Funktion später aufgerufen werden soll.
- ```py (a, b, c=3) ```: Argumente / Parameter welche der funktion mitgegeben werden. Wenn eine Variable keinen wert hat muss der Wert beim funktionsaufruf mitgegeben werden. Ist wie z.b. bei c=3 mittels gleich einen Wert, liste, etc. als default Wert definiert so ist der Parameter optional und muss nicht mitgegeben werden, dann wir einfach der default wert verwendet.
- ```py # code ```: Hier kommt der code der Funktion hin.
- ```py return something ```: Falls etwas zurückgegeben werden möchte kann dies mitels return gemcht werden. Es ist auch möglich mehere variabeln zurückzugeben z.b. ```py f, p = return x, y ```. Falls nicht zurückgegeben werden möchte kann auf dass return verzichtet werden.
Optionale Parameter kommen immer am schluss!
=== Runden
#table(columns: (1fr, 1fr),
[```py
pi = 3.141592653589793
print(round(pi, 2)
```], [ -> 3.14]
)
Die "2" durch anzahl stellen ersetzen.
flour runden
upper runden