Hinweise und Anmerkungen zu Jupyter Notebooks¶
(c) 2026 Technische Hochschule Augsburg - Fakultät für Informatik - Prof.Dr.Nik Klever - Impressum
Table of Contents¶
Zellenstruktur¶
Jupyter Notebook ist - analog wie IPython - in einer Zellenstruktur aufgebaut. Es gibt im wesentlichen zwei Arten von Zellen:
- Markdown (HTML) bzw. Text-Zellen
- Code-Zellen, deren Code dem Kernel entsprechen muss
Markdown (HTML) Zellen¶
Die Markdown-Syntax von Jupyter Notebook ist identisch mit der Markdown Syntax von GitHub
Der hier folgende Inhalt einer Markdown Zelle
### Unterkapitel Überschrift
einfacher Text in einem **Paragraphen**
Blocktext
#### Abschnitt Überschrift
#### Listen und Tabellen
##### geordnete Listen
1. Top 1
1. Top 2
1. Top 3
bzw.
##### ungeordnete Listen
- Listenpunkt 1
- Listenpunkt 2
- Listenpunkt 3
##### einfache Tabelle
| Tabelle | Spalte 1 | Spalte 2 | Spalte 3 |
| ------- | -------- | -------- | -------- |
| Zeile 1 | Zelle 11 | Zelle 12 | Zelle 13 |
| Zeile 2 | Zelle 21 | Zelle 22 | Zelle 23 |
| Zeile 3 | Zelle 31 | Zelle 32 | Zelle 33 |
#### eingebetter Code
```python
def f(x):
""" Funktion f(x) = x**2 """
return x**2
```
wird folgendermaßen umgesetzt:
Unterkapitel Überschrift¶
einfacher Text in einem Paragraphen
Blocktext
Abschnitt Überschrift¶
weitere Unter-Überschrift¶
Listen und Tabellen¶
geordnete Listen¶
- Top 1
- Top 2
- Top 3
bzw.
ungeordnete Listen¶
- Listenpunkt 1
- Listenpunkt 2
- Listenpunkt 3
einfache Tabelle¶
| Tabelle | Spalte 1 | Spalte 2 | Spalte 3 |
|---|---|---|---|
| Zeile 1 | Zelle 11 | Zelle 12 | Zelle 13 |
| Zeile 2 | Zelle 21 | Zelle 22 | Zelle 23 |
| Zeile 3 | Zelle 31 | Zelle 32 | Zelle 33 |
eingebetteter Code¶
def f(x):
""" Funktion f(x) = x**2 """
return x**2
Mathematische Formeln mittels LaTeX¶
Die folgende Zeile im Markdown-Format
Dies ist eine Formel $\frac{sin(x)}{cos(x)}$ im Textfluß, die in einfachen $ eingeschlossen wird.
wird folgendermaßen angezeigt:
Dies ist eine Formel $\frac{sin(x)}{cos(x)}$ im Textfluß, die in einfachen $ eingeschlossen wird.
Weitere Beispiele sind die folgende Zeilen im Markdown-Format
$\int_a^b{ax^2}$
oder
$e^x=\sum_{i=0}^\infty \frac{1}{i!}x^i$
die dann folgendermaßen angezeigt werden:
$\int_a^b{ax^2}$
oder
$e^x=\sum_{i=0}^\infty \frac{1}{i!}x^i$
In den folgenden Zeilen im Markdown-Format werden die LaTeX-Befehle in doppelten $ eingeschlossen:
$$\int_a^b{f(x)dx}$$
$$\lim_{a\to\infty}{ax^2}$$
$$\sum_{i=1}^N i^2$$
und werden deshalb alleinstehend in einer Zeile mittig angezeigt:
$$\int_a^b{f(x)dx}$$
$$\lim_{a\to\infty}{ax^2}$$
$$\sum_{i=1}^N i^2$$
Ein genereller Überblick über LaTeX Befehle findet sich in dem Hilfe-Text von Wikipedia und eine gute Übersicht über die Einbindung von Markdown und Latex in Jupyter Notebooks findet sich im Beitrag Learn How to Write Markdown & LaTeX in The Jupyter Notebook von Khelifi Ahmed Aziz in Towards Data Science. Ebenfalls eine ausführliche Übersicht von TeX-Commands in MathJax findet sich auf der Seite One Mathematical Cat von Carol JVF Burns.
Einbindung von Bildern und Grafik¶
Bilder können, wenn sie auf dem jeweiligen Ordner des Jupyter Notebooks vorhanden sind, einfach über den HTML-Markup
<img src="NameDerBildDatei">
eingebunden werden. Alternativ geht dies auch über die Markdown-Syntax

Wenn die Bilder in entsprechenden anderen Ordner vorhanden sind, muss der entsprechende relative Pfad angegeben werden.
SVG (Scalable Vector Graphic)¶
entweder über die Einbindung eines Image-Links in einer Markdown-Zelle oder in einer Code-Zelle z.B. mit dem Magic-Befehl %%SVG
%%SVG
<svg width="140" height="170" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Code Source from http://commons.oreilly.com/wiki/index.php/SVG_Essentials/Getting_Started#Text -->
<title>Cat</title>
<desc>Stick Figure of a Cat</desc>
<circle cx="70" cy="95" r="50" style="stroke: black; fill: none;"/>
<circle cx="55" cy="80" r="5" stroke="black" fill="#339933"/>
<circle cx="85" cy="80" r="5" stroke="black" fill="#339933"/>
<g id="whiskers">
<line x1="75" y1="95" x2="135" y2="85" style="stroke: black;"/>
<line x1="75" y1="95" x2="135" y2="105" style="stroke: black;"/>
</g>
<use xlink:href="#whiskers" transform="scale(-1 1) translate(-140 0)"/>
<!-- ears -->
<polyline points="108 62, 90 10, 70 45, 50, 10, 32, 62"
style="stroke: black; fill: none;" />
<!-- mouth -->
<polyline points="35 110, 45 120, 95 120, 105, 110"
style="stroke: black; fill: none;" />
<!-- nose -->
<path d="M 75 90 L 65 90 A 5 10 0 0 0 75 90"
style="stroke: black; fill: #ffcccc"/>
<text x="60" y="165" style="font-family: sans-serif; font-size: 14pt;
stroke: none; fill: black;">Cat</text>
</svg>
Code Zellen¶
hier: Python
a=2
b=3
a+b
5
Autovervollständigung¶
Wenn mit einem Buchstaben in einer Code-Zelle begonnen wird, kann mittels der Tab-Taste die Autovervollständigung aktiviert werden und die mit diesem Buchstaben beginnenden Variablen und Objekte können ausgewählt werden:
dies_ist_ein_langer_variablenname = 18
dies_ist_ein_langer_variablenname
18

Neue Code- oder Markdown Zelle¶
Sie können jederzeit neue Code- als auch Markdown-Zellen einfügen und/oder auch vorhergehende Zellen -über einen Doppelklick - nochmal bearbeiten und danach ausführen.
Typisches Problem mit Code-Zellen in Jupyter Notebook¶
Jupyter Notebook besitzt eine Zellenstruktur mit im wesentlichen zwei Typen von Zellen, Code-Zellen und Markdown-Zellen.
Indizierung der Code-Zellen¶
Beim Erzeugen eines neuen Notebooks wird default-mäßig eine Code-Zelle erzeugt. Code-Zellen wie hier in dem bereits bekannten Beispiel

besitzen links neben der eigentlichen Zelle noch eine Markierung In [ ]
Was bedeutet diese Markierung ?¶
In steht für Input und die leeren eckigen Klammern stehen dafür, dass diese Code-Zelle noch nicht ausgeführt worden ist.
Index-Ziffern als Indikator für die Reihenfolge der Ausführung¶
In dem zweiten Beispiel

sind jetzt in den eckigen Klammern vor den Code-Zellen entsprechende Index-Ziffern aufgeführt.
Diese Index-Ziffern werden durch die Reihenfolge der Ausführung der Code-Zellen festgelegt.
Ein [*] in den eckigen Klammern bedeutet, dass die Ausführung der entsprechenden Code-Zelle noch nicht beendet ist - z.B. eine Eingabe erwartet wird, die Ausführung sehr lange dauert oder sogar in einer Endlosschleife hängt.
Historie des obigen Beispiels¶
Hier ist die Entwicklung des Notebooks von dem obigen Beispiel historisch aufgeführt:
- Als erste Zelle wurde In[1] und
- als zweite Zelle In[2] ausgeführt, die Ausgabe des Print-Befehls (2) erscheint dann außerhalb der Zelle,
- anschließend wurde dann In[3] ausgeführt, die Ausgabe dieser Zelle wurde ebenfalls an die Zelle angehängt und mit der Markierung Out[3] versehen, dem Output zur entsprechenden Zelle. Im Gegensatz zur Ausgabe der zweiten Zelle, die eine Ausgabe auf die Standard-Ausgabe (sys.stdout) ist, ist diese Ausgabe der Rückgabewert des entsprechenden letzten Ausdrucks.
- Anschliessend wurde eine neue Zelle zwischen der ersten und zweiten Zelle eingefügt und danach auch ausgeführt als In[4], die Ausgabe erhält daher Out[4].
- Danach wurde eine weitere neue Zelle zwischen der ursprünglichen zweiten Zelle und der ursprünglichen dritten Zelle eingefügt und c = 5 wurde eingegeben, die Zelle wurde jedoch nicht ausgeführt - deswegen sind die eckigen Klammern in der Markierung In[ ] leer.
- Anschliessend wurde eine weitere neue Zelle nach der ursprünglichen dritten Zelle angehängt und dort wurde c eingegeben und die Zelle wurde anschliessend ausgeführt, da jedoch der Ausdruck c = 5 zwar zwei Zellen vorher als Text in die Zelle eingegeben wurde, aber die Zelle nicht ausgeführt wurde, ist die Variable c auch nicht definiert und es wird die Fehlermeldung NameError: name 'c' is not defined in der Standard-Ausgabe ausgegeben.
Bedeutung von [*] als Index¶
[*] als Index bedeutet, dass die entsprechende Code-Zelle entweder
- eine Eingabe erwartet (z.B. über die Funktion input('Bitte geben sie ein:') (s.u.)
- in einer Endlosschleife läuft (s.u.)
- oder das Jupyter Notebook sich sonst irgendwie aufgehängt hat
Abhilfe kann über den Menüpunkt Kernel in der Menüzeile des Jupyter Notebooks und dem betreffenden Untermenüpunkt Interrupt (führt dann in der Regel zu einem KeyboardInterrupt) oder sogar Restart (wenn der Interrupt nicht erfolgreich ist) erfolgen. Bei einem Restart werden jedoch alle bisher vorhandenen Variablen und Objekte, die in den Code-Zellen bis zum Restart ausgeführt worden sind, gelöscht und es müssen alle Code-Zellen wieder neu ausgeführt werden.
Warten auf eine Eingabe¶
x = input("Bitte geben sie eine Zahl ein:")
Bitte geben sie eine Zahl ein:45
x
'45'
Endlosschleife¶
while True:
pass
--------------------------------------------------------------------------- KeyboardInterrupt Traceback (most recent call last) <ipython-input-7-cccdd40a5a4c> in <module>() 1 while True: ----> 2 pass KeyboardInterrupt:
Pygal für eine grafische Ausgabe¶
Die Dokumentation zu Pygal finden sie auf der entsprechenden Webseite von pygal
Pygal ist nicht in der Standardbibliothek von Python vertreten und muss daher vorher installiert werden. Die Installation erfolgt in einem Terminalfenster (unter Linux oder Mac) bzw. in einem Anaconda Prompt Fenster (unter Windows) mit dem folgenden Befehl:
pip install pygal
In dem untenstehenden Beispiel finden sie die grafische Ausgabe der quadratischen Funktion
$$f(x) = 4x^2+2x+2$$
im Bereich [-5,6[
import pygal
def f(x):
return 4*x**2+2*x+2
tabelle = []
for x in range(-5,6):
tabelle.append((x,f(x)))
print(tabelle)
xy = pygal.XY()
xy.add('f(x)=4x^2+2x+2',tabelle)
from IPython.display import SVG
SVG(xy.render())
[(-5, 92), (-4, 58), (-3, 32), (-2, 14), (-1, 4), (0, 2), (1, 8), (2, 22), (3, 44), (4, 74), (5, 112)]
Weitere Quellen¶
- jupyter.org/try mit interaktiven Demo-Notebooks
- Getting Started mit Jupyter Notebook ein Tutorial als Beispiel-Notebook
- Demo Video eines Jupyter Notebooks als Beispiel für die Navigation innerhalb eines Notebooks
- JupyterLab Dokumentation zur Nutzung weiterer Möglichkeiten von Jupyter Notebooks