def primes_upto(n):
# Lista med primtal vi hittat så här långt, vi startar med en tom
# lista.
primes = []
# Kolla alla tal från [2..n], range(a, b) blir [a..b[ så behovs
# ett +1 för att även inkludera b, d.v.s range(a, b+1) ger [a..b]
for maybePrime in range(2, n + 1):
# 'maybePrime' är ett primtal om det inte är delbart med något
# av de primtal vi hittat så här långt.
if all(maybePrime % p != 0 for p in primes):
# 'maybePrime' är ett primtal, så lägg till det till
# listan
primes.append(maybePrime)
return primes
Detta löser inte helt ditt problem. Vidare är det som sagt ett rätt ineffektivt sätt att ta fram alla primtal upp till talet n.
Men det är en start. Några saker att fixa till.
1. skriv om "if all(...)" delen med en normal "for-sats" på ett sätt du faktiskt förstår. Kommentaren beskriver vad som logisk ska hända.
2. Lite uppenbara optimeringar. Man kanske inte behöver räkna om _alla_ primtal varje gång? Kanske spara de man redan räknat ut och bara räkna ut de extra som behövs?
3. Som redan visats i tråden, räcker ju att testa att dela med tal upp till kvadratroten ur det man vill kolla. Hur får man in den optimeringen i koden ovan?
4. Och hur går man från en lista med primtal till att lura ut om det tal man nu har är ett av primtalen i listan (och är således ett primtal) eller ej (och är då inte ett primtal)?