Veröffentlicht am

Chatbot als Lernassistent zum Programmieren Lernen

Chatbot als Lernassistent

Programmieren lernen ist eine große Herausforderung für Anfänger. Ein ChatBot kann wie ein Lernassistent diese Fragen geduldig beantworten, genau dann, wenn die Antwort am dringendsten benötigt wird. Entscheidend ist, den Chatbot auf die richtige Weise zu befragen, um hilfreiche Antworten zu erhalten.

Denn anders als die Programmiersprache, versteht ein Chatbot natürliche Sprache – auch deutsch.

Dieser Artikel verrät die wichtigsten Prompts, um einen Chatbot als Lernassistenten für das Erlernen der Programmierung einzusetzen.

Natürlich ersetzt der Chatbot keine menschlichen Lehrpersonen. Vielmehr sind sie ein wertvolles zusätzliches Hilfsmittel beim Lernprozess.

Was ist ein Prompt in einem Chatbot

Prompt Engineering die Kunst, geschickt gestellte Fragen an einen Chatbot zu entwerfen. Diese Fragen, auch Prompts genannt, lenken den Chatbot und bestimmen, welche Informationen er uns liefert.

Im Gegensatz zum Erlernen einer Programmiersprache wie Python, setzen wir beim Prompt Engineering auf natürliche Sprache; sogar Deutsch wird von den führenden Chatbots unterstützt.

Welche Chatbots gibt es?

Es gibt viele Chatbots. Sie werden gerne eingesetzt, um automatisch Antworten zu generieren, beispielsweise für die Hilfe-Funktion auf einer Webseite.

Die Entwicklung guter Chatbots ist ein aktives Forschungsfeld und wir werden in Zukunft noch viel über Chatbots hören.

Für unseren Lernassistenten benötigen wir einen Chatbot, der auf einem Large Language Model (LLM) basiert. Hier die Liste der momentan prominentesten Vertreter, die im deutschen Sprachraum zugänglich sind:

  • ChatGPT war der erste Chatbot, der vom breiten Publikum wahrgenommen wurde. Er ging am 30. November 2022 online und wird in der Öffentlichkeit rege diskutiert. ChatGPT wird von OpenAI erstellt und ist momentan kostenlos zugänglich. Bei der Erstregistrierung muss man ein Konto anlegen und einige Fragen beantworten, um zu beweisen, dass man ein Mensch ist und kein Chatbot.
  • Microsofts Bing bietet mit dem Copilot-Feature ebenfalls einen leistungsfähigen Chatbot an. Um auf Prompts zu reagieren, führt dieser Chatbot zunächst eine Websuche über Bing durch. Anschließend generiert er mithilfe von ChatGPT eine Antwort und listet am Ende der Antwort die relevantesten Webseiten auf, die als Grundlage für die Informationen dienten.
  • Gemini ist der Chatbot von Google und ist oft eine gute Alternative zu ChatGPT.

Die Prompts in diesem Artikel funktionieren mit ChatGPT am besten.

Prompts für den Assistenten zum Programmieren Lernen

Ein guter Prompt setzt zuerst einen Kontext und erteilt danach den Auftrag.

1.Der Kontext

Mit dem Kontext definieren wir Rollen. Das kann die eigene Rolle sein, oder diejenige des Chatbots.

Wichtig: Wir nennen immer die Programmiersprache. Falls wir das vergessen, dann wird der Chatbot seine Antwort auf irgendeine beliebige Programmiersprache beziehen.

Ein Beispiel für die eigene Rolle:

Ich habe keine Informatikkenntnisse und möchte mit Python programmieren lernen.

Hier definieren wir den Kenntnisstand – keine Informatikkenntnisse.

Unsere Absicht: Programmieren lernen.
Und wichtig: wir präzisieren die Absicht: Python lernen.

Weiteres Beispiel:

Ich habe Erfahrungen mit Java und möchte Python programmieren lernen.

Mit diesem Kontext wird der Chatbot völlig anders antworten als mit dem ersten Kontext.

Noch ein Beispiel:

Ich bin Informatiker mit fortgeschrittenen Python-Kenntnissen und möchte Pandas lernen.

Formulieren wir nur den Kontext im Prompt, dann wird der Chatbot eine Antwort geben. Diese entspricht höchstwahrscheinlich nicht unserer Erwartung. Wir müssen präziser werden.

2. Der Auftrag an den Chatbot

Damit der Chatbot präzise antwortet, formulieren wir den Auftrag ebenfalls sehr präzise.

Hier ein Beispiel:

Generiere 10 Übungen, um mit dem Programmieren zu beginnen.

Damit erhalten wir eine Liste von Übungsbeispielen.

Diese können wir der Reihe nach durcharbeiten und eigene Lösungen finden.

Doch möglicherweise haben wir keine Ahnung, wie wir damit beginnen sollen.

Der Dialog mit dem Chatbot

Fragen wir also den Chatbot und beginnen einen Dialog.

Hier ein Beispiel:

Generiere eine Lösung zu 2.

Das funktioniert, wenn der Chatbot eine Liste mit Übungsaufgaben generiert hat, und wir eine Lösung zum zweiten Element der Liste haben möchten.

Haben wir die Lösung verstanden, dann benötigen wir weitere Übungen von dieser Art:

Generiere weitere Aufgaben, ähnlich wie 2.

Oder wir haben eine Übungsaufgabe erhalten und sehen einfach nicht, wie wir das anpacken können;

Generiere eine Lösung zur folgenden Aufgabe:
Hier formulieren wir die Aufgabe.
 

Oder wir haben eine Lösung verstanden und ein Befehl ist unklar:

Erläutere den Befehl hier den Befehl nennen

also beispielsweise

Erläutere den Python-Befehl input()

Der Dialog kann beliebig fortgesetzt werden. Wir sind uns selbst lieb und versuchen mit Hilfe des Chatbots zu lernen und zu verstehen. Das erreichen wir nicht, wenn wir einfach eine Lösung generieren lassen und gleich weitergehen, ohne sich mit der Lösung zu befassen.

Die Antwort des Chatbots

Der Chatbot “weiss” nichts, er generiert die Antworten mit Hilfe von sehr großen statistischen Modellen, die aus einer gigantischen Menge von Texten abgeleitet wurden. Man sagt, dass ein Modell trainiert wurde. Bei modernen Chatbots kommen Large Language Models (LLM) zum Einsatz.

Der Chatbot generiert die Wort für Wort und berechnet jeweils die Wahrscheinlichkeit für das folgende Wort.
Der Chatbot arbeitet also nach dem Zufallsprinzip. Das hat Auswirkungen auf die Antwort:

  • Der Chatbot antwortet auf dieselbe Frage immer verschieden (es sei denn, wir können die Zufälligkeit steuern, mit der der Chatbot antwortet).
  • Die Antwort des Chatbots ist vielleicht gar nicht korrekt. Das bedeutet, dass wir die Antworten immer überprüfen müssen. Antwortet der Chatbot also mit Python-Code, dann müssen wir den Code überprüfen – als Anfänger einfach “ausprobieren”. Als Fortgeschrittene analysieren wir den vorgeschlagenen Code sehr kritisch.
  • Der Chatbot antwortet auch mit Vorurteilen – also Bias. Die Vorurteile hat der Chatbot aus den Texten gelernt, die beim Training des LLMs verwendet wurden und plappert sie einfach nach. Das wird bei Fragen zum Programmieren lernen wahrscheinlich nicht passieren.
  • Der Chatbot kann halluzinieren. Stellen wir Fragen, für die der Chatbot während des Trainings keine oder zu wenig Texte “gesehen” hat, dann wird der Chatbot aufgrund der vorhandenen Wahrscheinlichkeiten eine Antwort zusammenreimen. Zu Grundlagen mit Python haben die genannten Bots genügend Texte gesehen und werden in der Lage sein, über die ersten Anfängerhürden hinweg zu helfen.
  • Der Chatbot kann keine komplexen Programme schreiben. Wir erhalten vielmehr Hinweise für kleinere Code Snippets – also ideal zum Programmieren lernen.
  • Der Chatbot ersetzt keine menschlichen Lernpersonen, kann beim Lernen jedoch gut unterstützen.

Beispieldialog

Fazit

Wer programmieren lernen möchte, kann einen Chatbot wie ChatGPT als Lernassistent einsetzen und wird dank geschickt strukturieren, deutschsprachigen Prompts unmittelbar hilfreiche Antworten auf alle Fragen rund um die Programmierung erhalten.

  • Python ist eine vielseitige Programmiersprache. Sie wird gerne genutzt, für Datenanalysen, Data Science und neu auch, um KI-gestützte, intelligente Apps zu entwickeln.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot

  • Chatbot als Lernassistent
  • Prompt Engineering Personas und Wiederholungen
  • AI-Engineering-Fachglossar
  • EBook Tutorial: Cluster aus virtuellen Maschinen
  • Ebook: Apache ZooKeeper
  • Ebook: Realtime Streaming Pipelines
  • LSM-Trees: Log Structured Merge Trees
  • Aufbau einer Enterprise Search
  • Zeit Stream Analytics
  • B-Tree-Index in Datenbanken
  • Ordering Guarantee in Apache Kafka
  • CAP Theorem
  • MapReduce Funktionale Programmierung
  • Konzepte des HDFS
  • Optimistisches Concurrency Control
Veröffentlicht am

Python-Einzeiler mit for und if

Python One-Liner für Data Engineers

Python-Einzeiler mit for und if

Python One-Liner bieten nicht nur Dateningenieuren eine effiziente Möglichkeit, komplexe Datenverarbeitungsaufgaben in kompakter Form zu codieren, indem sie komplexe Operationen in einfache, aber leistungsfähige Codezeilen übersetzen.

Hier ein Beispiel:

[print(x * '*') for x in range(1, 5)]

Der Code produziert folgendes:

*
**
***
****

Wir könnten auch schreiben:

for x in range(1, 5):
    print(x * '*')

Allgemeine Regel für One Liner

Die allgemeine Regel lautet wie folgt:

[Ausdruck Kontext]

Der Python-Interpreter erwartet die eckigen Klammern, um den Einzeiler überhaupt zu erkennen.

Ausdruck engl. Expression

Ein Ausdruck (engl. Expression) ist in der Programmierung ein Konstrukt, das ausgewertet werden kann, um dessen Wert zu bestimmen. Es besteht aus Konstanten, Variablen, Funktionen, Operatoren.

Beispiele:

x + 3
wert == True
print(‘Hello World’)
print(3 * ‘x’)

Kontext für Einzeiler

Der Kontext gibt die Werte an, auf die der Ausdruck angewendet werden soll. Hier können beliebig viele for und if-Statements stehen.

[print(x * '*') for x in range(1, 5) if x % 2 == 0]

Der Output sieht so aus:

**
****

Erläuterung

Zuerst wird also range(1, 5) erzeugt und auf die resultierende Folge wird noch x % 2 == 0 angewendet.

Die Langform lautet wie folgt:

for x in range(1, 5):
   if (x % 2 == 0):
       print(x * '*')

Anmerkung: Dazu wäre die if-Anweisung nicht nötig, wir könnten ja auch sagen range(2,5,2) – doch hier geht es um Einzeiler.

Verschachtelte Listen als einen Einzeiler

Das können wir noch weiter treiben:

[print(x, y) for x in range(3) for y in range(2)]

Probier aus auf dem Python Playground direkt im Browser.

Hier haben wir zwei verschachtelte Listen. Hier die aufgelöste Form:

for x in range(3):
   for y in range(2):
       print(x, y)

Einzeiler mit for und if

Der Phantasie sind keine Grenzen gesetzt:

[print(x, y) for x in range(3) if x % 2 == 0 for y in range(2)]

Hier werden die geraden x ausgewählt. Und jetzt wählen wir noch die ungeraden y und erhalten:

[print(x, y) for x in range(3) if x % 2 == 0 for y in range(2) if y % 2 == 1]

Hier die Langform: Statt einer Zeile benötigt sie ganze fünf Zeilen:

for x in range(3):
   if x % 2 == 0:
       for y in range(2):
           if y % 2 == 1:
               print(x, y)

Ergebnis eines One-Liners als Variable

Sterne ausgeben ist immer hübsch, aber in Wirklichkeit eher nutzlos. Hier eine praktische Einsatzmöglichkeit:

v = [(x,y) for x in range(3) if x % 2 == 0 for y in range(2) if y % 2 == 1]
print(v)

v ist also eine Liste von Tupeln, deren Inhalt den genannten Bedingungen genügt. Ganz schön praktisch für viele Anwendungen.

  • Python ist eine vielseitige Programmiersprache. Sie wird gerne genutzt, für Datenanalysen, Data Science und neu auch, um KI-gestützte, intelligente Apps zu entwickeln.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot

  • Sentence Embeddings für Vektordatenbanken
  • LLMs in Enterprise Search
  • Prompt Engineering Personas und Wiederholungen
  • Chatbot als Lernassistent
  • AI-Engineering-Fachglossar
Veröffentlicht am Schreib einen Kommentar

Bubble Sort: Einen Algorithmus entwickeln

Algorithmus Enwicklen am Beispiel von Bubble Sort

Bubble Sort Algorithmus entwickeln

Wir entwickeln den Bubble Sort Algorithmus. Wir abstrahieren den intuitiven Ansatz mit Pseudocode und Aktivitätendiagram, implementieren in Python und Java und schließen ab mit der Laufzeitbetrachtung.

Dieses Schrittweise Vorgehen können wir für jede Art von Algorithmus anwenden. Oft liegt die Lösung ja nicht auf der Hand und wir tasten uns heran. Der Artikel zeigt, wie das geht.

Intuitiver Ansatz

Der intuitive Ansatz wird oft auch “naiv” ganannt. Das ist nicht abwertend gemeint, sondern bezeichnet den ersten Ansatz eines Algorithmus, der den meiste Leuten auf anhieb einfällt. Ausgehend von diesem naiven Ansatz wird der Algorithmus optimiert – oft ein langer Weg.

Hol dir auch das kostenlose E-Booklet über die Grundlagen der Algorithmen-Entwicklung. Dort werden die Elemente detailliert dargestellt und du findest noch mehr Übungsbeispiele.

Wir entwickeln den Bubble Sort. Dieser gilt als naiver Ansatz – also intuitiv fassbar – um beispielsweise Spielkarten zu sortieren. Am besten holst du ein paar Spielkarten oder etwas Vergleichbars, das du sortieren kannst.

Beobachte dich selbst:

  • Lege die Karten in einer beliebigen Reihenfolge auf den Tisch.
  • Sortiere sie, so wie du das immer machst.

Wie gehst du vor? Welches ist dein Verfahren? Beschreibe es mit einfachen Worten, so ähnlich wie wenn du eine Anleitung zum Karten sortieren schreiben würdest.

Bubble Sort zum Spielkarten sortieren

Wir haben ein kurzes Video gedreht, das zeigt, wie Spielkarten mit dem Bubbe Sort sortiert werden. Klick auf das +-Zeichen und schau dir das Video an.

Video Bubble Sort

Kannst du den Algorithmus des Bubble-Sort erkennen? Beschreibe ihn mit eigenen Worten.

Bubble Sort im Pseudocode

Pseudocode ist eine leicht formalisierte aber nicht standardisierte Art, um einen Algorithmus aufzuschreiben. Schreibe Pseudocode noch bevor du den Code in einer Programmiersprache aufschreibst. So gelingt es dir, Ordnung in die Gedanken zu schaffen und Strukturen zu erkennen. Mehr Beispiele in Pseudocode findest du im E-Booklet Grundlagen Algorithmen.

Klick aufs +-Zeichen und untersuche den Pseudocode zum Bubble Sort.

Beispiel Pseudocode für Bubble Sort

Der Einfachheit halber nummerieren wir die Schritte.

Die Einrückungen machen den Pseudocode übersichtlicher.

01 Wiederhole den folgenden Vorgang, bis du in einem Durchlauf von Schritt 02 bis 08 keine Vertauschung vornehmen musst:

02   Beginne links.

03   Wiederhole den folgenden Vorgang für die ganze Kartenreihe:

04     Vergleiche zwei nebeneinander liegende Karten.

05     Ist der Wert der Karte links größer als der Wert der Karte rechts?

06       dann vertausche die beiden Karten

07     betrachte die nächsten beiden Karten

08     fahre weiter bei Schritt 04

Erkennst du den Vorgang aus dem Video wieder?

Versuche mit Hilfe dieses Pseudocodes deine Spielkarten zu sortieren.

Bubble Sort als Aktivitätendiagramm

Das Aktivitätendiagramm ist eine Alternative zum Bubble-Sort. Beide Hilfsmittel dienen dazu, einen Algorithmus zu formulieren noch bevor wir diesen in einer Progammiersprache codieren.

Klicke erneut auf das +-Zeichen und untersuche das Aktivitätendiagramm zum Bubble Sort.

Beispiel Aktivitätendiagramm für Bubble Sort

Aktivitätendiagramme oder Flowcharts, sind eine weitere Möglichkeit, um eine Idee für einen Algorithmus zu skizzieren. Papier, Bleistift und Radiergummi sind völlig ausreichend.Bubblseort Aktivitätendiagramm

Versuche mit Hilfe des Aktivitätendiagramms deine Spielkarten zu sortieren.

Bubble Sort in Python

Haben wir den Algorithmus als Pseudocode oder Aktivitätendiagramm entwickelt, dann wollen wir diesen in einer Programmiersprache implementieren.

Wir nehmen hier Python – du kannst den Code auch gleich ausprobieren auf dem Python Playground.

Beispiel Python Code für Bubble Sort

Erinnere: Einrückungen sind in Python ein wichtiges Sprachelement. Wir haben auch im Pseudocode damit gearbeitet.

Wir können den Algorithmus schrittweise entwickeln. Das Vorgehen kannst du mit einer beliebigen Sprache nachvollziehen.

Zuerst benötigen wir eine geeignete Datenstruktur. Wir nehmen eine Python-Liste.

Und wir benötigen die Möglichkeit, auf ein einzelnes Element in der Liste mit Hilfe eines Indexes zuzugreifen.

Mit der Python-Funktion len() bestimmen wir die Länge der Liste. So können wir bestimmen, ob wir “ganz rechts” angelangt sind.

Das folgende Code-Snippet zeigt diese Python-Sprachelemente. Wir geben jedes Element der Liste auf einer Zeile aus.

liste = [6 ,5, 4, 3, 2, 1]
length = len(liste)
for i in range(length):
print(liste[i])

Die Liste im Beispiel ist absteigend sortiert – wir wollen sie jetzt aufsteigend sortieren. Du kannst auch mit einer völlig unsortierten Liste testen. Vergiss die negativen Zahlen nicht, auch diese sollten korrekt behandelt werden.

Als erstes implementieren wir einen Durchlauf: Wir durchlaufen die Liste einmal und nehmen die notwendigen Vertauschungen vor. Das Vertauschen von Variablen funktioniert in Python besonders einfach. Die Hintergründe dazu erfährst du im Blog Post über Variablen tauschen in Java und Python. Dort siehst du auch, wie in anderen Sprachen Elemente vertauscht werden.

Hier das Code-Snipped für einen Durchgang. Wir wollen ja immer benachbarte Elemente vergleichen. Die Variable i0 hilft dabei. Wir müssen darauf achten, sie rechtzeitig nachzuführen.

liste = [6 ,5, 4, 3, 2, 1]
i0 = 0
for i in range(1, length):
  print(liste)
  if (liste[i0] > liste[i]):
    (liste[i0], liste[i]) = (liste[i], liste[i0])
    i0 = i
print(liste)

Hast du den Code im Python Playground ausgeführt? Hast du bemerkt, wie die 6 von links nach rechts wandert und schon nach einem Durchlauf am Ende steht. Wie eine kleine Blase wandert die Vertauschung durch die Liste und von da kommt auch der Name des Algorithmus.

Jetzt wiederholen wir den Vorgang so lange, bis keine Variable mehr vertauscht wird. Dazu benötigen wir einen Merker. Wir nennen diese Variable swapped – immerhin bedeuted vertauschen im englischen ja swap. Wir merken uns also, ob in einem Durchlauf geswappt wurde.

Beachte im Code Snippet wo diese Variable verändert wird. Auch die Variable i0 muss korrekt nachgeführt werden.

 

liste = [6 ,5, 4, 3, 2, 1]
length = len(liste)
swapped = True
while swapped == True:
  i0 = 0
  swapped = False
  for i in range(1, length):
    print(liste)
    if (liste[i0] > liste[i]):
      (liste[i0], liste[i]) = (liste[i], liste[i0])
      swapped = True
    i0 = i
print(liste)

Sortieren ist so wichtig und so oft verwendet, dass die allermeisten Programmiersprachen bereits einen guten Sortieralgorithmus mitbringen.

Zwei Varianten in Python:

Sortieren in Python als Methode

liste = [6 ,5, 4, 3, 2, 1]
liste.sort()
print(liste)

Sortieren in Python als Funktion

liste2 = sorted(liste)
print(liste)
print(liste2)

Der Unterschied – die Funktion liefert eine neue Liste zurück – die unsortierte Liste bleibt erhalten. Die Methode sortiert die Liste in sich.

Bubble Sort in Java

Wir können den Algorithmus ja ein einer beliebigen Programmiersprache implementieren. Es folgt ein Beispiel in Java. Der Code ist Eins-zu-Eins aus Python übersetzt. Klicke aufs +-Zeichen und vergleiche mit dem Python-Code.

Beispiel Java Code für Bubble Sort

Java ist eine typsichere Sprache – wir müssen also immer den Datentyp definieren.

Eine einfache Möglichkeit, den Inhalt des Arrays anzuzeigen müssen wir uns ebenfalls selbst schaffen – hier mit Hilfe der Methode print().

Variablen vertauschen geht auch nicht so elegant wie in Python – wir könnten statt der drei Zeilen auch eine weitere Methode schreiben, z.B. swap()

class BubbleSort {
  public static void main(String[] args) {
    int[] liste = {6, 5, 4, 3, 2, 1} ;
    int length = liste.length;
    boolean swapped = true;
    while (swapped) {
    int i0 = 0;
    swapped = false;
    for (int i = 1; i < length; i++) {
      print(liste);
      if (liste[i0] > liste[i]) {
        int hilfsfeld = liste[i0];
        liste[i0] = liste[i];
        liste[i] = hilfsfeld;
        swapped = true;
      }
      i0 = i;
      }
      print(liste);
    } 
  }
  private static void print(int[] liste) {
    for (int i=0; i<liste.length; i++) {
      System.out.print(" "+liste[i]);
    }
    System.out.println();
  }
}

Laufzeitverhalten des Bubble Sort

Hast du bemerkt, wie oft ein Vergleich vorgenommen wird?

Wir haben 6 Elemente in der Liste und es wurden 36 Vergleiche vorgenommen. Wir haben ja pro Vergleich ein print() programmiert. Wir hätten auch einen Zähler mitführen können.

Man sagt, dass das Laufzeitverhalten des Bubble Sort O(n*n) ist – als quadratisch in Bezug auf die Anzahl Elemente in der Liste. Das ist ein denkbar schlechtes Laufzeitverhalten. Man bemerkt es, wenn große Listen sortiert werden.

Der Bubble Sort ist ja auch der naive Ansatz zum Sortieren. Es wurde viel geforscht und eine ganze Reihe optimierter Algorithmen wurden entwickelt.

Sie schnellsten Sorts haben ein Laufzeitverhalten von beispielsweise O(n log(n)).

Weitere Sortieralgorithmen

Es eine ganze Reihe von Sortier-Algorithmen. Diese haben unterschiedliche Eigenschaften und jeder hat einen Namen.

  • Bubble-Sort
  • Shaker Sort
  • Selection Sort
  • Insertion Sort
  • Heap Sort
  • Quick Sort
  • Merge Sort
  • Shell Sort
  • Radix Sort

Die Verfahren sind unterschiedlich schnell und verbrauchen unterschiedlich viel Speicherplatz. Einige davon sind ganz schön raffiniert, wie beispielsweise der Quick Sort.

Wir können viel über Algorithmen lernen, indem wir die verschiedenen Verfahren zum Sortieren studieren. Letztendlich erreichen sie alle dasselbe Ziel. Doch der Weg ist sehr unterschiedlich.

Programmieren lernen

Wer programmiert, entwirft zuerst einen Algorithmus. Erst danach wird der Algorithmus in einer Programmiersprache codiert und getestet.

Der Lernprozess geht Hand-in-Hand: Wer Programmieren lernen will, braucht viele kleine Beispiele, um gleich auch zu lernen, wie ein Algorithmus entsteht. Der Bubble-Sort ist ein klassischer Algorithmus, der zu jeder Ausbildung dazu gehört, und schon einige Grundkenntnisse voraussetzt.

Damit du diese Grundkenntnisse erlangen kannst, haben wir das E-Book Spiel mit Python geschrieben. Schau rein:

  • Python ist eine vielseitige Programmiersprache. Sie wird gerne genutzt, für Datenanalysen, Data Science und neu auch, um KI-gestützte, intelligente Apps zu entwickeln.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot

  • Sentence Embeddings für Vektordatenbanken
  • LLMs in Enterprise Search
  • Prompt Engineering Personas und Wiederholungen
  • Chatbot als Lernassistent
  • AI-Engineering-Fachglossar
Veröffentlicht am

Variablen tauschen in Python und Java

Variablen Werte tauschen

Variablen tauschen in Python und Java

Die Werte zweier Variablen sollen vertauscht werden. Eine alltägliche Anforderung die es in sich hat. Ein Rezept funktioniert in jeder Programmiersprache. Doch Python bietet eine besonders einfache Möglichkeit.

Werte von Variablen vertauschen mit Java

Dies ist ein häufig gesehener Anfängerfehler:

/* Variablen definieren und initialisieren */
int a = 47;
int b = 11;
/* Variablen tauschen */
a = b;
b = a;
/* Variablen ausgeben */
System.out.println("a="+a+" b="+b);

Das Ergebnis der Bemühung sieht so aus:

a=11 b=11

Die Erklärung ist mehrstufig:

Das Gleichheitszeichen

Das Gleichheitszeichen ist nicht die mathematsiche Gleichheit sondern der Zuweisungsoperator: Der Wert der Variablen links vom Zuweisungsoperator wird mit dem Wert der Variablen rechts vom Zuweisungsoperator überschrieben. Der alte Wert geht dabei verloren.

Also:

  • Der Befehl a  = b bewirkt, dass der Wert von b, also 11 in die Variable a kopiert wird. Die Variable a hat danach den Wert 11.
  • Der nachfolgende Befehl b = a bewirkt, dass der Wert von a, der jetzt ja 11 beträgt, in die Variable b kopiert wird.

So entsteht das Ergebnis.

Die Abhilfe ist einfach – eine Hilfsvariable:

int hilfsvariable = a;
a = b;
b = hilfsvariable;

Was passiert:

  • Mit int c = a wird eine neue Variable mit der Bezeichnung c definiert und mit dem Wert der Variablen a initialisiert. hilfsvariable hat also den Wert 47;
  • a = b kopiert den Wert der Variablen b in die Variable a. a hat also den Wert 11.
  • b = c kopiert jetzt den Wert der Variable hilfsvariable in die Variable a und diese nimmt damit wie erwartet den Wert 47 an.

Fertig. Das Rezept funktioniet in jeder Programmiersprache – auch in Python.

Variablen tauschen in Python – einfache Variante

Python ist keine typsichere Sprache, wir brauchen also den Datentyp einer Variablen nicht zu definieren. Der Python-Interpreter findet diesen für uns heraus. Der Java Code aus unserem Beispiel sieht in Python so aus:

a = 47
b = 11
c = a
a = b
b = c
print(f'a={a} b={b}')

Probier gleich aus auf dem Python Playground.

Variablen tauschen in Python – fortgeschrittene Variante

Python bietet viel Magie – auch für das Tauschen von Variablenwerten. Statt drei Zeilen reicht eine Zeile: (b, a) = (a, b). Sehr intuitiv, nicht wahr.

a = 47
b = 11
(b, a) = (a, b)
print(f'a={a} b={b}')

Probier gleich aus auf dem Python Playground.

Doch was steckt dahinter? Viele Konzepte laufen zusammen, um diese einfach Möglichkeit anzubieten.

Pointer

Eine Variable in Python bedeutet eigentlich nur einen Verweis auf eine Stelle im Memory. Also eine Adresse. Der Python-Interpreter den Variablen während der Programmausführung die jeweiligen Adressen zu. Das ist auch in anderen Programmiersprachen so.  Der Artikel Primitive Datentypen vergleicht Java und Python im Hinblick auf die Art und Weise, wie Variablen gespeichert werden.

Der Fachbegriff für Verweis ist Pointer (oder Zeiger). Und ein Pointer ist eigentlich eine Adresse im RAM. Die Speicherstellen im RAM sind ja durchnummeriert und die Nummer dient als Adresse. Das können wir uns vorstellen, wie auf diesem Bild:

Variablen und Pointer
Die Speicherstellen sind im RAM nummeriert, d.h. adressiert. So werden Verweise auf Speicherstellen gebildet.

a bedeutet also eigentlich eine Adresse, also ein Zeiger ins RAM (Random Access Memory). Ohne sich darum zu kümmern, verwenden Python-Programmierer ständig Pointers.

In anderen Sprachen, beispielsweise C, sorgt man sich beim Programmieren ständig um Pointers.

Tupel

In Python ist (a, b) ein Tupel – also ein eigener Datentyp. Eigentlich müsste man sagen, ein Objekt des Typs Tupel. Doch das ist zu umständlich.

Tupel sind eingebaute Datentypen – und so können wir sie auch ohne speziellen Aufruf eines Konstruktors verwenden – also einfach (a, b) schreiben und damit ist das Tupel gebildet. Und auch ein Tupel ist als Objekt eigentlich nur ein Pointer.

Tupel im Memory
Tupel haben eine eigene Adresse im Memory. Sie enthalten wiederum Adressen, die auf die Tupel-Elemente verweisen.

Zuweisungszeichen

Das Gleichheitszeichen ist in Python – und nicht nur dort – der Zuweisungsoperator:
Der Wert des Ausdrucks rechts vom Zuweisungszeichen, wird der Variablen links vom Zusweisungszeichen zugeordnet.

Eigentlich werden nur Pointers umgehängt – Das Bild zeigt die folgenden Befehle:

a = 47
c = a
Zuweisung im Memory
Eine Zuweisung hängt Pointer um.

Und das auf die Spitze getrieben münde bei Python in den Code (b, a) = (a, b).

Was der Code bewirkt, sehen wir im Python Playground:

Python Code zum Vertauschen von Variablen

Die Werte der Variablen a und b werden also vertauscht.

So elegant geht das und so viel steckt dahinter.

Der Aufwand der Python-Magie

Eine Extra-Variable c einfügen erscheint auf den ersten Blick umständlich und Python erscheint viel sparsamer.

Doch der Schein trügt: In Python haben wir sogar zwei Extra-Objekte: nämlich das Tupel (a, b) und das Tupel (b, a).

So gesehen ist Python für die Anwender sparsam, doch die Python-Magie kostet im Hintergrund ganz schön viel Platz und auch viel Ausführungszeit.

Zeit ist Geld – das ist nichts Neues. Als Programmiererinnen und Programmierer konzentrieren wir uns gerne auf die unmittelbaren Fragestellungen und da ist Python natürlich attraktiv.

Python-Magie und Datentypen

Python ist eine enorm flexible Sprache. Tupel sind nur einer der Python Datentypen. Hol dir unser praktisches Cheat Sheet mit allen eingebauten Python Datentypen.:

  • Python ist eine vielseitige Programmiersprache. Sie wird gerne genutzt, für Datenanalysen, Data Science und neu auch, um KI-gestützte, intelligente Apps zu entwickeln.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot

  • Sentence Embeddings für Vektordatenbanken
  • LLMs in Enterprise Search
  • Prompt Engineering Personas und Wiederholungen
  • Chatbot als Lernassistent
  • AI-Engineering-Fachglossar
Veröffentlicht am Schreib einen Kommentar

Hardwarekenntnisse für Programmierer

Hardwarekenntnisse für Programmierer

Hardwarekenntnisse für Programmierer

Die Von-Neumann-Architektur ist ein Modell, welches das für die Programmierung notwendige Basisverständis über die Funktion eines Computers vermittelt.

Software und Hardware

Elektroingenieure befassen sich mit der Hardware von Computern, also mit den elektronischen Bauteilen und deren Funktionsweise.

Programmierer schreiben Software für Computer. Damit sind Programme gemeint, welche den Computer eine bestimmte Funktionalität ausführen lassen. Ein Programmierer braucht ein gewisses Grundverständnis für die Hardware. Dieses verschafft er sich mit einem Modell.

Modelle sind für den Programmierer Hilfsmittel, um die Hardware so zu verstehen, dass er Programme korrekt schreiben kann.

Von-Neumann-Architektur

Die Von-Neumann-Architektur ist  eines der frühesten Modelle und es ist immer gut geeignet, um als Anfänger der Programmierung den Einstieg in die Thematik zu finden. Wir betrachten die einfachste Darstellung der Von-Neumann-Architektur. Sie umfasst die folgenden Elemente:

Prozessor (CPU)

Der Prozessor (auch CPU, Central Processing Unit – Zentraleinheit) – ist die wichtigste Komponente eines Computers. Hier wird die eigentliche Rechenarbeit erledigt. Verarbeitet werden Folgen von Bits. Diese werden in Registern gehalten, das sind spezielle Bereiche, in welchen Rechenoperationen ausgeführt werden können.

Aus Sicht der Elektronik handelt es sich bei Bits um Schalterzustände. Aus Sicht der Programmierer können Bits die Werte 0 und 1 annehmen. Die CPU verarbeitet also eine Folge von 0- und 1-Werten. Dabei werden die Regeln der Bool‘schen Logik und der Arithmetik berücksichtigt.

Memory (RAM)

Das Memory (genauer RAM = Random Access Memory)– hier werden Zwischenergebnisse festgehalten, oder auch ganze Programme geladen, um sie schneller verarbeiten zu können. Wird der Rechner ausgeschaltet, dann geht der Inhalt des Memorys verloren. Erst beim Wiederhochfahren des Computers, erhält das Memory wieder Inhalte.

Von-Neumann-Architektur
Schematische Darstellung der Von-Neumann-Architektur

Input- und Output-Devices (I-O Devices)

Ein Computer ist nicht Selbstzweck sondern er verarbeitet Daten, welche er durch ein Eingabegerät erhält und gibt sie weiter an ein Ausgabegerät. Input- und Output-Geräte, also Ein- und Ausgabegeräte, sind sehr vielfältig, vom Touchscreen, über die Tastatur, eine Festplatte oder anderen Computern, ist nahezu alles denkbar.

Festplatte

Eine Festplatte, neu auch ein SSD (Solid State Drive) ist ein spezieller Datenspeicher erhält Daten dauerhaft, d.h. sie bleiben erhalten, auch wenn der Computer ausgeschaltet wird.

Bus

Ein Bus (Control-Bus, Address-Bus, Data-Bus) dient dazu, Kontroll-Information, Adressen und Daten zwischen der CPU dem Memory und den Input- und Output-Geräten zu transportieren.

Die von Neumann Architektur ist eine Referenzarchitektur. Seit ihrere Entwicklung wurde sie weiter verbessert und es kamen weitere Architekturen dazu.

Das Verständnis der von Neumann Architektur ist hilfreich, um Programmieren zu lernen.

Raspberry Pi als Beispiel einer realisierten Von-Neumann Architektur

Raspberry Pi ist der beliebte Einplatinen-Rechner – Single-Board Computer (SBC). Auch dieser implementiert im Wesentlichen die von Neumann Architektur. Wer einen SBC erwirbt, erhält diesen meist eine Platine ohne Gehäuse geliefert. Die Platine enthält die gedruckte Schaltung. CPU, RAM und I-O Devices werden auf der Platine montiert, die Busse werden als Schaltung gedruckt.

Komponenten Raspberry Pi 4
Die wichtigsten Elemente der Von-Neumann-Architektur werden auf der Platine montiert. Die Busse werden "gedruckt" und sind als feine Linien auf der grünen Platine erkennbar.

Das Raspberry Pi verfügt über mannigfaltige Input- und Output-Devices: USB, Ethernet, HDMI. Es gibt kaum eine Device, die man nicht anschließen kann – Tastatur, Maus, Monitor, Kamera und vieles mehr.

Auch die Netzwerk-Verbindungen sind möglich, via Festnetz (Ethernet) oder auch via WiFi.

Die Busse sind aufgedruckt, wer genau hinsieht, erkennt die feinen Linien auf der grünen Platine.

Aus Sicht der Programmierer ist jeder  Computer ist so aufgebaut – ob ganz klein, beispielsweise als Smart-Watch oder ganz groß, wie bei einem Server in einem Rechenzentrum. Und das schon seit den ersten Computern und daran hat sich nicht viel geändert. Elektro-Ingenieuresehen das anders: sie verbessern die einzelen Hardware-Komponenten und entwickeln neue I-O-Devices.

  • Sentence Embeddings für Vektordatenbanken
  • LLMs in Enterprise Search
  • Prompt Engineering Personas und Wiederholungen
  • Chatbot als Lernassistent
  • AI-Engineering-Fachglossar
  • Python ist eine vielseitige Programmiersprache. Sie wird gerne genutzt, für Datenanalysen, Data Science und neu auch, um KI-gestützte, intelligente Apps zu entwickeln.

  • LLM-Tipps & Fachglossar

    Abonniere meinen Newsletter, erhalte regelmäßig Tipps und Tricks über den produktiven Einsatz von LLMs und ich schenke dir mein umfangreiches Fachglossar Von AI-Engineering bis Zero-Shot