Listan & loopen

Använda listan

I Hyllorna skapade du din första lista. Men en lista du inte gör något med är bara ett lager av data som väntar. Det som gör listan kraftfull är kombinationen med loopen du redan kan, ett sätt att göra samma sak med varje element, ett i taget, utan att skriva samma rad tio gånger.

En for-loop med for item in lista: är grundmönstret. Loopen besöker varje element i listan i ordning, kör samma kod för vart och ett, och stannar när listan är slut. Tre rader kod kan göra samma sak med en lista av fem element som med en lista av femtusen.

För varje sak i listan

Editor

Redo.

Variabeln fiende kallas Loopvariabel Den variabel som deklareras i for-satsen och automatiskt tilldelas värdet av nästa element inför varje varv. Lever kvar efter loopen och innehåller då det sista elementets värde. Se: Listan & loopen . for-satsen skapar den och tilldelar den automatiskt värdet av nästa element inför varje varv. Första varvet: "Goblin". Andra varvet: "Troll". Tredje varvet: "Drake". Sedan är listan slut och loopen avslutas.

Antalet varv bestäms av listans längd. Lägg till en fjärde fiende i listan och kör igen, loopen tar automatiskt ett varv till. Du behöver aldrig räkna, det sköter loopen.

Loopkroppen

Allt som är indenterat under for-raden är Loopkropp Alla rader som är indenterade under for-satsen. Körs en gång per element, i ordning. Se: Den eviga loopen och körs varje varv:

Editor

Redo.

Indraget avgör allt. En rad som är för lite indenterad lyfts ut ur loopen och körs bara en gång, efter att alla varv är avklarade. print("Striden är över.") ligger utanför loopen med avsikt: flytta den ett indragssteg in och kör, nu skrivs den ut efter varje fiende i stället för en gång i slutet.

Räknaren och samlaren

En av de vanligaste användningarna av en for-loop är att Ackumulering Mönstret att samla ihop ett värde varv för varv. Variabeln som ackumulerar sätts alltid utanför loopen och uppdateras inuti. Se: Listan & loopen ett värde: summera tal, räkna förekomster, bygga ihop en sträng. Mönstret är alltid detsamma, skapa en variabel utanför loopen och uppdatera den inuti.

Det finns två namngivna varianter på Mönsterkortet. Räknaren räknar förekomster (total += 1 per träff). Samlaren adderar värden (total += p per element). Mönstret är detsamma, men syftet skiljer sig:

Editor

Redo.

total += p är kortform för total = total + p. Lägg märke till att total = 0 sätts utanför loopen. Om den stod inuti nollställs den varje varv och summan blir aldrig mer än det sista elementets värde. Testa detta genom att flytta total = 0 till första raden i loopen.

Loopvariabeln lever vidare

När loopen är klar försvinner inte loopvariabeln. Den lever kvar och innehåller det sista elementets värde:

Editor

Redo.

Det kan orsaka förvirring om loopvariabeln råkar ha samma namn som en annan variabel i samma scope, den ursprungliga variabeln skrivs då över av loopens sista värde, tyst, utan varning.

Välja rätt for-mönster

Du kan nu två former av for-loopen: for i in range(n): från Den kända loopen och for item in lista: från den här delen. Valet mellan dem är ett sammanhangsbeslut, inte ett syntaxbeslut. Python klarar båda formerna för de flesta problem, frågan är vilken som kommunicerar intentionen tydligast. Ställ dig frågan: itererar jag över en samling, eller upprepar jag något ett känt antal gånger?

Använd for item in lista: när du har en samling och vill göra något med varje element. Använd for i in range(n): när du vet hur många gånger något ska ske.

fiender = ["Goblin", "Troll", "Drake"]
for fiende in fiender:
    print(f"{fiende} attackerar!")

for i in range(3):
    print(f"Attackvåg {i + 1} av 3!")

Den första loopen svarar på “vad är varje element?“. Den andra svarar på “hur många gånger?“. Båda kör tre varv, men de berättar olika saker för den som läser koden.

Uppgift: Spelarens statistik

Skapa filen statistik.py.

  1. Skapa en lista spelare med minst fyra spelarnamn som strängar.

  2. Skapa en lista poäng med ett heltal per spelare, listorna ska ha samma längd.

  3. Skriv en for-loop som itererar över spelare och skriver ut en formaterad rad per spelare med en f-sträng.

  4. Skriv en separat for-loop som ackumulerar totalpoängen från poäng-listan och skriver ut resultatet efteråt.

  5. Sätt en brytpunkt precis innan for-raden i din ackumuleringsloop. Stega igenom med F10 och förutsäg värdet på totalpoängen innan du trycker, skriv ner din förutsägelse för varje varv. Var det du förväntade dig?

  6. Gå till Source Control-panelen i VS Code, stagea filen, skriv ett meningsfullt commit-meddelande och pusha.

Vad händer om

Ta din första for-loop och minska indraget på print()-raden med fyra mellanslag, alltså lyft den ut ur loopen. Hur många rader skrivs ut, och vad innehåller loopvariabeln vid det tillfället?

Motivera & reflektera

Motivera varför ackumuleringsvariabeln måste ligga utanför loopen. Vad visade genomgången i debuggern om hur den växer varv för varv?

Nästa nivå

Bygg en ny lista med bara de element som uppfyller ett krav, till exempel spelare med poäng över ett tröskelvärde, utan att röra originallistan. Du behöver Samlingsbyggaren och ett villkor i loopkroppen. Det här är FiltretMönsterkortet, ett av de mönster du kommer att återvända till oftast.