Wikisida, MMG200 H21 Matematik 1: Datatyper, villkor och loopar i Python

Wikisida
2021-08-31T12:53:42+02:00

Denna andra vecka ska vi gå igenom de grunder i programmering som kommer att behövas i kursen. Jag kommer precis som första veckan ge länkar till w3schools.com (Länkar till en externa sida.) där informationen är tillgänglig också om man är nybörjare. Om man har en del vana att programmera sedan tidigare så kan den "officiella" introduktionen på python.org (Länkar till en externa sida.) vara värd att titta på som ett lite mer krävande och innehållsrikt material.

Det finns också exempel här och dessa testar man lämpligen att köra för att se vad som händer.

Datatyper

Första veckan bekantade du dig med heltal (int), flyttal (float) och strängar (str). Det finns fler inbyggda typer i Python (Länkar till en externa sida.)och denna veckan ska vi bekanta oss med booleska variabler (bool), listor (list) och mängder (set).

Booleska variabler

Booleska variabler (Länkar till en externa sida.) (bool) kan bara anta två olika värden, True eller False. (Observera att värdena inleds med stor bokstav. ) Dessa används främst i samband med olika villkor som vi återkommer till lite längre ned. Samma logiska operatorer och jämförelseoperatorer (Länkar till en externa sida.) som ni hört om i matematiken finns också i Python. Testa t.ex. att köra

P = True
Q = False
X = P and Q
Y = P or Q
Z = not P
V = 6 < 7
W = 6 == 7

och se i variabelutforskaren i Spyder vilka värden de olika booleska variablerna får.

Listor

Datatypen listor (list) är precis som det låter listor av saker. I denna kursen kommer listorna oftast att innehålla tal (flyttal och/eller heltal), men de kan innehålla också andra typer t.ex. strängar eller booleska värden och t.o.m. en blandning av olika typer av värden. Läs om hur man skapar listor, hämtar element ur listor, lägger till element etc. (Länkar till en externa sida.) och gör övningarna (Länkar till en externa sida.) för att testa så du förstått. Observera speciellt att listor är ordnade dvs. det spelar roll i vilken ordning elementen ligger i listan och man kan prata om första, andra och sista elementet i en lista. Samma värde kan också förekomma på flera ställen i listan.

Kör följande kommandon ett i taget och se vad som skrivs ut, och vad som händer med listorna i variabelutforskaren.

lista1 = [True, 5, 7, 'Stefan']
print(lista1[1])
print(lista1[-1])
print(lista1[1:3])

lista2 = lista1  # lista1 och lista2 blir två olika namn på samma lista
lista3 = lista1.copy() # lista1 och lista3 blir två olika listor

lista1[0] = False
lista1.append(7)
lista1.remove(5)
lista1.pop(0)

print(lista1)
print(lista2)
print(lista3)

print([1, 3] == [1, 3])
print([1, 3] == [3, 1])

Mängder

Datatypen mängder (set) svarar precis mot mängder i matematiken och notationen är analog med t.ex. {1, 2, 3} som mängden som innehåller de tre minsta positiva heltalen. Läs om mängder i Python (Länkar till en externa sida.) och gör testövningarna (Länkar till en externa sida.).

Observera speciellt att mängder är oordnade dvs. det spelar ingen roll i vilken ordning elementen ligger i mängden och man kan inte prata om första, andra eller sista elementet i en mängd. Samma värde kan bara förekomma en gång i en mängd.

Kör följande kommandon ett i taget och se vad som skrivs ut, och vad som händer med mängderna i variabelutforskaren.

mängd1 = {1, 7, 5}
mängd2 = {5, 1, 5}
mängd3 = {2, 4, 7}

print(mängd2.issubset(mängd1))
print(mängd1.union(mängd3))
print(mängd1.intersection(mängd3))
print(mängd1.difference(mängd3))

mängd4 = mängd1 # mängd1 och mängd4 blir två olika namn på samma mängd
mängd5 = mängd1.copy()  # mängd1 och mängd5 blir två olika mängder
mängd1.remove(5)
mängd1.add(10)

Villkor

En av de viktigaste idéerna i programmering är att använda villkor som gör att olika saker inträffar beroende på värdet på ett booleskt uttryck. I de flesta programspråk åstadkommer man detta med ett kommando som startar med nyckelordet "if" (en "if-sats"), så också i Python. I Python är den normala syntaxen så här

a = int(input("Mata in ett heltal: "))
b = int(input("Mata in ett heltal: "))
if a > b:   # Om a > b är sant så gör alla indenterade rader under här
    print(a, "är större än", b)
    print("så", a, "-", b, "> 0")
elif a < b:  # Annars, om a < b är sant så gör alla indenterade rader under här
    print(a, "är mindre än", b)
    print("så", a, "-", b, "< 0")
else:    # Annars gör alla indenterade rader under här
    print(a, "är lika med", b)
    print("så", a, "-", b, "= 0")
print ("Nu var if-satsen slut.")

Observera speciellt att raderna som startar med "if", "elif" och "else" avslutas med ett kolon och att raden efteråt har ett indrag. Kolon och indraget gör Spyder automatiskt (om man inte stänger av det) och man kan ställa in hur stort indrag man önskar genom att gå in i menyn under Tools >>Preferences >> Editor >> Source code >> Indentation characters. Fyra positioner är standard. Läs om villkorssatser i Python (Länkar till en externa sida.) och gör övningarna (Länkar till en externa sida.).

Observera att bara "if" är nödvändigt. Det behöver inte finnas någon "elif" eller "else" och man kan också ha flera "elif".

Upprepningar

En annan central teknik i programmering är att använda upprepningar som populärt kallas loopar. Det finns två huvudtyper av loopar i Python, de som startar med while och de som startar med for. Lite förenklat kan man säga att man i regel använder for när man vet hur många gånger man ska upprepa en sekvens av kommandon och while när man inte på förhand vet exakt hur många gånger som man vill upprepa sekvensen.

While

Syntaxen för en while-loop påminner om den för en if-sats. Man byter helt enkelt ut if mot while. Här är ett litet exempel där man använder en while-loop för att kolla när en exponentialfunktion "hinner ikapp och förbi" en potensfunktion (att exponentialfunktioner växer snabbare än potensfunktioner kommer ni att prata om i matematiken om ni inte redan gjort det):

# Bestäm det minsta talet n>1 sådant att 2^n > n^5
n = 2
print(n**5 , 2**n)
while n**5 >= 2**n: # Upprepa tills villkoret n**5 >= 2**n är falskt
    n += 1  # Öka n med 1
    print(n**5 , 2**n)
print("Det minsta heltal n>1 sådant att 2^n > n^5 är", n)

Läs om while-loopar i Python (Länkar till en externa sida.) och gör testövningarna (Länkar till en externa sida.).

For

För en for-loop är det inte ett villkor som avgör när den ska avslutas utan man har en variabel som löper igenom alla värden i en lista eller sekvens av värden. Ofta använder man den inbyggda funktionen range för att skapa en sekvens av tal. Range fungerar kanske inte exakt som man skulle gissa så titta på beskrivningen av denna (Länkar till en externa sida.). Här kommer ett litet exempel på hur man kan använda en for-loop för att beräkna en summa.

start = 1  # Första talet i range(start, slut, steg)
slut = 15  # Slutvärdet i range(start, slut, steg) (som INTE inkluderas)
steg = 2  # Steget mellan talen i range(start, slut, steg)
summa = 0
for i in range(start, slut, steg): # Upprepa för alla värden i range(...)
    print(i)
    summa += i
print("Summan är", summa)

Läs om for-loopar i Python (Länkar till en externa sida.) och gör testövningarna (Länkar till en externa sida.).

Övningar

1. Lista, for-loop, slumptal

För att skapa ett slumpheltal kan man använda:

import random  # Modul för att använda slumptal
random.randint(a, b) # Ger ett slumpheltal n som uppfyller a<=n<=b

Skriv kod som

skapar en variabel antal som innehåller ett positivt heltal

skapar en lista som innehåller antal slumpheltal n som uppfyller .

skriver ut "Summan är S" respektive "Medelvärdet är M" (där S och M är de verkliga värdena på summan respektive medelvärdet)

2. While loop

Skriv kod som

skapar en variabel grans som innehåller ett positivt heltal

bestämmer det minsta heltal n så att

3. Mängder

För att skapa en tom mängd så måste man ange att det ska vara en mängd (set) för annars tolkar Python {} som ett tomt "lexikon", dvs. datatypen dict, så för att ange att A ska vara en tom mängd så skriver man

A = set({})

Skriv kod som

skapar två mängder A och B med 20 slumpmässigt valda heltal n som uppfyller

skriver ut antalet element i unionen respektive snittet mellan A och B