P1 – Kapitel 4

Importera moduler

Några av av de färdiga funktionerna i Python kan du använda direkt. Du har tex redan använt input(), len(), str(), print(). Python har fler färdiga funktioner men för att använda dessa måste du importera dem från Pythons bibliotek. För att göra detta skriver du import framför modulen som ska importeras. I Pythons dokumentation kan du hitta en lista med alla moduler du kan importera. Skapa programmet importera_moduler.py. Programmet simulerar en tärning med random.randint(1, 6). I random som importerades finns en funktion randint() som slumpar fram heltal från 1 till 6. For-satsen används för att köra slumptalsgeneratorn tre gånger.

#En tärningssimulator som kastar tre tärningar 
import random 
for i in range(3): 
    print(random.randint(1, 6))
Exempel på utskrift

5
3
6

Funktioner

Du har använt flera av Pythons inbyggda funktioner exempelvis: input(), len(), str(), print(). Nu ska du få lära dig skriva egna funktioner. En funktion är som ett mindre program i ett program. I programmet funktion_fras.py skapar men en funktion med ordet def  framför namnet på funktionen. I detta fallet fras. Glöm inte parenteserna och kolon. I just detta exempel hade man kunnat skriva print(‘Hej på dig!’) direkt. Men när programmen blir större är det lättare att dela upp programmen genom att dela upp koden med funktioner. När fras() står efter funktionen kallar man det för fuktionsanrop

def fras():
    print('Hej på dig!')

fras()
fras()
Utskrift

Hej på dig!
Hej på dig!

Funktioner med returvärden

Istället för att funktionen gör något som en utskrift kan man skapa en funktion som skicka tillbaka ett värde till när funktionen anropades. Skapa programmet slumpa_sten_sax_pase.py. import random för att kunna ska slumptal. Därefter skapar vi en funktion getVal. Att skriva get- framför en funktion är ett sätt för dig själv och andra utvecklare att se om funktionen ger ett värde. Om du inte vill blanda engelska och svenska kan du skriva getChoice istället. Målet är alltid att underlätta förståelsen för vad funktionen eller variabler gör. Tänk också på att funktionen måste stå innan den anropas. I detta fallet anropas funktionen med getVal(slumpaTal).

#datorn slumpar sten sax påse
import random
def getVal(val): #Det som finns inne i parenteserna i en funktion kallas parameter
    if val == 1:
        return 'sten'
    if val == 2:
        return 'sax'
    if val == 3:
        return 'påse'
slumpaTal = random.randint(1,3) 
print('Datorn valde '+getVal(slumpaTal)) #När en funktions kallas heter det som står inne i parenteserna argument
Exempel på utskrift

Datorn valde sax

Film på hur koden ovan körs

När programmen blir större och använde funktioner kan det vara svårare att se vilken ordning koden körs. Jag rekommenderar att du går till webbsidan www.pythontutor.com/visualize.html om du vill se steg för steg hur koden körs. Se bara till att du väljer Python 3.6. Klicka på “visualize execution” för att starta programmet

http://www.pythontutor.com/visualize
http://www.pythontutor.com/visualize.html

 

Globala och lokala variabler

Variabler som skapas utanför en funktion kan kommer man åt från hela programmet. Variabler som skapas i en funktion går bara att komma åt i den funktionen. I programmet global_lokal.py kommer du att få ett fel när du kör det. Variabeln ettTal är skapat i funktionen slumpaEttTal() och det går inte att komma åt utanför

import random

def slumpaEttTal():
    ettTal = random.randint(1,10)
    return ettTal

slumpaEttTal()
print(ettTal)
Utskrift

Traceback (most recent call last):
File “/Users/paul/Dropbox/python/Programmering1/Kap 4/global_lokal.py”, line 9, in <module>
print(ettTal)
NameError: name ‘ettTal’ is not defined
Övningar

Övning

Gör om global_lokal.py så att programmet blir rätt

 

Lokala variabler kan inte komma åt andra lokala variabler

I programmet lokal_lokal.py används variabeln ettTal på tre platser. Men här är det faktiskt tre olika variabler. ettTal i funktionen slumpaEttTal() och ettTal i funktionen slumpaEttAnnatTal() är två olika lokala variabler som endast går att komma åt i respektive funktioner. ettTal som står överst är en global variabel. Det är inte lämpligt att skapa variabler med samma namn även om de används olika.

ettTal = 0
import random

def slumpaEttTal():
    ettTal = random.randint(1,10)
    return print(ettTal)

def slumpaEttAnnatTal():
    ettTal = random.randint(11,20)
    return print(ettTal)

slumpaEttTal()
slumpaEttAnnatTal()
print(ettTal)
Förslag på utskrift

7
12
0
Övningar

Övning

Gör om programmet lokal_lokal.py så det blir lättare att förstå

 


Felhantering

Om du får fel i din kod i alla program som du gjort hittills kommer du få ett felmeddelande. Detta vill du inte ska hända i program som du vill andra ska göra. Programmet ska hitta felet, hantera dem och fortsätta köra. Skapa programmet fel_divsion.py och kör programmet. Du kommer att få ett felmeddelande när programmet försöker dividera 10 med 0: ZeroDivisionError: division by zero.

def delaMed(taljare,namnare):
    kvot = taljare / namnare
    return kvot

print(delaMed(21,2))
print(delaMed(10,3))
print(delaMed(0,3))
print(delaMed(10,0))
Utskrift

10.5
3.3333333333333335
0.0
Traceback (most recent call last):
File “/xxx/fel_division.py”, line 13, in <module>
print(delaMed(10,0))
File “/xxx/fel_division.py”, line 7, in delaMed
kvot = taljare / namnare
ZeroDivisionError: division by zero

För att slippa fel som dessa kan man skriva en try-except. Då kontrolleras koden efter en viss typ av fel. I vårt fall ZeroDivisionError. Kopiera i fel_divsion.py och spara i en ny fil fel_divsion_try.py. De tre första delaMed() kör programmet med try utan problem men när den kommer till delaMed(10,0) går programmet vidare till except ZeroDivisionError och returnerar ‘Division med noll går inte’.

def delaMed(taljare,namnare):
    try:
        kvot = taljare / namnare
        return kvot
    except ZeroDivisionError:
        return 'Division med noll går inte'

print(delaMed(21,2))
print(delaMed(10,3))
print(delaMed(0,3))
print(delaMed(10,0))
print(delaMed(33,3))
Utskrift

10.5
3.3333333333333335
0.0
Division med noll går inte
11.0

Syntaxfel, programkörningsfel och programmeringslogiska fel

Fel är lätt att göra, speciellt i början. Ett sätt att lära sig hitta fel är att skilja mellan olika typer av fel.

Syntaxfel

Denna typen av fel har jag redan nämt i kapitel 2. Det är när man stavar fel, sätter ett tecken för mycket, ett tecken för lite eller sätter något på fel plats. Det finns ingen kontroll av koden om du använder IDLE förrän du kör koden. Om du använder program som PyCharm får du en del hjälp när du gjort syntaxfel genom att det blir röda markeringar i koden. Denna hjälphantering kan ibland ge exakt rätt hjälp ibland får du reda på ett fel på en plats när felet är på en annan rad. Vid andra tillfällen blir det felmarkeringar på många rader fastän det beror på hur Python tolkar felet.

syntaxfel i PyCharm
syntaxfel i PyCharm
ett fel blir flera felmeddelanden
ett fel blir flera felmeddelanden. Det enda felet är tt jag satt / istället för , i delaMed(taljare/namnare)

Körningsfel 

När du körde programmet fel_divsion.py fick du ett programkörningsfel. Det är fel som händer fastän programmet går att köra men som ger felmeddelanden om programmet träffar på kod som ger fel.

Programmeringslogiska fel

Denna typen av fel är oftast den svåraste typen av fel att hitta. Det händer när ett program kan köra men inte ger det förväntade resultatet. Denna typen av fel blir vanligare när man gör större program

Skriva program i steg

Övning

Du ska nu får göra ett större textbaserat program. Du har säkert spelat sten sax påse.

  1. Gör ett pseudokod av ett sten sax påse spel. Titta på förslaget nedan
  2. Översätt pseudokoden till Pythonkod stegvis. Kommentera bort pseudokoden efterhand

Du har redan gjort en del av koden i programmet slumpa_sten_sax_pase.py . I den skapade du en funktion getVal(val) som simulerar datorn som motståndareTänk på att lägga metoden getVal(val) överst.

 

Förslag på pseudokod till sten sax påse

Välkomsttext

loop som gör du kan spela flera gånger
    Fråga användaren om denne väljer sten sax påse
    Skriv ut användarens val

    slumpa datorns val
    Skriv ut datorns val

    om datorns val är samma som användarens val
        Skriv ut båda valde samma
    annars om användarens val är sten och datorns val är sax
        Skriv ut Du vann
     ...(fortsätt med de andra fallen)...

    Skriv ut Du har poängen X
    Skriv ut Dator har poängen Y
    Mata in Vill du spela igen j/n

Skriv ut Nu är spelet slut
    om datorn vann
        Skriv ut Dator vann
    om användare vann
        Skriv ut Du vann
    annars
        Skriv ut Det blev lika

Idé visa sten sav påse i steg

sedan göra gissa nummer som övning

gissa vilket nummer s72

 

Lämna en kommentar