Globale Verständnisfragen

Zum Abschluss dieses Lernmoduls wollen wir noch einmal die wichtigsten Erkenntnisse und Informationen, die Sie aus diesem Lernmodul mitnehmen sollen, mit einigen zusammenfassenden Fragen verschiedenen Typs abfragen und wiederholen. Sie können diese Fragen als "inverted classroom" verstehen, und damit als komplementär zu den vorgeschlagenen größeren Übungen im nächsten Abschnitt. 

Die Idee ist, dass Sie sich hier überlegen können, ob Sie die gestellten Fragen selbst beantworten können. Falls es noch Unklarheiten gibt, können Sie die entsprechenden Antworten nochmals direkt in den passenden Abschnitten des Lernmoduls rekapitulieren. Dementsprechend sind die Antworten auch absichtlich skizzenhaft. Bitte zögern Sie nicht, bei konkreten Fragen einen der Kanäle zur Hilfe zur Selbsthilfe zu nutzen.
 

Vokabeltest

    Was ist der Datentyp des Vergleichs a<b für a,b vom Typ int?
        Der Rückgabetyp jedes Vergleichs ist bool
    Was ist der Datentyp des Vergleichs a<b für a,b vom Typ float?
        Der Rückgabetyp jedes Vergleichs ist bool
    Was ist das Phänomen der Auslöschung bei Gleitkomma-Zahlen?
        Aufgrund der endlichen Repräsentation von Gleitkommazahlen kann es vorkommen, bspw. bei der Addition unterschiedlich großer Zahlen, dass Nachkommastellen einer Zahl "verloren gehen" in der Rechnung. Wenn wir bspw. 10^-16 und 10^16 addieren, fällt die kleinere Zahl völlig unter den Tisch. 
    Erklären Sie den Begriff der Maschinengenauigkeit anschaulich.
        Die Maschinengenauigkeit ist die Größe, um die eine Rundung einer beliebigen Zahl auf eine Gleitkommazahl maximal abweicht, und zwar relativ zur Größe der Ausgangszahl. Andersherum formuliert können zwei Gleitkommazahlen, die beide dieselbe Größe wie die Maschinengenauigkeit besitzen, nicht voneinander unterschieden werden, wenigstens nicht auf der Reiseflughöhe dieses Kurses. 
    Wie werden Listen in Python indiziert?
        Das Sprachfeature dazu ist die eckige Klammer, und mindestens ebenso wichtig ist, dass die Indizierung bei Null startet.
        
        
Syntaxfragen

    Erklären Sie die allgemeine Form einer for Schleife.
        Der abstrakte Syntax lautet: for element in iterierbares_objekt: block
        Mit element können wir im Block beliebige Dinge anstellen
        Ein iterierbares Objekt ist bspw. eine Liste, oder ein range, oder viele andere Dinge mehr, die wir im Laufe des Kurses noch kennenlernen.        
    Erklären Sie die Syntax einer bedingten Anweisung.
        if bedingung: block elif bedingung: block else: block
            bedingung ist hierbei jeweils ein Ausdruck, der zu True auswertet, bspw. ein Vergleich oder das in Konstrukt für Listen
            if, elif, else verhalten sich intuitiv, d.h. es wird immer der erste Block ausgeführt, auf den die entsprechende Bedingung zutrifft.
    Erklären Sie den Syntax einer List Comprehension.
        Comprehensions werden in der nächsten Lerneinheit im Detail eingeführt.
        An dieser Stelle müssen wir nur wissen, dass der Syntax my_list = [ operation(en) for element in iterierbares_objekt ] lautet
        Die eckigen Klammern kennzeichnen, dass das Ergebnis eine Liste sein soll
        Die operation(en) verwenden typischerweise das element, bspw. x**2
        Das iterierbare Objekt ist dasselbe wie bei for Schleifen.
    Wie fügen Sie ein Element in die Mitte einer existierenden Liste ein?
        Zunächst müssen wir den Index des Elements in der Mitte der Liste bestimmen: index = len(my_list)//2. Die ganzzahlige Division ist essentiell, da Listen nur mit ganzzahligen Indices addressiert werden können.
        Danach nutzen wir die insert Funktion: my_list.insert(index, new_element)
    Wie am Anfang der Liste, wie am Ende?
        Für den Anfang müssen wir nur beachten, dass die Indizierung Null-basiert ist: my_list.insert(0, new_element)
        Für das Ende nutzen wir die append Funktion und müssen uns nicht um Indices scheren: my_list.append(new_element)
    Wie wird in Python sichergestellt, dass sich Schleifen und Bedingungen beliebig schachteln lassen?
        Dies geschieht durch Blöcke, wie oben in den Codeskizzen bereits angedeutet. Beachten Sie hier insbesondere, dass ein Block immer in einer neuen Zeile beginnt und durch die Anzahl an Einrückungen eindeutig definiert ist. 


Einfache Verständnisfragen

    Was sind die Unterschiede zwischen den Divisionsoperatoren / und // ? 
        Die Division mit / entspricht der natürlichen Division, die "nicht glatt aufgehen muss", sondern eine float-Zahl liefert. Die Division mit // ist die ganzzahlige Division, d.h. es wird immer auf die nächstkleinere ganze Zahl gerundet im Ergebnis. Beispielsweise ist 5/2 gerade 2.5, und 5//2 ist 2.
    Geben Sie ein Beispiel für eine Gleitkomma-Auslöschung.
        Im Abschnitt über die Besonderheiten von Gleitkomma-Arithmetik, den Miniübungen zum Thema, und natürlich den größeren Übungen finden Sie reichlich inspiration.
    Was ist der Unterschied zwischen einer for und einer while Schleife?
        Die syntaktischen Unterschiede müssen wir hier nicht diskutieren. Semantisch sind beide Schleifen äquivalent, es gibt nichts, was nur mit einer Schleifenform programmiert werden kann, mit der anderen aber nicht. Somit lautet die Antwort "es kommt darauf an", da manchmal for und manchmal while Schleifen effizienter sind, und/oder weniger Code erfordern. Somit ist es im Wesentlichen eine Frage der Erfahrung, wann welche Schleife eingesetzt werden sollte.
    Warum sollten Gleitkommazahlen nie mit == verglichen werden? Wie stattdessen?
        Aufgrund der endlichen Maschinengenauigkeit und der Endlichkeit der Gleitkomma-Repräsentation können Zahlen identisch sein, auch wenn sie es in exakter Arithmetik nicht sind. 
    Warum gibt es die "Zahlen" NaN und inf?
        Im Prinzip aus demselben Grund, bspw. um eine Division durch Null nicht zur Explosion des Computers führen zu lassen. 
    Gibt es Beispiele, die mit List Comprehensions möglich sind, mit einer for Schleife über eine Liste aber nicht?
        Ganz klar nein, da List Comprehensions eine Spezialisierung der for-Iteration über eine Liste sind.
    Gibt es Beispiele, die mit einer for Schleife über eine Liste möglich sind, mit einer List Comprehension aber nicht?
        Bestimmt, ab einem bestimmten Komplexitätsgrad werden Lösungen mit Comprehensions beliebig häßlich.
  
  
Transferfragen

    Schreiben Sie eine Iteration über eine Liste, einmal mit einer for-Schleife, einmal mit einer for-Schleife mit Indices, und einmal mit einer while-Schleife.
    Schreiben Sie ein Programm, dass in Schritten von 1/3 von 0 bis zu einer vorgegebenen Zahl hochzählt. Experimentieren Sie dabei mit verschiedenen Abbruchbedingungen. Erklären Sie dann, warum dies je nach Abbruchbedingung der Schleife eine schlaue oder eine schlechte Idee ist.
        Die Antwort auf beide Fragen finden Sie direkt als Code in diesem Verzeichnis
    Erläutern Sie den Durchlauf durch eine Schleife im von Neumann Gedankenmodell, insbesondere unter Verwendung des program counter.
        Der Intepreter erreicht die erste Zeile mit for, der program counter springt zur Bedingung
        Die Bedingung wird ausgewertet, die CPU entscheidet ob der Block betreten wird
        Der program counter springt zum Block, und springt sukzessive durch den Block
        Der program counter erreicht das Ende des Blocks, und springt zurück zur for-Zeile
        Das Spiel beginnt von vorn.
    Erläutern Sie den Durchlauf durch eine if-elif-elif-else Bedingung im von Neumann Gedankenmodell, insbesondere unter Verwendung des Begriffs program counter.
        Die Antwort ist vollkommen analog zur vorherigen Frage.




