Es ist ausgesprochen schwer, herauszufinden, was Dein Code eigentlich tut, weil die Einrückungen fehlen. Code-Beispiele in diesem Forum gehören in Code-Tags ("Vollständiger Editor und Vorschau" gibt Zugang dazu). Ich rate jetzt mal, was Du gemeint hast:
Code: Alles auswählen
def primes(n: int) -> list:
liste = []
primes = []
if n >= 2:
primes.append(2)
for i in range(3, n+1):
for p in primes:
if i % p == 0:
liste.append(p)
if len(liste) == 0:
primes.append(i)
return primes
else:
return primes
Dazu: als erstes hat darktrym natürlich völlig recht, die Liste "liste" (schlechter Name, wenn schon, dann wäre "faktoren" besser) ist überflüssig. Du könntest den Durchgang durch die Primzahl-Liste entweder abbrechen, so bald zum ersten Mal "i % p == 0" wahr ist (dann ist i zusammengesetzt) oder so bald p > i/2 ist (dann ist i Primzahl, denn größer kann ein echter Teiler von i nicht sein). Je nachdem hängst Du i an primes an oder nicht.
Und zweitens wirst Du mit diesem Algorithmus nur für recht mäßige n Freude haben. Spätestens wenn n groß wird und das Ganze schnell gehen soll: "Sieb des Eratosthenes" anschauen. Das ist auch nicht die Spitze der Entwicklung, aber allemal besser als Probe-Divisionen.