@nyxx: Bezüglich der Namenschreibweise und Leerzeichensetzung könntest mal einen Blick in den
Style Guide for Python Code werfen.
Funktionen und Methoden werden oft nach Tätigkeiten benannt um sie leichter von Namen unterscheiden zu können die passive Werte bezeichnen. Funktionen oder Methoden die etwas testen haben oft Präfixe wie `is_` oder `has_`, also zum Beispiel `is_prime()` für eine Funktion die eine Zahl darauf testet ob sie eine Primzahl ist.
Code der nach einem ``return`` steht wird niemals ausgeführt weil das ``return`` die Ausführung der Funktion ja beendet.
`Primtest()` ist fehlerhaft, was man eigentlich ziemlich schnell bemerkt haben sollte:
Code: Alles auswählen
In [14]: [(i, Primtest(i)) for i in range(10)]
Out[14]:
[(0, False),
(1, False),
(2, None),
(3, None),
(4, False),
(5, True),
(6, False),
(7, True),
(8, False),
(9, True)]
Die Funktion sollte nicht `None` zurück geben und 9 ist sicher keine Primzahl.
In `Basehochexp()` wird `r` viel zu oft berechnet. Ausserdem ist das kein guter Name.
Vergleiche mit literalen `True`- und `False`-Werten sind unnötig. Dabei kommt entweder immer der Wert heraus mit dem man vergleicht, also kann man auch gleich *den* verwenden, oder immer genau das Gegenteil von dem Wert mit dem man vergleicht, in dem Falle hätte man den mit ``not`` einfach negieren können.
Die `Primfaktorzerlegung()` sieht mir sehr komisch aus. Kann sein das die funktioniert, kann sein dass sie es nicht tut, auf jeden Fall ist das alles viel zu kompliziert. Ein Primzahltest braucht man dazu zum Beispiel überhaupt nicht. Man fängt einfach an bei 2 aufwärts zu testen ob man teilen kann und falls ja tut man das so oft wie es geht und merkt sich die Teiler. Fertig ist man, wenn die Zahl die man noch zerlegen muss die 1 ist. Und eigentlich könnte man an der Stelle auch schon zählen wie oft man durch eine Zahl teilen konnte, dann braucht man den `Counter` später gar nicht erst.
``while 2:``? WTF‽