Die Zeichen als Zahlen/Codepoints zu handhaben ist ziemlich ”magisch” und schlecht lesbar, und damit IMHO ”unpythonisch”.
Wenn man korrekterweise ``and`` statt ``&`` verwendet, spart das nicht nur Tests weil ``&`` *immer* beide Seiten auswerten muss, sondern man braucht auch die klammern nicht, weil der ``and``-Operator deutlich weniger stark bindet als ``&``.
Da im ``if`` und im ``elif`` das gleiche gemacht wird, kann man das in *einer* Bedingung zusammenfassen.
Wenn bei einem ``if``/``else`` in einem der Zweige ein ``pass`` steht, hat man was falsch gemacht.
Könnte dann so aussehen:
Code: Alles auswählen
#!/usr/bin/env python3
from string import ascii_lowercase as ALPHABET
VOKALBUCHSTABEN = "aeiou"
assert all(v in ALPHABET for v in VOKALBUCHSTABEN)
def main():
anzahl = 0
for b_1 in ALPHABET:
for b_2 in ALPHABET:
for b_3 in ALPHABET:
for b_4 in ALPHABET:
if not (
(b_1 == b_2 == b_3 and b_1 not in VOKALBUCHSTABEN)
or (b_2 == b_3 == b_4 and b_2 not in VOKALBUCHSTABEN)
):
anzahl += 1
print(f"{anzahl}: {b_1}{b_2}{b_3}{b_4}")
if __name__ == "__main__":
main()