Den kända loopen
Loopen som inte kan fastna
I Den eviga loopen lärde vi oss att while True: kräver ett manuellt break för att stanna. Det funkar utmärkt när slutpunkten är okänd, en meny som ska köra tills användaren väljer att avsluta, ett spel som ska pågå tills en spelare vinner. Men vad händer när slutpunkten är känd? Om du vet att du vill spawna exakt fem fiender, skriva ut multiplikationstabellen för talen 1 till 10 eller fråga användaren tre gånger, då kan du lösa det med while, men du måste manuellt hålla koll på en räknare:
räknare = 0
while räknare < 5:
print(f"Fiende {räknare + 1} spawnar!")
räknare += 1 Raden räknare += 1 är ett ansvar du tar på dig. Glöm den, oändlig loop. Skriv fel variabelnamn, oändlig loop. Placera den utanför loopkroppen av misstag, oändlig loop.
Python har ett bättre verktyg för det här: range(). Det genererar en sekvens av tal och kombinerat med for producerar det en loop som exakt vet hur många varv den ska köra, utan en enda rad manuell räkning.
range(), en sekvens av tal
range() är en inbyggd funktion som producerar en sekvens av heltal.
Redo.
Kör koden och räkna utskrifterna: fem tal, men det sista är 4, inte 5. Sekvensen slutar innan stopvärdet. Ändra nu till range(1, 11) och kör igen: nu börjar den på 1 och slutar på 10, formen du nästan alltid vill ha när du räknar “mänskliga” nummer. Med ett argument börjar range() alltid på noll, med två bestämmer du startpunkten själv.
range() med steg
Det tredje argumentet styr Steg (step) Det tredje argumentet i range(), hur mycket räknaren förändras mellan varje varv. Standard är 1. Negativt steg räknar bakåt. , hur mycket räknaren ändras mellan varje varv:
Redo.
Kör: 0, 2, 4, 6, 8. Byt nu till range(10, 0, -1) och kör igen, en nedräkning. Negativt steg räknar bakåt, och range(10, 0, -1) stannar innan noll, sekvensen slutar på 1. Vill du inkludera noll: range(10, -1, -1). Prova till sist range(10, 5) utan steg och kör en sista gång: ingenting skrivs ut.
Varför for + range() är säkrare
Jämför de två sätten att skriva samma tio varv. I while-versionen ansvarar du för räknaren: den måste finnas, stå på rätt ställe och uppdateras varje varv:
räknare = 0
while räknare < 10:
print(f"Varv {räknare + 1}")
räknare += 1 I for-versionen sköter Python räknaren åt dig:
for i in range(10):
print(f"Varv {i + 1}") Med for + range() finns det inget sätt att av misstag skapa en oändlig loop. Räknaren hanteras av Python-tolken, inte av dig.
for + range(), multiplikationstabellen
Utan en loop är en multiplikationstabell tio nästan identiska rader som alla måste ändras om talet byts:
tal = 7
print(f"7 × 1 = {tal * 1}")
print(f"7 × 2 = {tal * 2}") Med for + range() blir samma program tre rader, och det generaliserar:
tal = int(input("Vilket tal vill du ha tabellen för? "))
for i in range(1, 11):
print(f"{tal} × {i} = {tal * i}") Vill du ha tabellen för 1 till 20 byter du range(1, 11) mot range(1, 21).
En paus per varv, time.sleep()
I Slump & moduler hämtade du random ur standardbiblioteket. Modulen time bor där också, och time.sleep(sekunder) pausar programmet exakt så länge du ber om:
Redo.
Kör: tre tal med en kort paus emellan, sedan "Nu!". Lägg märke till att den sista utskriften står utanför loopkroppen, den körs en gång, efter att nedräkningen är klar. Sandlådan har en tidsgräns på fem sekunder, så håll pauserna korta här. I VS Code finns ingen sådan gräns, där kan du ta en hel sekund per varv.
Uppgift: Raketuppskjutningen
Skapa filen raket.py.
- Skriv
import timeöverst i filen, importer står alltid först. - Skriv en
for-loop medrange()som räknar ned från 10 till 1 och skriver ut varje tal. - Lägg
time.sleep(1)i loopkroppen så att nedräkningen tar en sekund per steg. - Skriv ut
"LIFT OFF!"efter loopen. Kontrollera indraget: raden ska köras en gång, inte tio. - Sätt en brytpunkt på
print-raden och stega igenom tre varv med F10. Titta påii Variables-panelen, stämmer nedräkningen? - Gå till Source Control-panelen i VS Code, stagea filen, skriv ett meningsfullt commit-meddelande och pusha.
Vad händer om
Ändra ditt range() till range(10, 0), utan tredje argument. Vad händer med nedräkningen, och varför lyfter raketen direkt? Vilken sorts fel är det, och varför säger Python ingenting?
Motivera & reflektera
Motivera varför du valde for med range() här i stället för en while-loop. Vad i problemet, inte i koden, avgör valet?
Nästa nivå
Ekot i grottan. Du ropar ett ord i en grotta och det studsar tillbaka ett bestämt antal gånger. Skriv ett program som läser in ordet och hur många gånger det ska ekas, och som skriver ut ekot som en enda rad. Knepet är att bygga upp svaret i en variabel som växer för varje varv i loopen, i stället för att skriva ut något inuti den.
Testa med:
| Ordet | Antal | Ska skriva ut |
|---|---|---|
hej | 3 | hejhejhej |
drake | 2 | drakedrake |
nej | 1 | nej |
Kör alla tre innan du säger dig vara klar. Ett program som fungerar för ett testfall kan vara trasigt för nästa, och det är just därför man testar med flera.