Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:zahlensysteme:binary_collection [2023-05-12 08:01] – [Parallel über zwei Strings] hofgf_informatik:zahlensysteme:binary_collection [2025-05-13 07:38] (aktuell) hof
Zeile 1: Zeile 1:
-## Binärzahlen mit Python+## Binärzahlen in Python: Bausteine 
 +<html><script type="module" src="https://bottom.ch/ksr/ed/bottom-editor.js"></script></html>
  
 Das Dossier enthält mehrere Programmieraufgaben, um Binärzahlen mit Python-Code zu manipulieren. Hier findest du Übungen, Hinweise und Ideen, wie die Umsetzung der Algorithmen in Python gelingen könnte. Das Dossier enthält mehrere Programmieraufgaben, um Binärzahlen mit Python-Code zu manipulieren. Hier findest du Übungen, Hinweise und Ideen, wie die Umsetzung der Algorithmen in Python gelingen könnte.
 +
 ### Schleifen ### Schleifen
 +
 +Bei der *direkten* Schleife ist der Ausdruck hinter `in` die Sequenz der uns interessierenden Elemente (z.B. ein String mit den Binär-Nennwerten `0` oder `1`). Die Schleifenvariable (der Name zwischen `for` und `in`) wird in jedem Schleifendurchgang auf das nächste Element gesetzt.
  
 *Direkte* Schleife über alle Buchstaben eines Strings (einer Zeichenfolge): *Direkte* Schleife über alle Buchstaben eines Strings (einer Zeichenfolge):
-<code python> +<html><bottom-editor style="min-height: 6lh">b = '100110'
-b = '100110'+
 for digit in b: for digit in b:
-    print(digit) +    print(digit)</bottom-editor></html> 
-</code>+
 #### Parallel über zwei Strings #### Parallel über zwei Strings
 +
 +Bei der _indirekten_ Schleife steht der Ausdruck hinter `in` für die Liste der Indices, ist also eine Liste von Ganzzahlen (`int`). Die Schleifenvariable heisst meistens `index` oder kurz `i`. Um auf das uns interessierende Element zuzugreifen, müssen wir einen Listenzugriff programmieren, z.B. `liste[index]`. Mit dem Index kann auch gerechnet werden, um zum Beispiel jedes zweite Element oder die Elemente in umgekehrter Richtung zu erhalten.
  
 *Indirekte* Schleife über die Buchstaben in zwei gleichlangen Strings: *Indirekte* Schleife über die Buchstaben in zwei gleichlangen Strings:
  
-<code python> +<html><bottom-editor>b1 = '10011010'
-b1 = '10011010'+
 b2 = '11110000' b2 = '11110000'
 for index in range(len(b1)): for index in range(len(b1)):
Zeile 21: Zeile 25:
     digit2 = b2[index]     digit2 = b2[index]
     print(digit1, digit2)     print(digit1, digit2)
-</code>+</bottom-editor></html>
  
 Oder mit `while`: Oder mit `while`:
  
-<code python> +<html><bottom-editor>b1 = '10011010'
-b1 = '10011010'+
 b2 = '11110000' b2 = '11110000'
 index = 0 index = 0
Zeile 34: Zeile 37:
     print(digit1, digit2)     print(digit1, digit2)
     index = index + 1     index = index + 1
-</code>+</bottom-editor></html>
  
-Elegante Alternative mit [[https://docs.python.org/2.7/library/functions.html#zip|zip]] (nicht Prüfungsstoff):+Elegante Alternative mit [[https://docs.python.org/3/library/functions.html#zip|zip]] (nicht Prüfungsstoff): _Zip_ ist das englische Wort für Reissverschluss, wir nehmen also abwechslungsweise von jedem Argument ein Element... 🤐
  
-<code python> + 
-b1 = '10011010'+<html><bottom-editor>b1 = '10011010'
 b2 = '11110000' b2 = '11110000'
 for digit1, digit2 in zip(b1, b2): for digit1, digit2 in zip(b1, b2):
     print(digit1, digit2)     print(digit1, digit2)
-</code>+</bottom-editor></html>
  
  
Zeile 50: Zeile 53:
 Erste Möglichkeit: Indirekte Schleife mit Umrechnung des Index: Erste Möglichkeit: Indirekte Schleife mit Umrechnung des Index:
  
-<code python> +<html><bottom-editor>b = '111000'
-b = '111000'+
 for index in range(len(b)): for index in range(len(b)):
     reversed_index = len(b) - 1 - index     reversed_index = len(b) - 1 - index
     digit = b[reversed_index]     digit = b[reversed_index]
     print(digit)     print(digit)
-</code>+</bottom-editor></html>
  
 Etwas kompakter: `range` mit einem Step-Argument: Etwas kompakter: `range` mit einem Step-Argument:
  
-<code python> +<html><bottom-editor>b = '111000'
-b = '111000'+
 # range(start, stop, step): Start with len - 1, stop at 0 (so before -1), increment is -1 # range(start, stop, step): Start with len - 1, stop at 0 (so before -1), increment is -1
 for index in range(len(b) - 1, -1, -1): for index in range(len(b) - 1, -1, -1):
     digit = b[index]     digit = b[index]
     print(digit)     print(digit)
-</code>+</bottom-editor></html>
  
-Noch kompakter: Die Funktion [[https://docs.python.org/2.7/library/functions.html#reversed|reversed]] (nicht Lernstoff) kehrt jede Sequenz (Liste, String) um:+Oder mit `while`: 
 + 
 + 
 +<html><bottom-editor>b = '111000' 
 +index = len(b) - 1  # Letzter gültiger Index 
 +while index >= 0: 
 +    digit = b[index] 
 +    print(digit) 
 +    index = index - 1 
 +</bottom-editor></html> 
 + 
 +Noch kompakter: Die Funktion [[https://docs.python.org/3/library/functions.html#reversed|reversed]] (kein Prüfungsstoff) kehrt jede Sequenz (Liste, String) um:
  
-<code python> +<html><bottom-editor>b = '111000'
-b = '111000'+
 for d in reversed(b): for d in reversed(b):
     print(d)     print(d)
-</code>+</bottom-editor></html>
  
-Noch kompakter (aber auch leserlich?), die Verwendung von [[https://stackoverflow.com/questions/509211/how-slicing-in-python-works/509295#509295|String Slicing]] (nicht Lernstoff):+Noch kompakter (aber auch leserlich?), die Verwendung von [[https://stackoverflow.com/questions/509211/how-slicing-in-python-works/509295#509295|String Slicing]] (kein Prüfungsstoff):
  
-<code python> +<html><bottom-editor>b = '111000'
-b = '111000'+
 for d in b[::-1]: for d in b[::-1]:
     print(d)     print(d)
-</code>+</bottom-editor></html> 
  
 #### Rückwärts über zwei Strings? #### Rückwärts über zwei Strings?
  
 ++++Lösung| ++++Lösung|
-<code python+Am einfachsten mit `while`: 
-b1 = '111000'+ 
 +<html><bottom-editor>b1 = '111000' 
 +b2 = '101010' 
 +index = len(b1) - 1 
 + 
 +while index >= 0: 
 +    digit1 = b1[index] 
 +    digit2 = b2[index] 
 +    print(digit1, digit2) 
 +    index = index - 1 
 +</bottom-editor></html> 
 + 
 +Eleganter mit `reversed` und `zip` (kein Prüfungsstoff): 
 + 
 +<html><bottom-editor>b1 = '111000'
 b2 = '101010' b2 = '101010'
  
 for d1, d2 in zip(reversed(b1), reversed(b2)): for d1, d2 in zip(reversed(b1), reversed(b2)):
     print(d1, d2)     print(d1, d2)
-</code>+</bottom-editor></html> 
 ++++ ++++
  
Zeile 101: Zeile 127:
 Zwei Zahlen `a` und `b` - was gibt a/b (Ganzzahldivision), und wieviel ist der Rest der Division? Zwei Zahlen `a` und `b` - was gibt a/b (Ganzzahldivision), und wieviel ist der Rest der Division?
  
-<code python> +<html><bottom-editor>a = 42
-a = 42+
 b = 2 b = 2
 quotient = a // b quotient = a // b
 rest = a % b rest = a % b
-</code>+print(quotient, rest) 
 +</bottom-editor></html>
  
 ### Strings und Integers ### Strings und Integers
Zeile 112: Zeile 138:
 Jeder Ausdruck in Python hat einen Type. Der Type bestimmt, welche Operationen damit ausgeführt werden können: Mit Zahlen können wir rechnen, mit Zeichenketten nicht. Alle Types können auch als Zeichenkette  Jeder Ausdruck in Python hat einen Type. Der Type bestimmt, welche Operationen damit ausgeführt werden können: Mit Zahlen können wir rechnen, mit Zeichenketten nicht. Alle Types können auch als Zeichenkette 
 (String) dargestellt werden, und aus einem String wieder zurückverwandelt werden. (String) dargestellt werden, und aus einem String wieder zurückverwandelt werden.
 +
 #### Zeichenketten (Strings) #### Zeichenketten (Strings)
  
 Ein `string` ist eine Folge von Buchstaben. Die Folge kann auch leer sein (`''`). Strings sind *immutable*, können also nicht verändert werden. Alle anderen Types müssen sich als String darstellen lassen, indem die Funktion `str()` aufgerufen wird. Strings unterstützen den `+` Operator, um zwei Strings zu verketten. Dies kann verwirrend sein, wenn die Absicht ist, Zahlen zu addieren und stattdessen Strings verkettet werden: Ein `string` ist eine Folge von Buchstaben. Die Folge kann auch leer sein (`''`). Strings sind *immutable*, können also nicht verändert werden. Alle anderen Types müssen sich als String darstellen lassen, indem die Funktion `str()` aufgerufen wird. Strings unterstützen den `+` Operator, um zwei Strings zu verketten. Dies kann verwirrend sein, wenn die Absicht ist, Zahlen zu addieren und stattdessen Strings verkettet werden:
  
-<code python> +<html><bottom-editor>digit1 = '1'
-digit1 = '1'+
 digit2 = '1' digit2 = '1'
  
 summe = digit1 + digit2   # Absicht: Summe soll die Zahl 2 sein summe = digit1 + digit2   # Absicht: Summe soll die Zahl 2 sein
-print(summe)              # Resultat: Summe ist der String '11'+print(summe)              # Resultat: String-Verkettung zu '11'
  
-print(int(digit1) + int(digit2))  # Abhilfe: String in Zahl konvertieren +print(int(digit1) + int(digit2))  # Abhilfe: Strings in Zahlen konvertieren 
-</code>+</bottom-editor></html>
  
 #### Zahlen #### Zahlen
Zeile 132: Zeile 158:
 Strings können in Zahlen umgewandelt werden, wenn der Inhalt des Strings einer Zahl entspricht: Strings können in Zahlen umgewandelt werden, wenn der Inhalt des Strings einer Zahl entspricht:
  
-<code python> +<html><bottom-editor>zahl = int('42'       # OK
-zahl = int('42'       # OK+
 zahl = int('3.14'     # FEHLER! zahl = int('3.14'     # FEHLER!
 zahl = float('3.14'   # OK zahl = float('3.14'   # OK
 zahl = float('foobar' # FEHLER! zahl = float('foobar' # FEHLER!
-</code>+</bottom-editor></html>
  
 Addieren, subtrahieren oder multiplizieren wir zwei Ganzzahlen, resultiert wiederum eine Ganzzahl. Bei der Division hingegen entsteht als Resultat ein `float`. Addieren, subtrahieren oder multiplizieren wir zwei Ganzzahlen, resultiert wiederum eine Ganzzahl. Bei der Division hingegen entsteht als Resultat ein `float`.
Zeile 143: Zeile 168:
 Strings sind *immutable*, anders als bei Listen können wir nicht einfach einen Buchstaben ersetzen in einem String. Aber wir können mit dem `+` Operator zwei Strings verketten, um einen neuen String zu erhalten: Strings sind *immutable*, anders als bei Listen können wir nicht einfach einen Buchstaben ersetzen in einem String. Aber wir können mit dem `+` Operator zwei Strings verketten, um einen neuen String zu erhalten:
  
-<code python> +<html><bottom-editor>s1 = 'foo'
-s1 = 'foo'+
 s2 = 'bar' s2 = 'bar'
 print(s1 + s2)  # prints 'foobar' print(s1 + s2)  # prints 'foobar'
-</code>+</bottom-editor></html>
  
 Dasselbe ist auch praktisch, um Buchstaben in einer Schleife aneinanderzureihen: Dasselbe ist auch praktisch, um Buchstaben in einer Schleife aneinanderzureihen:
  
-<code python> +<html><bottom-editor>def flip_bits(b):
-def flip_bits(b):+
     result = ''                    # start with empty string     result = ''                    # start with empty string
     for digit in b:     for digit in b:
-        if digit = '1':            # if digit is a one...+        if digit == '1':            # if digit is a one...
             result = result + '0'  # ...append a zero             result = result + '0'  # ...append a zero
-        elif digit = '0':+        elif digit == '0':
             result = result + '1'  # otherwise append a one             result = result + '1'  # otherwise append a one
     return result     return result
-</code>+</bottom-editor></html>
  
 **Achtung**: Der `+` Operator für Strings funktioniert nur, wenn beide Operanden Strings sind - falls eine Seite eine Zahl ist, führt das zum Programmabbruch: **Achtung**: Der `+` Operator für Strings funktioniert nur, wenn beide Operanden Strings sind - falls eine Seite eine Zahl ist, führt das zum Programmabbruch:
  
-<code python> +<html><bottom-editor>a = 101       # eine Zahl
-a = 101       # eine Zahl+
 b = '010'     # ein String b = '010'     # ein String
-c = a + b  # Fehler!+c = a + b     # Fehler!
  
 # Zahl umwandeln in String # Zahl umwandeln in String
Zeile 174: Zeile 196:
 # String umwandeln in Zahl # String umwandeln in Zahl
 c = a + int(b)   # OK: + bedeutet Ganzzahl-Addition, c ist die Ganzzahl (int) 111 c = a + int(b)   # OK: + bedeutet Ganzzahl-Addition, c ist die Ganzzahl (int) 111
-</code>+</bottom-editor></html>
  
 **String mit Nullen auffüllen** **String mit Nullen auffüllen**
Zeile 182: Zeile 204:
 Variante 1: Mit `while`: Variante 1: Mit `while`:
  
-<code python> +<html><bottom-editor>b = '1010'
-b = '1010'+
 n = 8 n = 8
 while len(b) < n: while len(b) < n:
     b = '0' + b     b = '0' + b
-</code>+print(b) 
 +</bottom-editor></html>
  
 Variante 2 (nicht Lernstoff): Strings multiplizieren Variante 2 (nicht Lernstoff): Strings multiplizieren
Zeile 193: Zeile 215:
 Strings können übrigens auch mit dem `*` Operator verknüpft werden - zum Beispiel um die Anzahl fehlender Nullen zu erstellen: Strings können übrigens auch mit dem `*` Operator verknüpft werden - zum Beispiel um die Anzahl fehlender Nullen zu erstellen:
  
-<code python> +<html><bottom-editor>b = '1010'
-b = '1010'+
 n = 8 n = 8
 count = n - len(b)    # count = 8 - 4 = 4 count = n - len(b)    # count = 8 - 4 = 4
 zeros = '0' * count   # zeros = '0000' zeros = '0' * count   # zeros = '0000'
 b = zeros + b b = zeros + b
-</code>+print(b) 
 +</bottom-editor></html>
  
  
 Variante 3 (nicht Lernstoff): Eleganter mit [[https://docs.python.org/2.7/library/stdtypes.html?highlight=zfill#str.zfill|zfill]]: Variante 3 (nicht Lernstoff): Eleganter mit [[https://docs.python.org/2.7/library/stdtypes.html?highlight=zfill#str.zfill|zfill]]:
-<code python> + 
-b = '1010'+<html><bottom-editor>b = '1010'
 n = 8 n = 8
-b = b.zfill(n) +print(b.zfill(n)
-</code>+</bottom-editor></html>
  
 ### Funktionen ### Funktionen
  • gf_informatik/zahlensysteme/binary_collection.1683878491.txt.gz
  • Zuletzt geändert: 2023-05-12 08:01
  • von hof