Wußte gar nicht, dass die Teiler schon so gross sind dass sie ihre eigene Postleitzahl haben.
Benutze keine Abkürzungen, vor allem nicht bei Variablennamen. Variablennamen werden grundsätzlich komplett klein geschrieben.
Die meisten der Variablen, die am Anfang definiert werden, werden gar nicht gebraucht. Das macht das Programm zusätzlich schwer lesbar.
`nr` ist das selbe wie `zahl - 12`.
Was sollen die kryptischen nr3t und n3nr? Die lassen sich so leicht verwechseln. Daher keine Abkürzungen.
`isprime` wird nirgends definiert. `AnzahlZZ` wird verwendet, obwohl es in einem String steht (Kommentare macht man mit #)
Statt Listen zu leeren, erzeugt man eine neue Liste.
Wenn etwas sowohl im if- als auch im else-Block steht, kann man es auch einmal danach schreiben, wie bei j=j+1, oder besser, eine for- statt einer while-Schleife.
Die Funktion AnzahlZZ sollte alles, was sie braucht, über ihre Argumente bekommen, eine for-Schleife, die gleich bei ersten Durchgang per `return` beendet wird, ist keine for-Schleife. Ich gehe mal davon aus, dass das ein Einrückfehler ist. return ist keine Funktion, die Klammern also überflüssig.
Listen sollte man nicht verändern, vor allem nicht, wenn sie als Argument einer Funktion übergeben werden und das überhaupt nicht dokumentiert wird.
Dabei ist es doch in der for-Schleife völlig egal, ob die nun von Hinten durchgegangen wird, oder in normaler Reihenfolge. Bei `von hinten` würde man reversed benutzen.
Auch in dieser Funktion weißt Du Variablen Werte zu, die nie benutzt werden. In Python werden Variablen dann eingeführt, wenn sie gebraucht werden, und erst dann.
So sieht das etwas aufgeräumter aus:
Code: Alles auswählen
def ermittle_anzahl_von_was_auch_immer_zz_ist(zahl, alle_teiler):
anzahl = 0
länge = zahl // 2
for divisor in reversed(alle_teiler):
anzahl += länge // divisor
return anzahl
anzahl_primzahlen = 0
anzahl_durch_drei_teilbar = 0
anzahl_nicht_durch_drei_teilbar = 0
for zahl in range(13,5003,10):
alle_teiler = []
for j in range(1, (zahl + 1) // 2 + 1):
teiler, rest = divmod(zahl, j)
if rest == 0 and teiler > 2 and isprime(teiler)
alle_teiler.append(teiler)
nr = zahl - 12
if isprime(zahl):
anzahl_primzahlen += 1
print(nr, "zahl", zahl, "PZNR:", anzahl_primzahlen)
else:
if zahl % 3 == 0:
anzahl_durch_drei_teilbar += 1
print(nr, "zahl", zahl, "NR3T:", anzahl_durch_drei_teilbar, "3-", len(alle_teiler), "PrimTeiler", alle_teiler, ermittle_anzahl_von_was_auch_immer_zz_ist(zahl, alle_teiler))
else:
anzahl_nicht_durch_drei_teilbar += 1
print(nr, "zahl", zahl, "N3NR:", anzahl_nicht_durch_drei_teilbar, len(alle_teiler), "PrimTeiler", alle_teiler, ermittle_anzahl_von_was_auch_immer_zz_ist(zahl, alle_teiler))
Da Du nicht beschreibst was Du eigentlich berechnen willst, ist der ganze Code für mich nur eine beliebige Berechnung. Daher kann ich auch nicht sagen, was daran falsch sein soll. Beschreibt doch mal, was da berechnet werden soll.