You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: Glossar.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,7 +9,7 @@ Ein Interpreter ist ein Programm, dass Anweisungen in einer Programmiersprache e
9
9
Ein Compiler übersetzt Programmcode einer höheren **[Programmiersprache](#programmiersprache)** aus einer Datei in eine, vom Computer lesbare Sprache und speichert diese Übersetzung. Somit wird der Programmcode erst in eine Datei geschrieben, was es ermöglicht komplizierteren Code zu schreiben und zu schreiben. Da der Programmcode in Menschen lesbarer Form gespeichert wird, ist es möglich das Programm auf verschiedenen Systemen und an verschiedenen Zeitpunkten auszuführen.
10
10
## Level 1:
11
11
### Ausdruck
12
-
Ein Ausdruck (alternativ: Expression) ist ein grundlegender Bestandteil jedes Programms. Ein Ausdruck beschreibt einen **[Wert](#wert)** durch das Verknüpfen von **[Funktionen](#funktion)** oder **[Operatoren](#operator)** in Verbindung mit Werten oder **[Variabeln](#variable)**. Ein Ausdruck ist dabei immer Bestandteil einer **[Anweisung](#anweisung)**.
12
+
Ein Ausdruck (alternativ: Expression) ist ein grundlegender Bestandteil jedes Programms. Ein Ausdruck beschreibt einen **[Wert](#wert)** durch das Verknüpfen von **[Funktionen](#funktion)** oder **[Operatoren](#operator)** in Verbindung mit Werten oder **[Variablen](#variable)**. Ein Ausdruck ist dabei immer Bestandteil einer **[Anweisung](#anweisung)**.
13
13
### Anweisung
14
14
Eine Anweisung (alternativ: Befehl) ist grundlegender Bestandteil jedes Programms. Eine Anweisung kann verschiedene **[Ausdrücke(#ausdruck)** miteinander durch Funktionsaufrufe oder **[Operatoren](#operator)** verbinden aber auch einer **[Variable](#variable)** zuweisen. Im Allgemeinen enthält eine Codezeile eine Anweisung.
15
15
### Variable
@@ -45,13 +45,13 @@ Als Index bezeichnet man die Position, bei 0 beginnend, eines **[Elementes](#ele
45
45
Eine Liste ist ein **[Typ](#typ)**, der in Python mitgeliefert wird. In einer Liste können beliebig viele **[Werten](#wert)** mit beliebigen **[Typen](#typ)** gespeichert werden. Dabei kann ein Wert beliebig häufig in der selben Liste auftreten. Ebenso können Werte verschiedenen Typs in der selben Liste gespeichert werden. Häufig werden die Werte in einer Liste als **[Elemente](#element)** bezeichnet. Auf die Elemente einer Liste wird über deren Position in der Liste (ihren **[Index](#index)**) zugegriffen. Die Zählung der Indexe beginnt dabei bei `0`, d.h. das erste Element einer Liste mit `n` Elementen hat den Index `0` und das letzte Element den Index `n-1`. Zu beachten ist, das im Gegensatz zu den Typen **[Integer](#integer)**, **[String](#string)**, **[Float](#float)** und **[Boolean](#boolean)** die Liste ein dynamischer Typ ist.
46
46
### Tupel
47
47
Ein Tupel ist ein **[Typ](#typ)**, der von Python mitgeliefert wird. Er besitzt ähnliche Eigenschaften wie der Typ **Liste**. Der markante Unterschied zwischen diesen
48
-
beiden Typen ist, dass ein Tupel unveränderlich ist, sowohl bezüglich der Anzahl der **[Elemente](#element)** als auch bezgl. der Elemente. Der Zugriff geschieht wie bei dervListe über den **[Index](#index)** eines Elements.
48
+
beiden Typen ist, dass ein Tupel unveränderlich ist, sowohl bezüglich der Anzahl der **[Elemente](#element)** als auch bezüglich der Elemente. Der Zugriff geschieht wie bei dervListe über den **[Index](#index)** eines Elements.
49
49
### Dictionary
50
50
Ein Dictionary ist ein **[Typ](#typ)**, der von Python mitgeliefert wird. Es ist ebenso wie die **[Liste](#liste)** oder das **[Tupel](#tupel)**, ein iterativer Typ. Im Gegensatz zu diesen beiden Typen wird auf ein **[Element](#element)**, dass in einem Dictionary gespeichert wird nicht über einen **[Index](#index)**, sondern über ein Schlüssel zugegriffen.
51
51
### Schleife
52
52
Eine Schleife ist eine **[Kommandostruktur](#kommandostruktur)** und dient dazu eine Folge von Anweisungen wiederholt auszuführen, bis eine **[Bedingung](#bedingung)** erreicht ist. Diese Bedingung nennt man Abbruchbedingung. In Python gibt es zwei Arten von Schleifen, die in ihren Möglichkeiten gleichwertig sind, sie unterscheiden sich jedoch in der **[Syntax](#syntax)**, und Handhabung.
53
53
#### while Schleife
54
-
Eine while-Schleife ist eine **[Schleife](#schleife)** , die einen **[boolschen](#boolean)** Ausdruck entgegennimmt, diesen auf Wahrheit prüft und dann einen Codeblock wiederholt ausführt. Nach jedem Durchlauf wird der boolsche Ausdruck erneut geprüft. Sollte der Ausdruck nicht mehr den **[Wert](#wert)**`True`ergeben, wird das Durchlaufen der Schleife beendet.
54
+
Eine while-Schleife ist eine **[Schleife](#schleife)** , die einen **[boolschen](#boolean)** Ausdruck entgegennimmt, diesen auf Wahrheit prüft und dann einen Codeblock wiederholt ausführt. Nach jedem Durchlauf wird der boolsche Ausdruck erneut geprüft. Sollte der Ausdruck nicht mehr den **[Wert](#wert)**`True`ergeben, wird das Durchlaufen der Schleife beendet.
55
55
#### for Schleife
56
56
Eine for-Schleife ist eine **[Schleife](#schleife)** die ein iterierbares **[Objekt](#objekt)** durchläuft. Beispielsweise lassen sich somit **[Strings](#string)**, **[Listen](#liste)**, **[Tupel](#tupel)** oder **[Dictionaries](#dictionary)** durchlaufen. Durch die `range()`**[Funktion](#funktion)** lassen sich sehr Zählschleifen implementieren.
Copy file name to clipboardExpand all lines: Home.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -54,7 +54,7 @@ Level 1 beginnt mit dem Programmieren einfacher Programme in Python und klärt G
54
54
* Kommentar
55
55
56
56
### Level 2
57
-
Level 2 führt eine erste Kontrollstruktur ein, welche ein wichtiges Element jeder Programmiersprache darstellt. Desweiteren wird ein neuer Typ eingeführt.
57
+
Level 2 führt eine erste Kontrollstruktur ein, welche ein wichtiges Element jeder Programmiersprache darstellt. Des Weiteren wird ein neuer Typ eingeführt.
58
58
#### Stichwörter:
59
59
* Programmablauf
60
60
* if-Bedingung
@@ -104,7 +104,7 @@ Dieses Level beschäftigt sich mit Themen, die in bisherigen Level nicht behande
104
104
105
105
### Level 6
106
106
107
-
In Level 6 geht es um Konsolenanwendungen. Diese kann man grob in zwei Arten unterteilen:
107
+
In Level 6 geht es um Konsolen-Anwendungen. Diese kann man grob in zwei Arten unterteilen:
108
108
* Programme, die nur Parameter entgegennehmen und etwas ausgeben
109
109
* Programme, die interaktiv arbeiten
110
110
@@ -115,7 +115,7 @@ Einfache Formen des letzteren Typs kamen bereits in den vorigen Level vor.
115
115
*`curses`
116
116
117
117
### Level 7 (OOP 1)
118
-
Level 7 widmet sich den fortgeschritterenen Bereich der Objektorientierten Programmierung. Dieses Konzept hat auch in vielen anderen Programmiersprachen eine große Bedeutung. In diesen Level werden die Kompetenzen vermittelt um eigene Typen zu definieren, Klassen oder Module zu schreiben, sowie ein grundsätzliches Verständnis von Objektorientierter Programmierung.
118
+
Level 7 widmet sich dem Bereich der Objektorientierten Programmierung. Dieses Konzept hat auch in vielen anderen Programmiersprachen eine große Bedeutung. In diesen Level werden die Kompetenzen vermittelt um eigene Typen zu definieren, Klassen oder Module zu schreiben, sowie ein grundsätzliches Verständnis von Objektorientierter Programmierung.
Copy file name to clipboardExpand all lines: Level10.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -26,7 +26,7 @@ import sys
26
26
27
27
## `QApplication`-Objekt erstellen
28
28
29
-
Um überhaupt irgendetwas mit Qt machen zu können, brauchen wir eine Instanz von `QApplication`. (Bei reinen Konsolenanwendungen kann man auch `QCoreApplication` verwenden.)
29
+
Um überhaupt irgendetwas mit Qt machen zu können, brauchen wir eine Instanz von `QApplication`. (Bei reinen Konsolen-Anwendungen kann man auch `QCoreApplication` verwenden.)
Copy file name to clipboardExpand all lines: Level2.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,7 +3,7 @@
3
3
In Level 1 hast du gelernt Eingaben in der Konsole vom Benutzer entgegen zu nehmen und, diese EIngaben zu verarbeiten und die Ergebnisse dieser Verarbeitung in der Konsole auszugeben.
4
4
5
5
In Level 2 wirst die `if`-Bedingung kennenlernen, die es dir ermöglicht Bedingungen zu prüfen, die erfüllt sein müssen, damit ein Codeabschnitt ausgeführt werden kann.
6
-
Desweiteren wirst du die `while`-Schleife kennenlernen, welche einen Codeabschnitt wiederholt ausführt, solange eine Bedingung erfüllt ist.
6
+
Des Weiteren wirst du die `while`-Schleife kennenlernen, welche einen Codeabschnitt wiederholt ausführt, solange eine Bedingung erfüllt ist.
7
7
Im Zusammenhang mit der `if`-Bedingung und der `while`-Schleife wirst du den Datentypen `boolean` kennenlernen. Dieser Datentyp beinhaltet Wahrheitswerte.
8
8
Am Ende des Levels wirst bereits in der Lage sein komplexere Programme umzusetzen.
Copy file name to clipboardExpand all lines: Level4.md
+5-10Lines changed: 5 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -33,12 +33,10 @@ text = file_object.read()
33
33
file_object.close()
34
34
```
35
35
Die Methode `read()` liefert dabei einen String zurück, der den Inhalt der Datei enthält.
36
-
Alternativ kann auch die Methode `readlines()` benutzt werden. Diese gibt eine Liste von Zeilen
36
+
Alternativ kann auch die Methode `readlines()` benutzt werden. Diese gibt eine Liste von Zeilen
37
37
zurück.
38
38
39
-
Wichtig zu beachten ist, dass die Datei gelesen wird, indem ein Zeiger durch sie durch läuft,
40
-
was bedeutet, dass nach dem vollständigen Lesen der Datei der Zeiger zurück gesetzt werden
41
-
muss, da sonst ein leerer String zurückgegeben werden wird.
39
+
Wichtig zu beachten ist, dass die Datei gelesen wird, indem ein Zeiger durch sie durch läuft, was bedeutet, dass nach dem vollständigen Lesen der Datei der Zeiger zurück gesetzt werden muss, da sonst ein leerer String zurückgegeben werden wird.
42
40
43
41
```python
44
42
filename ="loremipsum.txt"
@@ -69,8 +67,7 @@ file_object.close()
69
67
Wenn die Datei mit dem Dateinamen nicht vorhanden ist, wird sie in diesem Modus erstellt.
70
68
Wichtig ist, dass die Datei dabei überschrieben wird, falls sie schon vorhanden war.
71
69
72
-
Es ist auch möglich einzelne Zeilen in die Datei zu schreiben, was grade bei größeren Texten
73
-
sinnvoll sein kann.
70
+
Es ist auch möglich einzelne Zeilen in die Datei zu schreiben, was grade bei größeren Texten sinnvoll sein kann.
74
71
75
72
```python
76
73
content =10*["spam"]
@@ -92,8 +89,7 @@ file_object.close()
92
89
```
93
90
94
91
## An eine Datei anfügen
95
-
Beim Anhängen an eine Datei wird beim Öffnen der Datei der Zeiger auf das Dateiende gelegt,
96
-
sodass etwas, das in die Datei geschrieben wird, an das Ende der Datei dran gehangen wird.
92
+
Beim Anhängen an eine Datei wird beim Öffnen der Datei der Zeiger auf das Dateiende gelegt, sodass etwas, das in die Datei geschrieben wird, an das Ende der Datei dran gehangen wird.
97
93
98
94
```python
99
95
content =100*"spam\n"
@@ -104,5 +100,4 @@ file_object.close()
104
100
```
105
101
106
102
Ebenso wie beim Schreiben, wird die Datei erstellt, sollte sie nicht vorhanden sein.
107
-
Das Verhalten der Methoden `writeline()`und `writeline()`ist in diesem Modus analog zu ihrem
108
-
Verhalten im Schreiben Modus.
103
+
Das Verhalten der Methoden `writeline()`und `writeline()`ist in diesem Modus analog zu ihrem Verhalten im Schreiben Modus.
Zum Anfang betrachten wir, was genau Rekursion ist. Im Grunde ist Rekursion
4
-
nämlich nur ein Sprachfeature, dass eine Funktion sich selber aufrufen kann.
5
-
Jedoch ist eine Programmiersprache auch ohne Rekursion Turing komplett, d.h. ich
6
-
kann jedes Programm auch ohne Rekursion implementieren. Das wird unter anderem
7
-
dadurch deutlich, dass eine rekursive Funktion beim Übersetzen in Maschinencode
8
-
als Schleife ausgeführt wird. Zusammenfassend kann man also sagen:
3
+
Zum Anfang betrachten wir, was genau Rekursion ist. Im Grunde ist Rekursion nämlich nur ein Sprachfeature, dass eine Funktion sich selber aufrufen kann. Jedoch ist eine Programmiersprache auch ohne Rekursion Turing komplett, d.h. ich kann jedes Programm auch ohne Rekursion implementieren. Das wird unter anderem dadurch deutlich, dass eine rekursive Funktion beim Übersetzen in Maschinencode als Schleife ausgeführt wird. Zusammenfassend kann man also sagen:
9
4
10
5
> Alles was sich iterativ implementieren lässt, lässt sich auch rekursiv
11
6
> implementieren und anders herum.
12
7
13
-
Rekursion bietet sich an, da viele Algorithmen rekursiv definiert sind und daher
14
-
rekursiv leichter zu implementieren sind als iterativ. Damit ist jedoch nicht
15
-
gesagt, dass die rekursive Implementierung die effizientere ist.
16
-
Ein einfaches Beispiel dafür sind die Fibonacci-Zahlen.
8
+
Rekursion bietet sich an, da viele Algorithmen rekursiv definiert sind und daher rekursiv leichter zu implementieren sind als iterativ. Damit ist jedoch nicht gesagt, dass die rekursive Implementierung die effizientere ist. Ein einfaches Beispiel dafür sind die Fibonacci-Zahlen.
17
9
18
10
## Die Fibonacci-Zahlen
19
-
Die Fibonacci-Zahlen tauchen in der Natur auf und sind eine relativ schnell
20
-
wachsende Zahlenfolge, die folgendermaßen definiert ist:
11
+
Die Fibonacci-Zahlen tauchen in der Natur auf und sind eine relativ schnell wachsende Zahlenfolge, die folgendermaßen definiert ist:
21
12
```
22
13
fib(0) = 1
23
14
fib(1) = 1
24
15
fib(n) = fib(n-2) + fib(n-1)
25
16
```
26
17
### Einfache rekursive Implementierung
27
18
28
-
Die Definition ist eindeutig rekursiv, folglich wäre der simpelste Ansatz diese
29
-
Zahlenfolge zu implementieren die folgende:
19
+
Die Definition ist eindeutig rekursiv, folglich wäre der simpelste Ansatz diese Zahlenfolge zu implementieren die folgende:
Dieser Code funktioniert, ist leicht zu lesen hat aber einige Nachteile:
30
+
40
31
#### Rekursionslimit
41
-
Der Rekursion ist ein Limit gesetzt, weshalb der Code bei größeren Zahlen in
42
-
einen `RecursionError`laufen wird. In diesem Fall passiert dies schon sehr früh,
43
-
weil es zwei rekursive Aufrufe in der Funktion gibt.
32
+
33
+
Der Rekursion ist ein Limit gesetzt, weshalb der Code bei größeren Zahlen in einen `RecursionError`laufen wird. In diesem Fall passiert dies schon sehr früh, weil es zwei rekursive Aufrufe in der Funktion gibt.
34
+
44
35
#### Laufzeit
45
-
Das weitaus größere Problem ist die Laufzeit, denn dadurch, dass fibR(n-2) und
46
-
fibR(n-1) aufgerufen werden, wird fibR() immer häufiger aufgerufen:
36
+
37
+
Das weitaus größere Problem ist die Laufzeit, denn dadurch, dass fibR(n-2) und fibR(n-1) aufgerufen werden, wird fibR() immer häufiger aufgerufen:
47
38
```
48
39
n = 5
49
40
fibR(5) wird 1 mal aufgerufen
@@ -53,15 +44,12 @@ fibR(2) wird 3 mal aufgerufen
53
44
fibR(1) wird 5 mal aufgerufen
54
45
fibR(0) wird 8 mal aufgerufen
55
46
```
56
-
Wenn man sich die Anzahl der Aufrufe genau anschaut, stellt man fest dass es
57
-
sich um die Fibonaccifolge handelt. Die rekursive Implementation berechnet also
58
-
ihre eigene Laufzeit. Da die Fibonaccifolge aber relativ schnell wächst, wächst
59
-
auch die Laufzeit relativ schnell.
47
+
Wenn man sich die Anzahl der Aufrufe genau anschaut, stellt man fest dass es sich um die Fibonaccifolge handelt. Die rekursive Implementation berechnet also ihre eigene Laufzeit. Da die Fibonaccifolge aber relativ schnell wächst, wächst auch die Laufzeit relativ schnell.
60
48
61
49
### Lösung
62
-
Da jeder Algorithmus sowohl rekursiv, als auch iterativ implementiert werden
63
-
kann und die rekursive Implementation Probleme aufwies, versuchen wir jetzt die
64
-
Fibonacci Folge iterativ zu implementieren:
50
+
51
+
Da jeder Algorithmus sowohl rekursiv, als auch iterativ implementiert werden kann und die rekursive Implementation Probleme aufwies, versuchen wir jetzt die Fibonacci Folge iterativ zu implementieren:
Diese Funktion implementiert die Folge iterativ, läuft daher nicht in einen
74
-
`RecursionError` benötigt `n` Durchläufe der Schleife, ist also deutlich
75
-
schneller als die rekursive Implementierung.
61
+
62
+
Diese Funktion implementiert die Folge iterativ, läuft daher nicht in einen `RecursionError` benötigt `n` Durchläufe der Schleife, ist also deutlich schneller als die rekursive Implementierung.
76
63
77
64
### Fazit
78
-
Die beiden gezeigten Implementierungen eines einfachen Problems, waren ungefähr
79
-
gleich komplex, haben sich aber in der Laufzeit stark unterschieden.
80
-
Beide Möglichkeiten der Implementation haben jedoch ihre Vorzüge, weshalb im
81
-
Einzelfall entschieden werden muss, mit welcher Methode ein Algorithmus
82
-
implementiert wird.
65
+
Die beiden gezeigten Implementierungen eines einfachen Problems, waren ungefähr gleich komplex, haben sich aber in der Laufzeit stark unterschieden. Beide Möglichkeiten der Implementation haben jedoch ihre Vorzüge, weshalb im Einzelfall entschieden werden muss, mit welcher Methode ein Algorithmus implementiert wird.
0 commit comments