Python

Fortbildning för lärare

Loopar, funktioner och listor

Loopar

Alla programmeringsspråk innehåller strukturer för att upprepa kod många gånger, detta kallas för att iterera. I Python finns det olika sätt att åstadkomma iterationer. Du kan göra en loop med en så kallad while-sats eller med en for-sats.

while-satser

Med en while-sats upprepar du ett block kod så länge ett logiskt villkor är sant.

while villkor:
    <block med kod som upprepas så länge villkor är sant> 

Nedan visas kod som skriver ut alla icke-negativa multipler av 15 som är mindre än 100.

a = 0
while a < 100:
    print(a)
    a = a + 15

Testa gärna koden!

Om den sista raden i koden ovan tas bort, får man en oändlig loop. I vissa Python-miljöer kan man stoppa oändliga loopar med ctrl-c. Om man kör Python i en webbläsare, kan det krävas att man stänger ner webbläsaren.

Övning 1

Om man vill omvandla ett heltal från basen 10 till basen 2 kan man använda algoritmen att upprepade gånger heltalsdividera talet med två och betrakta resten. Varje rest kommer att vara 1 eller 0 och resterna som produceras är siffrorna i det binära talet i omvänd ordning. Skriv ett program som givet ett decimalt heltal n skriver ut siffrorna i talets binära representation i omvänd ordning. Testa programmet på n = 1000.

\[(1000)_{10}=(1111101000)_2 \]

Spara din kod. Vi ska senare förfina utskriften så att det skrivs ut som ett tal med siffrorna i rätt ordning.

for-satser

Om man i förväg vet hur många gånger man vill upprepa ett block kod, kan man använda en for-sats och den inbyggda funktionen range. Funktionen range skapar en talföljd som kan specificeras på olika sätt.

range(stopp)
range(start, stopp)
range(start, stopp, steg)

För att skriva ut talföljden som en lista, används den inbyggda funktionen list. Mer information om inbyggda funktioner finns på sidan Built-in Functions.

Övning 2

Testa koden

print(list(range(10)))
print(list(range(5, 10)))
print(list(range(0, 100, 15)))

Lägg märke till vilket som är första och sista talet i olika listorna. På vilket vis skiljer sig detta från en uppräkning i vardagslivet?

För att skriva en for-loop med hjälp av range introduceras en variabel som håller reda på talen i sekvensen.

Testa koden

for i in range(5):
    print(i, "*", i , " = ", i*i)

print ("-" * 20)

for k in range(0, 100, 15):
    print(k)

Förstår du vad som händer?

Övning 3

Summan \(s_n\) av de n första termerna i den geometriska talföljden \[1+ \frac{1}{2} + \frac{1}{4} + \frac{1}{8}+\cdots \]

kan med Σ-notation skrivas som

\[s_n = \sum\limits_{i=0}^{n-1}\frac{1}{2^i}. \]

Om man vill beräkna summan numeriskt, är det enklare att se på summan som en rekursivt definierad talföljd.

\[ \begin{cases} s_0 &= 1 \\ s_{n+1} &= s_n+\frac{1}{2^n}, n>0 \end{cases} \]

Gör en loop som beräknar \(s_n\) för ett givet n. Testa loopen med n = 10,50,100.

Egenhändigt definierade funktioner

Du kan definiera en egen funktion med ordet def, följt av funktionens namn, ett par parenteser och ett kolon. Den kod som skall utföras då funktionen anropas indenteras. Funktionen kan ta emot parametervärden inneslutna av parenteserna och separerade av kommatecken.

En funktion kan utföra ett stycke kod utan att returnera ett värde. En funktion kan också returnera ett värde. En funktion som returnerar ett värde (med hjälp av ordet return) kan användas i uttryck.

Övning 4

Testa koden
def Fahrenheit(C):
    return 9/5*C+32

print(Fahrenheit(20))
myResult = 10+Fahrenheit(20)
print(myResult)

Lägge märke till att det värde funktionen Fahrenheit returnerar kan användas i numeriska uttryck.

Övning 5

En funktion behöver inte returnera ett värde, i sådana fall anropar man funktionen med hjälp av tomma parenteser.

Variabler som är deklarerade inuti en funktion är så kallade lokala variabler.

Försök att lista ut vad utskriften blir. Testa sedan koden!

a = 10

def myFunction():
    a = 5
    lokalVariabel = 7
    print("lokalt är a = ", a)
    print("lokalVariabel = ", lokalVariabel)
    
myFunction()
print("globalt är a = ", a)
#Försök att skriva ut variabeln lokalVariabel utanför funktionen ger exekveringsfel

Övning 6

En egenhändigt definierad funktion kan skickas in som parametervärde till en annan funktion. Det går också att ha fördefinierade parametervärden.

Testa koden

def f1(x):
    return x**2
    
def f2(x):
    return x**3
    
def diff(f, x, h = 1E-6):
    return (f(x+h)-f(x))/h

h = 0.001
derivata = diff(f1, 2, h)
print("När h = ", h, "är derivatan", derivata)

Ändra i koden så att derivatan av f2 beräknas. Testa att anropa funktionen utan parametern h. Spara koden.

Övning 7

Ändra i koden som beräknar derivatan så att att derivatan beräknas för 15 olika värden på h. Byt ut utskriftskoden till:

for k in range(1, 15):
    h = 10**(-k)
    derivata = diff(f1, 1, h)
    print("När h = ", h, "är derivatan", derivata, sep= '\t')

Det sista argumentet i print-anropet separerar de olika parametervärdena med en tab istället för ett blanktecken.

Förklara resultatet!

Listor

En kortare lista kan skapas genom att listelementen åtskiljs av kommatecken och innesluts mellan hakparenteser.

squares = [1, 4, 9, 16, 25]
letters = ['a', 'b', 'c']
print(squares)
print(letters)

Elementen i en lista av längden n är numrerade med index från 0 till n − 1. Du kommer åt ett element i en lista genom att ange listans namn följt av elementets index mellan hakparenteser.

Den inbyggda funktionen len returnerar listans längd.

Det finns ett antal inbyggda metoder på listor som används som prefix efter listans namn. Några sådan metoder visas här på listan myList :

metod förklaring
myList.append(x) lägg till x längst bak i listan
myList.remove(x) ta bort den första förekomsten av x
myList.index(x) returnera index av den första förekomsten av x
myList.insert(k, x) lägg in x på plats k i listan
myList.clear() ta bort alla element
myList.reverse() vänd på ordningen

För listor finns det en operator in som du kan använda för att ta reda på om en lista innehåller ett element.

nr = 35
numbers = [34, 87, 19]
if nr in numbers:
    print(nr, 'finns i listan', numbers)
else:
    print(nr, 'finns inte i listan', numbers)

Operatorn in kan också användas i en for-sats.

for i in numbers:
     print(i)

För fler metoder se Data Structures - More on Lists.

Övning 8

Gör ett program som låter användaren mata in ett positiv heltal n som är mindre än 100. Lägg in alla positiva multipler av n som är mindre än 100 i en lista. Skriv ut listan. Skriv ocskå ut hur många sådana multipler det finns.

Från början behäver du en tom lista. Du kan skapa en tom lista på följande sätt:

myList = [] 

Övning 9

Skriv ett program som givet ett decimalt heltal n beräknar varje siffra i den binära representationen av n och lägger in dessa siffror i en lista. Om n = 1000 ska följande lista skapas:

[1, 1, 1, 1, 1, 0, 1, 0, 0, 0]

Från listor till textsträngar

Om man har en lista av element som är textsträngar kan man med metoden join skapa en enda textsträng som är en sammanslagning av listans element separerade av en given textsträng. Nedan visas två exempel där listelementen är separerade av ett bindesträck respektive en tom textsträng.

Följande kod

countries = ["Sweden", "Norway", "Denmark"]
print("-".join(countries))
print("".join(countries))

ger utskriften:

Sweden-Norway-Denmark
SwedenNorwayDenmark

Övning 10

Ändra koden till föregående övning så att det binära talet skrivs ut som en textsträng.

För att konvertera elementen i listan från tal till textsträngar kan du använda metoden str, exempelvis skapas texten "5" av kommandot str(5).

Om listan heter myList kan man använda koden:

print("".join(str(e) for e in myList))

Kommentar

Man kan i Python skriva ut den binära representationen av ett tal med kommandot bin och den hexadecimala med kommandot hex.

Koden

print(bin(1000))
print(hex(1000))

ger utskriften:

0b1111101000
0x3e8