{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Insertion Sort – der Intuitive\n", "\n", "**Sortieren durch Einfügen** ist der intuitive Sortieralgorithmus, den sehr viele Menschen anwenden, wenn sie Spielkarten in die Hand aufnehmen.\n", "\n", "---\n", "**Ziele**\n", "\n", "Sie können\n", "* den Insertion-Sort-Algorithmus in eigenen Worten beschreiben.\n", "* Elemente in eine Liste einfügen und Elemente aus einer Liste löschen.\n", "* Insertion Sort implementieren und Ihre Implementation erklären. \n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Aufgabe 1 – Einstieg**\n", "\n", "Sie spielen Karten und möchten die Karten nach dem Aufnehmen in aufsteigender Reihenfolge (von ♠️6 bis ♠️Ass) in der Hand haben. Überlegen Sie sich, wie Sie beim Aufnehmen vorgehen.\n", "\n", "\n", "\n", "* Reihenfolge, in der Sie die Karten erhalten: \n", " \\[♠️6\\] \\[♠️Ass\\] \\[♠️Dame\\] \\[♠️10\\] \n", " \n", " \n", "* Ziel: \n", " \\[♠️6\\] \\[♠️10\\] \\[♠️Dame\\] \\[♠️Ass\\]\n", " \n", "Es geht in dieser Aufgabe darum, nach Werten zu sortieren. Deshalb sind alle Karten von der gleichen Farbe (♠️)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Hier haben Sie Platz für Ihre Notizen." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In der Praxis wird Insertion Sort zum Sortieren ganzer Listen angewandt. Dennoch ist der Algorithmus sehr ähnlich wie der, den Sie wahrscheinlich anwenden, wenn Sie Ihre Karten beim Aufnehmen in die Hand einsortieren.\n", "\n", "Schauen Sie sich die folgende Animation von [visualgo.net](https://visualgo.net/en/sorting?slide=9) an. Haben Sie es so gemacht?\n", "\n", "*Um den Videoclip sehen zu können, müssen Sie allenfalls die folgende Zelle ausführen.*" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Führen Sie diese Zelle aus, um den Videoclip sehen zu können.\n", "\n", "import IPython\n", "\n", "IPython.display.IFrame(src=\"https://www.youtube.com/embed/3wdko9svsAM?rel=0&controls=0&showinfo=0\", width=560, height=315)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Aufgabe 2**\n", "\n", "Beschreiben Sie den Insertion-Sort-Algorithmus in eigenen Worten. \n", "\n", "Achten Sie dabei auf präzise Formulierungen. (Sie erinnern sich an den [Clip]() mit dem Peanutbutter Sandwich...)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Machen Sie aus dieser Zelle eine Markdownzelle und \n", "# beschreiben Sie den Insertion-Sort-Algorithmus in eigenen Worten." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Implementation\n", "\n", "Nun möchten Sie Insertion Sort implementieren. Da Sie noch dabei sind, den Umgang mit Listen zu üben, werden Sie die Elemente nicht per Platztausch an den richtigen Ort bringen, sondern jeweils den neuen Platz eines einzusortierenden Elements suchen, es am gewünschten Index einfügen und das Element aus der Liste löschen.\n", "\n", "### Einfügen von Elementen in eine Liste\n", "\n", "In Python haben Sie die Möglichkeit, Elemente direkt an der gewünschten Stelle in eine Liste einzufügen. Dies ist nicht in allen Sprachen möglich, und Sie müssten die Elemente verschieben, wie Sie dies weiter oben in der Animation von [visualgo.net](https://visualgo.net/en/sorting?slide=9) gesehen haben. \n", "\n", "Um Insertion Sort in Python zu implementieren, müssen Sie nun wissen, wie ein Element in eine Liste eingefügt werden kann. Dazu können Sie die Funktion `insert(index, element)` verwenden, wobei `index` der Stelle in der Liste entspricht und `element` dem Element, das eingefügt werden soll.\n", "\n", "**Aufgabe 3 – Element in Liste einfügen**\n", "\n", "Gegeben ist eine Liste `wochentage`, in die sich ein Fehler eingeschlichen hat:\n", "\n", "```Python\n", "wochentage = [\"Montag\", \"Dienstag\", \"Mittwoch\", \"Freitag\", \"Samstag\", \"Sonntag\"]\n", "\n", "```\n", "\n", "Fügen Sie den fehlenden Wochentag mit Hilfe der Funktion `insert()` in die Liste `wochentage` ein.\n", "\n", "Geben Sie am Ende die Liste aus und kontrollieren Sie, ob die Wochentage nun korrekt in der Liste `wochentage` abgebildet werden.\n", "\n", "
\n", " \n", " Hinweis 1\n", " \n", "\n", "Schauen Sie sich die Liste an. Welcher Tag fehlt? \n", "
\n", "\n", "
\n", " \n", " Hinweis 2\n", " \n", "\n", "Falls Sie Mühe haben, den Index zu finden, bedenken Sie, dass das erste Element der Liste am Index **0** ist.\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "wochentage = [\"Montag\", \"Dienstag\", \"Mittwoch\", \"Freitag\", \"Samstag\", \"Sonntag\"]\n", "\n", "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Löschen von Elementen aus einer Liste\n", "\n", "Nachdem Sie das Element im sortierten Bereich an der korrekten Stelle eingefügt haben, haben Sie denselben Wert immer noch an der alten Stelle, die aber um einen Platz nach hinten gerutscht ist. Dieses Element müssen Sie nun noch löschen. \n", "\n", "Um das Element am Index `index` aus der Liste zu löschen, benötigen Sie die Funktion `pop(index)`.\n", "\n", "**Aufgabe 4 – Element am Index i aus der Liste löschen**\n", "\n", "Gegeben ist wiederum eine Liste `wochentage`, in die sich ein Fehler eingeschlichen hat:\n", "\n", "```Python\n", "wochentage = [\"Montag\", \"Bonustag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\", \"Sonntag\"]\n", "```\n", "\n", "Sehen Sie sich die Liste an, finden Sie den eingeschobenen Tag und löschen Sie ihn mit Hilfe der Funktion `pop()`.\n", "\n", "Geben Sie am Ende die Liste aus und kontrollieren Sie, ob die Wochentage nun korrekt in der Liste `wochentage` abgebildet werden.\n", "\n", "
\n", " \n", " Hinweis 1\n", " \n", "\n", "Schauen Sie sich die Liste an. Welcher Tag fehlt? \n", "
\n", "\n", "
\n", " \n", " Hinweis 2\n", " \n", "\n", "Falls Sie Mühe haben, den Index zu finden, bedenken Sie, dass das erste Element der Liste am Index **0** ist.\n", "
\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "wochentage = [\"Montag\", \"Bonustag\", \"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Freitag\", \"Samstag\", \"Sonntag\"]\n", "\n", "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die Funktion `pop(index)` löscht aber nicht nur das Element am Index `index`, sondern gibt auch dessen Wert zurück. Deshalb ist es auch möglich, den Wert des zu löschenden Elements, den pop zurückgibt, gleich neu einzufügen.\n", "\n", "**Aufgabe 5**\n", "\n", "In der Liste `wochentage` ist der Montag zu weit hinten:\n", "\n", "```Python\n", "wochentage = [\"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Montag\", \"Freitag\", \"Samstag\", \"Sonntag\"]\n", "```\n", "\n", "Löschen Sie ihn an der falschen Position und fügen Sie den beim Löschen erhaltenen Wert gleich an der richtigen Stelle ein." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "wochentage = [\"Dienstag\", \"Mittwoch\", \"Donnerstag\", \"Montag\", \"Freitag\", \"Samstag\", \"Sonntag\"]\n", "\n", "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sie haben soeben die wichtigsten Listenoperationen kennengelernt, die Sie für die Implementation von Insertion Sort benötigen.\n", "\n", "Nun müssen Sie sich noch einmal genau überlegen, wie der Insertion-Sort-Algorithmus genau funktioniert. \n", "\n", "**Aufgabe 6**\n", "\n", "Schreiben Sie den Insertion-Sort-Algorithmus in Pseudocode.\n", "\n", "
\n", " \n", " Hinweis 1\n", " \n", "\n", "Überlegen Sie sich, welche Elemente verglichen werden müssen, damit die Stelle (der Index) gefunden wird, an der ein Element eingefügt werden muss.\n", "
\n", "\n", "
\n", " \n", " Hinweis 2\n", " \n", "\n", "Da Sie von einer Liste ausgehen und die sortierten Elemente in derselben Liste haben möchten, müssen Sie sich überlegen, welcher Bereich der Liste bereits sortiert ist.\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Machen Sie aus dieser Zelle eine Markdownzelle und \n", "# beschreiben Sie den Insertion-Sort-Algorithmus in Pseudocode." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Aufgabe 7 – Implementation**\n", "\n", "Schreiben Sie nun eine Funktion `insertionsort`, die eine Liste entgegennimmt, sie nach dem Insertion-Sort-Algorithmus in aufsteigender Reihenfolge sortiert und anschliessend wieder ausgibt.\n", "\n", "Sie werden den Algorithmus wiederum Schritt für Schritt implementieren und dabei mit einer kurzen Liste anfangen.\n", "\n", "a) Erstellen Sie eine kurze Liste, bei der bis auf das letzte Element alle Elemente sortiert sind und suchen Sie den neuen Platz für das letzte Element, z.B. `unsortierte_liste = [1,2,3,0]`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "b) Überlegen Sie sich, bis wo Ihre Elemente sortiert sind und ob sich daraus den Index des als nächstes einzusortierenden Elements ableiten lässt." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Machen Sie in dieser Zelle Notizen" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "c) Gehen Sie davon aus, dass Sie die Liste `unsortierte_liste` sortieren wollen. Merken Sie sich das Ende des sortierten Bereichs in der Variable `sortiert_bis` und weisen Sie ihr den ersten Wert zu, den Sie unter (b) ermittelt haben.\n", "\n", "Tipp: `sortiert_bis` soll einen Index enthalten." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Finden Sie nun den Platz, den das nächste Element im sortierten Bereich einnehmen muss.\n", "\n", "Dazu können Sie von hinten nach vorne durch den sortierten Bereich laufen und jedes Element mit dem neu einzusortierenden Element vergleichen, bis Sie entweder am Anfang der Liste sind oder ein Element gefunden haben, das kleiner ist, als das Element, das Sie einsortieren möchten.\n", "\n", "d) Durchlaufen Sie die Liste unsortierte_liste von hinten nach vorne.\n", "\n", "Setzen Sie dazu die Variable sortiert_bis auf das letzte sortierte Element der Beispielliste `unsortierte_liste` und geben Sie alle Elemente der Liste aus.\n", "\n", "Verwenden Sie vorerst immer noch folgende Elemente:\n", "```Python\n", "unsortierte_liste = [1,2,3,0]\n", "sortiert_bis = 2\n", "```\n", "\n", "Hinweis: Wenn Sie rückwärts durch einen Bereich laufen möchten, können Sie eine Schrittweite angeben." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "e) Der neue Index soll in der Variable `neuer_Index` gespeichert werden. Suchen Sie den neuen Index des Elements, indem Sie alle Elemente des sortierten Bereichs mit dem einzufügenden Element vergleichen. Sobald ein Element kleiner ist, haben Sie den Index gefunden.\n", "\n", "Hinweis: Das gefundene Element ist der Nachbar links des einzufügenden Elements." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "f) Wenn Sie den neuen Index gefunden haben, können Sie das Element am alten Index löschen und am neuen Index einfügen.\n", "\n", "Diesen Schritt haben Sie bereits in den Aufgaben 3 bis 5 vorbereitet. Versuchen Sie es noch einmal von vorne oder sehen Sie bei den Aufgaben 3 bis 5 nach. Geben Sie anschliessend die unsortierte Liste aus, die nun sortiert sein sollte, falls Sie immer noch dieselben Elemente verwenden:\n", "\n", "```Python\n", "unsortierte_liste = [1,2,3,0]\n", "sortiert_bis = 2\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "g) Nun können Sie das zu sortierende Element in den sortierten Bereich einfügen. Was jetzt noch fehlt ist eine Schleife, die sicherstellt, dass jedes Element der Liste in den sortierten Bereich eingefügt wird. Diese Schleife kommt um die Schleife herum, die Sie bisher geschrieben haben.\n", "\n", "Ergänzen Sie Ihren bisherigen Code.\n", "\n", "Testen Sie Ihr Programm mit einer zufälligen Liste." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "h) Machen Sie nun eine Funktion `insertion_sort` für den Insertion-Sort-Algorithmus, die eine Liste entgegennimmt, sie nach Insertion Sort sortiert und wieder ausgibt." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Aufgabe 8 – Vergleiche zählen**\n", "\n", "Versuchen Sie die Anzahl Vergleiche zu zählen und diese am Ende auszugeben." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Aufgabe 9 – Anwendung auf verschiedene Ausgangslagen**\n", "\n", "Erstellen Sie nun drei Listen `aufsteigend`, `absteigend` und `zufaellig` der Länge 10, 100 oder 1000 und wenden Sie Ihre Funktion insertionsort() darauf an.\n", "\n", "* Wie viele Vergleiche erwarten Sie? \n", "* Sind Sie von der Anzahl Vergleiche überrascht? \n", "* Wie können Sie die Anzahl Vergleiche in Abhängigkeit von der Länge $n$ der Liste formal beschreiben?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Grafische Darstellung\n", "\n", "Es ist möglich, Ihre Liste in einem Säulendiagramm grafisch darzustellen. Um hier abzukürzen ist die entsprechende Funktion `show_diagram()` gegeben. Sie nimmt folgende Parameter entgegen:\n", "\n", "* `list`: Liste, die dargestellt werden soll\n", "* `title`: Diagrammtitel (optional; Defaultwert: \"Säulendiagramm\")\n", "* `sleep`: Wartezeit in Sekunden (optional, Defaultwert: 0.2)\n", "\n", "Für den Fall, dass Sie sie nachvollziehen möchten, ist sie mit Kommentaren versehen. Dies ist aber optional.\n", "\n", "Führen Sie die folgenden beiden Zellen aus, um die Funktion verwenden zu können.\n", "Die erste Zelle kümmert sich um die Imports. Falls die Bibliotheken nicht installiert sind, steht im Kommentar, wie Sie sie installieren können." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt # PyPlot: Bibliothek für Visualisierungen (Plots)\n", "import numpy as np # NumPy: Bibliothek für numerische Berechnungen\n", "from IPython import display # <--- Jupyter-Notebook-spezifische Bibliothek (ausserhalb von Jupyter: löschen)\n", "\n", "# In der Anacondadistribution ist matplotlib bereits vorinstalliert. \n", "# Falls Ihnen matplotlib oder numpy fehlen, können Sie diese wie folgt installieren, \n", "# kommentieren Sie die folgende Zeile ein (numpy wird mit matplotlib mitinstalliert):\n", "# pip install matplotlib\n", "\n", "def show_diagram(list, title = \"Säulendiagramm\", sleep = 0.2):\n", "\n", " # Den Output der aktuellen Zelle (des Jupyter Notebooks) löschen\n", " # parameter wait=True: warten, bis der neue Output bereitsteht\n", " display.clear_output(wait=True)\n", " \n", " # Balkenindex (x-Koordinaten der Balken)\n", " anzahl_elemente=len(list)\n", " bar_index = np.arange(anzahl_elemente)\n", " # Balkenbreite (1 bedeutet bis zum nächsten Balken)\n", " bar_width = 0.5\n", "\n", " # Titel\n", " plt.title(title)\n", "\n", " # Keine besondere Beschriftung der x- und y-Achsen:\n", " # plt.xticks und plt.yticks nicht definieren\n", "\n", " # Balkendiagramm\n", " plt.bar(bar_index, height=list, width=bar_width, color='blue')\n", "\n", " # Plot anzeigen \n", " plt.show()\n", " \n", " # kurz warten, weil sonst nichts sichtbar\n", " plt.pause(sleep)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Aufgabe 10 – Visualisierung**\n", "\n", "Nun möchten Sie ihre Liste jedes Mal visualisieren, wenn ein Element neu einsortiert wurde.\n", "\n", "Kopieren Sie dazu Ihre Implementation des Insertion-Sort-Algorithmus in die untenstehende Zelle und rufen Sie die Funktion `show_diagram()` so auf, dass jeweils die neue Liste dargestellt wird, sobald ein Element einsortiert wurde.\n", "\n", "Erstellen Sie noch einmal die drei Listen `aufsteigend`, `absteigend` und `zufaellig` und wenden Sie Ihre `insertionsort()`-Funktion auf diese drei Listen an.\n", "\n", "
\n", " \n", " Hinweis\n", " \n", "\n", "Die äussere Schleife kümmert sich darum, dass jedes Element einsortiert wird, während die innere Schleife den sortierten Bereich durchläuft, um den neuen Platz zu finden, an dem das Element eingefügt werden soll.\n", " \n", "Wenn Sie nicht sicher sind, wo Sie `show_diagram()` aufrufen müssen, sollten Sie sich überlegen, wann das Element einsortiert wird. Sobald das Element einsortiert ist, können Sie den neuen Zustand der Liste darstellen.\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code...\n", "# Funktion insertionsort() mit Aufruf der Funktion show_diagram()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code...\n", "# aufsteigende Liste erstellen" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code...\n", "# absteigende Liste erstellen" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Ihr Code...\n", "# zufällige Liste erstellen" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quiz\n", "\n", "Alles klar?\n", "\n", "Sie Insertion Sort nun in eigenen Worten beschreiben und Ihre Implementation erklären können.\n", "\n", "Testen Sie Ihr Verständnis anhand der Fragen, die erstellt werden, wenn Sie die folgenden Zellen gemäss Ihrer Umgebung ausführen.\n", "\n", "### NUR FALLS SIE AUF GOOGLE COLAB ARBEITEN\n", "\n", "Führen Sie bitte die **beiden** folgenden Zellen aus, um die Bibliothek für das Quiz zu laden." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# NUR falls Sie AUF GOOGLE COLAB arbeiten:\n", "# Führen Sie diese Zelle aus, um das Quiz zu sehen.\n", "\n", "%%writefile quizclone.py\n", "import os\n", "from subprocess import getoutput\n", "getoutput(\"git clone -l -s https://github.com/donze-informatikunterricht/quiz.git cloned-repo\")\n", "os.chdir('cloned-repo')\n", "print('repo cloned successfully')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# NUR falls Sie AUF GOOGLE COLAB arbeiten:\n", "# Führen Sie diese Zelle aus, um das Quiz zu sehen.\n", "\n", "import quizclone" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Quiz erstellen (unabhängig von Ihrer Arbeitsumgebung)\n", "\n", "Nun können Sie das Quiz erstellen. Führen Sie dazu bitte die folgende Zelle aus.\n", "\n", "Fragen 3 und 4 des Quiz basieren auf der folgenden Liste:\n", "\n", "```python\n", "a = [2, 3, 7, 1, 6, 8, 4, 0, 5, 9]\n", "```\n", "\n", "Bitte führen Sie die folgende Zelle aus, um das Quiz zu erstellen." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from IPython.display import display\n", "import quiz\n", "\n", "display(quiz.Q1_insertion)\n", "display(quiz.Q2_insertion)\n", "display(quiz.Q3_insertion)\n", "display(quiz.Q4_insertion)\n", "display(quiz.Q5_insertion)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Abschluss: Sortiertanz\n", "\n", "Nun haben Sie sich mit dem Insertion-Sort-Algorithmus auseinandergesetzt. \n", "\n", "Sehr empfehlenswert für Such- und Sortieralgorithmen ist der [YouTube-Kanal AlgoRythmics](https://www.youtube.com/channel/UCIqiLefbVHsOAXDAxQJH7Xw), der Algorithmen in Form von Tänzen präsentiert.\n", "\n", "Führen Sie die folgende Zelle aus, um den Tanz zu Insertion Sort sehen zu können." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Führen Sie diese Zelle aus, um den Videoclip sehen zu können.\n", "\n", "import IPython\n", "\n", "IPython.display.IFrame(src=\"https://www.youtube.com/embed/ROalU379l3U\", width=560, height=315)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }