Der fängt mit der Ausgabe einer Lüge an. Es ist sehr wohl möglich etwas anderes als 0 und 1 einzugeben. Wenn der Benutzer keine Zahlen eingibt, bricht das Programm mit einem `ValueError` ab. Wenn er Zahlen eingibt, kann er für jedes Bit eine beliebige ganze Zahl eingeben, auch negative.
Ein- oder zweibuchstabige Variablennamen sind in der Regel keine guten Namen. Namen sollen dem Leser vermitteln was der Wert hinter dem Namen bedeutet. Wenn man `bit` meint, sollte man auch `bit` schreiben, und nicht nur `b`. Das `bx` ein Tupel mit Bitwerten oder `bz` eine Summe von Bits ist, lässt sich aus dem Namen (in Python) nicht erkennen.
Wenn man anfängt Namen durchzunummerieren, dann will man in der Regel bessere Namen wählen, oder gar keine einzelnen Werte sondern eine Datenstruktur. Meistens eine Liste. So auch hier. Statt jedes Bit an einen eigenen Namen zu binden, würde man die in eine Liste stecken. Die Abfrage kann dann in einer Schleife erfolgen, womit man weniger Code hat. Auch das aufaddieren wird dann mit der `sum()`-Funktion einfacher. `bx` fällt dann weg, beziehungsweise wird durch die Liste ersetzt.
`b8` wird am Anfang unnötigerweise mit 0 belegt, diese 0 wird aber (bei korrekter Benutzereingabe) nie verwendet.
Bei dem langen ``if``/``elif``-Konstrukt gibt es im Grunde nur zwei mögliche Ausgänge: Das Prüfbit wird auf 0 oder auf 1 gesetzt. Dazu kann man die ganzen Bedingungen für den jeweiligen Fall auch kombinieren.
Da würde dann diese vier Zeilen bei übrig bleiben:
Code: Alles auswählen
if bit_sum == 1 or bit_sum == 3 or bit_sum == 5 or bit_sum == 7:
check_bit = 1
elif bit_sum == 0 or bit_sum == 2 or bit_sum == 4 or bit_sum == 6:
check_bit = 0
Code: Alles auswählen
if bit_sum in [1, 3, 5, 7]:
check_bit = 1
elif bit_sum in [0, 2, 4, 6]:
check_bit = 0
Code: Alles auswählen
check_bit = sum(bits) & 1
Zuguterletzt würde ich noch feste Zahlen aus dem Code verbannen. Also die Anzahl der Eingabebits als Variable oder Konstante definieren und die Längenangabe bei der Ausgabe der Dualzahlen nicht fest in die Zeichenkette(n) schreiben, sondern anhand der Länge der `bits`-Liste ermitteln.
Zwischenstand:
Code: Alles auswählen
#/usr/bin/env python3
"""Prüfbitbitgenerator"""
def main():
input_bit_count = 7
#
# TODO Actually enforce this restriction!
#
print('!! Nur Eingaben von je einer 0 oder 1 sind möglich !!')
bits = list()
for i in range(1, input_bit_count + 1):
bits.append(int(input(f'{i}. Bit: ')))
assert len(bits) == input_bit_count and set(bits) == {0, 1}
print(f'Ihre eingegebene {len(bits)}-stellige Dualzahl lautet: {bits}')
check_bit = sum(bits) & 1
bits.append(check_bit)
print()
print('Das Prüfbit ist eine: ', check_bit)
print()
print(f'Die {len(bits)}-stellige Dualzahldarstellung lautet: {bits}')
if __name__ == '__main__':
main()