Du skriver nu:
i=25
while i <= 45:
# Gör något
i += 1
Detta är en så pass vanlig konstruktion att det finns en snabbform. "Vanligen" ser den ut ungefär så här i ett språk (OBS! Detta är inte Python):
for (i=25; i <= 45; i++) {
# Gör något
}
For-loopen bakar alltså in stegen att
initiera "iteratorn" i
definiera villkoret för att avsluta loopen
utföra en operation på iteratorn efter varje "iteration".
I Python använder man inte riktigt samma syntax, men konceptet med en for-loop som en generalisering av en while-loop är bra att förstå.
I Python hade en sådan for-loop kunnat skrivas t ex:
for i in range(25, 45+1):
# Gör något
Du ser att den har samma parametrar som i den mer "klassiska" loopen ovan, bara att de står på lite andra ställen. `range()` är en funktion som ger i detta falet alla tal mellan startvärdet 25 och slutvärdet 45+1=46 med steglängd 1 (det går att ändra, men det är vad du vill ha här, så det har jag inte gjort. Läs den länkade manualsidan), dvs första gång for-loopen körs så får i värdet 25, nästa gång 26, sedan 27, …, sedan 44, sedan 45, sedan är det slut. Mer tekniskt sagt så ger `range()` i Python 3 en generator; ett objekt som genererar nya värden vid varje access tills ett slutvillkor nås, då den sänder en speciell signal för att avsluta iterationen. I Python 2 ger `range()` en lista (också en speciell datatyp) med värdena, men då en lista är itererbar så ger det i praktiken samma resultat (men lite mindre minneseffektivt).
Så som du har skrivit nu, där du har copy+pasteat in din ursprungliga loop för att få programmet att köra den igen, är inte speciellt smidigt. Vi programmerar ju bl a just för att undvika onödiga upprepningar. Låt säga att du skulle vilja ändra lite i loopen: ska du nu behöva hålla reda på två olika ställen i koden? Säg att du hade haft ett större program där du hade skrivit loopen på 15 ställen: skulle du manuellt behöva leta upp alla dessa?
Vad händer om du i din kod helt enkelt tar bort den första loopen, och bara behåller koden från och med `while True:`? Behöver du skriva din huvudloop två gånger?
Jag har tidigare på forumet skrivit om ett smidigare sätt att testa input än att explicit kolla "n"/"N"/"j"/"J" genom att konvertera strängen innan testet utförs, och kanske än hellre bryta ut det i en egen del där man sätter en True/False-flagga.