Detta skapar en PDF som du sedan kan skriva ut. Du kan även spara ner PDFn och skriva ut senare.
Titel på utskriften?
Tack för ditt bidrag
Om vi kan använda det så lägger vi upp det på sidan. Nedan en länk till ditt bidrag om du vill spara det.
Spara som ...
Du sparar ditt skript under detta namn och kan sedan hämta tillbaka det med samma namn.
Läs in
Läs in ett tidigare sparat skript. Obs att du enbart kan läsa in skript i den webbläsare där du sparade skriptet. Vill du kunna läsa in och spara skript oberoende av webbläsare, så behöver du skaffa ett login (enkelt och gratis).
Skicka in bidrag
Föreslå rubrik
Beskriv vad din kod gör
Skapa kort länk
Använd en kort URL för att skicka länk till koden via SMS eller epost. När mottagaren klickar på länken, så öppnas denna webbsida, med din kod och din text. Länken rensas bort automatiskt om den inte används.
Rubrik (frivilligt)
Beskrivning (frivilligt)
Länk (kopiera hela)
Loopar
Ofta behöver vi göra någon grej, många gånger. Hur ska vi tänka? Typiskt ser det ut såhär.
while(villkor)
While är engelska och betyder medans eller så länge som. Sålänge som villkoret inom parentes är uppfyllt, så körs det som står nedanför while som är indenterat ("tabbat"). När den indenterade ("tabbade") while-koden kommer till slutet, då testas villkoret en gång till och är det uppfyllt, så börjar vi om igen. Sådär håller det på.
i = 0
while(i < 5):
print("Tjoho!")
i = i + 1
i = 0
while(i < 5):
print("Tjoho!")
i = i + 1
Om vi ersätter default end="nyrad" med något annat, t.ex. ett mellanslag, så får vi utskriften på en rad.
i = 0
while(i < 5):
print("Tjoho!", end = " ")
i = i + 1
i = 0
while(i < 5):
print("Tjoho!", end = " ")
i = i + 1
Vi har en lista och vi vill hitta det största talet.
lista = [1,5,8,9,4,2,5,18,4,3]
i = 0
max = 0
while(i < len(lista)):
if(lista[i] > max):
max = lista[i]
i = i + 1
print(max)
lista = [1,5,8,9,4,2,5,18,4,3]
i = 0
max = 0
while(i < len(lista)):
if(lista[i] > max):
max = lista[i]
i = i + 1
print(max)
Övning: Skriv färdigt en while -loop som räknar upp till 10.
i = 0
print(i)
i = i + 1
i = 0
print(i)
i = i + 1
Vi behöver såklart - likt ovan exempel - någon form av räknare så att vi kan hålla koll på hur många gånger vi snurrat runt i while -loopen. Ibland finns ett villkor inbyggt i det vi vill göra och då kan vi använda detta villkor i while -loopen.
fakultet = 5
svar = 1
while(fakultet>1):
svar = svar * fakultet
fakultet = fakultet - 1
print(svar)
fakultet = 5
svar = 1
while(fakultet>1):
svar = svar * fakultet
fakultet = fakultet - 1
print(svar)
Ovan räknar vi ut fakulteten för 5 t.ex. Saknas en naturlig användbar biprodukt av det vi vill räkna ut, likt ovan exempel, måste vi explicit skapa en räknare som håller koll på antalet varv. Som i första exemplet.
for -loop
Ett smidigt sätt skapa loopar är for -loopen. Vi kan stabilt skapa en loop från ett visst värde till ett annat. Men vi kan också loopa över listor, mängder och allt möjligt.
for i in range(start,slut)
Variabeln i kan väljas som du själv önskar. Det intressanta är att loopen kommer utföras med start som första värde och sålänge som i < slut.
for i in range(1,5):
print(i, end = " ")
for i in range(1,5):
print(i, end = " ")
Övning: Skriv en for -loop som börjar räkna på 100 till 200 och hoppar 10 tal varje gång.
i = 0
for
print(i)
i = 0
for
print(i)
for i in range(start,slut,step)
Säg att man vill räkna ner i loopen, dvs börja på t.ex. 10 och räkna mer till 0 ? Då måste vi använda step. Vad är step? Med step kan vi bestämma hur mycket vi skall plussa på i varje loop. Så t.ex. om vi vill hoppa fram 2 steg varje varv ...
for i in range(0,10, 2):
print(i, end = " ")
for i in range(0,10, 2):
print(i, end = " ")
Detta är ledtråden till hur vi räknar ner i loopen. Vi kör ett netagivt step, t.ex. step = -1
for i in range(10, 0, -1):
print(i, end = " ")
for i in range(10, 0, -1):
print(i, end = " ")
Om du inte har någon användning för loopens räknare kan du faktiskt utelämna den. Nedan skriver ut Hello World 5 gånger.
for _ in range(5):
print("Hello world")
for _ in range(5):
print("Hello world")
Vi kan såklart ha loopar inuti andra loopar. Väldigt användbart om du vill skriva ut något 2D, t.ex. en tabell eller ett spel. Så, den yttre loopen gör någonting t.ex. 5 varv. Det kan mycket väl vara att trigga en inre loop, som i sin tur kör 5 gånger innan den är färdig.
for i in range(1,4):
for j in range(1,4):
print(j, end = " ")
print()
for i in range(1,4):
for j in range(1,4):
print(j, end = " ")
print()
Nedan exempel, för att visa i och j, använder metoden format, som du lär dig om längre fram. Mycket smidig metod för att formatera utskrifter.
För varje loop-varv i den yttre, kör vi alltså 3 loop-varv i den inre.
for i in range(1,4):
for j in range(1,4):
print("{0}{1}".format(i,j), end = " ")
print()
for i in range(1,4):
for j in range(1,4):
print("{0}{1}".format(i,j), end = " ")
print()
Nu ska vi räkna ut pi. Leibniz räknade ut att man kan få fram pi med följande serie. Hur kan vi göra pytonkod av detta? Vi ser direkt att det är en loop.
Tittar vi på nämnaren ser vi att den startar med 1 (första talet kan ses som 1/1) och ökar 2 steg varje varv. Vi börjar med att snickra ut denna talserie. Vi utnyttjar att range har en tredje parameter och det är step, alltså hur många steg den skall stega fram varje gång. Vi startar också på 1.
iter = 10
for i in range(1,iter,2):
print(i)
iter = 10
for i in range(1,iter,2):
print(i)
Nästa problem är att varannan term så måste vi ha plus (+1) och varannan minus (-1). Vi kan tänka oss variabeln tecken som vi ständigt byter tecken på.
iter = 10
tecken = -1
for i in range(1,iter,2):
tecken = -tecken
print(tecken, i)
iter = 10
tecken = -1
for i in range(1,iter,2):
tecken = -tecken
print(tecken, i)
Nu behöver vi slutligen snickra ihop summan. Vi adderar ihop allting i variabeln pi. Slutligen måste vi också ta vår summa x 4. Vi ökar också antalet iterationer till 10000.
iter = 50000
pi = 0
tecken = -1
for i in range(1,iter,2):
tecken = -tecken
pi = pi + tecken * (1/i)
pi *=4
print(pi)
iter = 50000
pi = 0
tecken = -1
for i in range(1,iter,2):
tecken = -tecken
pi = pi + tecken * (1/i)
pi *=4
print(pi)
Var försiktig med att öka iterationer i sådana här uträkningar för mycket eftersom du kan få en loop som tar lång tid räkna ut.
for i in [lista]
Låt oss titta närmare på range(start,slut) för att upptäcka en intressant grej. Range är en inbyggd funktion som allmänt skapar listor eller tupples eller mängder (dictionary).
print(list(range(1,5)))
print(list(range(1,5)))
Det betyder att man omvänt, istället för range, i for -loopen, borde kunna dunka in en lista, tupel eller ett set (mängd) direkt?
Det kan man! For kan ta en lista, mängd, dictionary och lite allt möjligt.
for i in [1,2,44,63,8,9]:
print(i, end = " ")
for i in [1,2,44,63,8,9]:
print(i, end = " ")
Vi hade kunnat skriva såhär.
listan = [1,2,44,63,8,9]
for i in listan:
print(i, end = " ")
listan = [1,2,44,63,8,9]
for i in listan:
print(i, end = " ")
Vi testar ett set.
settet = {1,2,44,63,8,9}
for i in settet:
print(i, end = " ")
settet = {1,2,44,63,8,9}
for i in settet:
print(i, end = " ")
Vi testar en lista av dictionary.
dicten = [{"x":4},{"x":5},{"x":7},{"x":12}]
for i in dicten:
print(i, end = " ")
dicten = [{"x":4},{"x":5},{"x":7},{"x":12}]
for i in dicten:
print(i, end = " ")
Övning: Skriv en kod som summerar alla värden x i en dictionary
dict = [
{"x":4},
{"x":5},
{"x":7},
{"x":12}
]
sum = 0
for i in ...
dict = [
{"x":4},
{"x":5},
{"x":7},
{"x":12}
]
sum = 0
for i in ...
Vi testar en lista av set's.
dicten = [{1,2,3,4},{9,3},{8,6,5},{10,11,12}]
for i in dicten:
print(i, end = " ")
dicten = [{1,2,3,4},{9,3},{8,6,5},{10,11,12}]
for i in dicten:
print(i, end = " ")
Vi testar en lista av set's, med loop i loopen.
lista_av_set = [{1,2,3,4},{9,3},{8,6,5},{10,11,12}]
for settet in lista_av_set:
for j in settet:
print(j, end = " ")
print(" + ", end="")
lista_av_set = [{1,2,3,4},{9,3},{8,6,5},{10,11,12}]
for settet in lista_av_set:
for j in settet:
print(j, end = " ")
print(" + ", end="")
Övning: Säg att du har en lista av listor. Skriv en kod som summerar alla tal i alla listor, dvs en summa av alla tal totalt.
lista = [
[4,3,6,5],
[9,5,4,2],
[89,34,3]
]
sum = 0
lista = [
[4,3,6,5],
[9,5,4,2],
[89,34,3]
]
sum = 0
villkorade loopar
Låt oss snacka lite om riktiga datorprogram. I riktiga datorprogram så har vi loopar som finns där som en del av det programmet ska göra.
Ta ett program som gissa tal. Datorn tänker på ett tal och användare skall gissa talet. Loopen här består i att hämta in gissningar från användaren. Om användare gissar fel, så fortsätter vi att fråga samma sak om och om igen.
Här gör vi så, att vi låter while -loopen pågå sålänge som det som användaren gissar är felaktigt, dvs slumptal != gissat_tal. För att vi inledningsvis skall kunna gå in i while -loopen behöver man tänka till lite. Här skapar vi inledningsvis ett omöjligt tal gissat_tal = -1, så villkoret i while -loopen alltid är sant en första gång.
import random
slumptal = random.randrange(1, 100)
gissat_tal = -1
print("Jag tänker på ett tal 1-100 och du")
print("skall gissa vad jag tänker på!")
txt = "Gissa ett tal 1-100"
while(slumptal != gissat_tal):
gissat_tal = int(input(txt))
if(gissat_tal == slumptal):
print("Du gissade rätt!")
print("Jag tänkte på", slumptal)
if(gissat_tal > slumptal):
txt = "För högt!"
if(gissat_tal < slumptal):
txt = "För lågt!"
print("Tack för att du lekte med mig!")
import random
slumptal = random.randrange(1, 100)
gissat_tal = -1
print("Jag tänker på ett tal 1-100 och du")
print("skall gissa vad jag tänker på!")
txt = "Gissa ett tal 1-100"
while(slumptal != gissat_tal):
gissat_tal = int(input(txt))
if(gissat_tal == slumptal):
print("Du gissade rätt!")
print("Jag tänkte på", slumptal)
if(gissat_tal > slumptal):
txt = "För högt!"
if(gissat_tal < slumptal):
txt = "För lågt!"
print("Tack för att du lekte med mig!")
Övning: Skriv ett program där datorn tänker på en av 10 färger och du skall gissa vilken färg det är.
import random
slumptal =
import random
slumptal =
break
Vi kan också skapa en evighetsloop som håller på i all evighet med konstruktionen while(True)
Hur avbryter man en evighetsloop? Vi drar i nödbromsen, dvs med break. Så om vi gissar rätt tal, så kör vi en break. Studera nedan kod. Direktivet break avbryter alltid loopen vi befinner oss i.
import random
slumptal = random.randrange(1, 100)
print("Jag tänker på ett tal 1-100 och du")
print("skall gissa vad jag tänker på!")
txt = "Gissa ett tal 1-100"
while(True):
gissat_tal = int(input(txt))
if(gissat_tal == slumptal):
print("Du gissade rätt!")
print("Jag tänkte på", slumptal)
break
if(gissat_tal > slumptal):
txt = "För högt!"
if(gissat_tal < slumptal):
txt = "För lågt!"
print("Tack för att du lekte med mig!")
import random
slumptal = random.randrange(1, 100)
print("Jag tänker på ett tal 1-100 och du")
print("skall gissa vad jag tänker på!")
txt = "Gissa ett tal 1-100"
while(True):
gissat_tal = int(input(txt))
if(gissat_tal == slumptal):
print("Du gissade rätt!")
print("Jag tänkte på", slumptal)
break
if(gissat_tal > slumptal):
txt = "För högt!"
if(gissat_tal < slumptal):
txt = "För lågt!"
print("Tack för att du lekte med mig!")
Det fungerar även för andra loopar. Ta nedanstående loop som skriver ur ett tal i taget från listan. Vi stoppar in en break ifall if(t>20), dvs vi kommer i detta fall avbryta loopen efter att den skrivit ut 26.
lst = [5,19,3,26,8,9,10,90]
for t in lst:
print(t)
if(t>20):
break
lst = [5,19,3,26,8,9,10,90]
for t in lst:
print(t)
if(t>20):
break
Övning: Skriv en evighetsloop som som räknar upp en variabel i. När i är 20 så skall evighetsloopen avbrytas.
i = 0
while(True):
break
i = 0
while(True):
break
continue
Continue är en break, fast den avbryter inte loppen som helhet utan avbryter bara pågågende varv. Så continue borde egentligen döpts till restart eller något sånt, för det är vad den gör. Begrunda nedan kod.
i = 0
while(i<10):
i = i + 1
print(i)
i = 0
while(i<10):
i = i + 1
print(i)
Inga konstigheter, men nu lägger vi in en continue -sats ...
i = 0
while(i<10):
i = i + 1
if(i%2):
continue
print(i)
i = 0
while(i<10):
i = i + 1
if(i%2):
continue
print(i)
Som synes avbrytes varvet i loopen vid continue, men det som händer sedan är att loopen fortsätter vid while. Vi kan kombinera continue och break. Sistnämnda kommer avbryta loopen helt.
i = 0
while(i<10):
i = i + 1
if(i%2):
continue
if(i>6):
break
print(i)
i = 0
while(i<10):
i = i + 1
if(i%2):
continue
if(i>6):
break
print(i)
repeterar break och continue
Det är egentligen inte krångligt och det är väldigt användbart ibland. Så break avbryter en loop. Om det finns en yttre loop, så kommer break avbryta och därmed hoppa till den yttre loopen. Continue avbryter det som körs inne i loopen och snabb-spolar till nästa värde i loopen.
Lite frågor
Vad kommer hända om vi skriver while(False): och därefter kod ...
Ingenting. Det kommer inte starta eftersom uttrycket är False
Det blir en evighetsloop
Vad kommer hända om vi skriver while(True): och därefter kod ...
Ingenting. Det kommer inte starta eftersom uttrycket är False
Det blir en evighetsloop
Hur kommer vi ur en evighetsloop?
Aldrig, det hör du ju! Evighets...
Med break
Vad är skillnaden mellan for i in range(len(lista()) och for j in lista:
Skillnaden är att i ena loopen så har vi i att jobba med, i andra har vi j att jobba med.
Med range får vi ett index att jobba med i varje varv. Skriver vi for j in lista, så är j ett element i listan i varje varv.
for i in range(2):
for j in range(2):
print(i,",",j, end=" @ ")
Vad blir utskriften av koden ovan
0 , 0 @ 1 , 0 @ 0 , 1 @ 1 , 1 @
0 , 0 @ 0 , 1 @ 1 , 0 @ 1 , 1 @
i = 0
while(i<10):
i = i + 1
if(i%2):
continue
print(i,end=",")