Lektion 2: Programmeringsmiljön Thonny
Syfte: |
Att använda programmeringsmiljön Thonny
|
Innehåll: |
Funktionerna input och print .Datatypen bool .if -, while - och for -satserna. |
Arbetsform: | Arbeta gärna tillsammans med någon men skriv egen kod. Diskutera med varandra! |
Uppskattad arbetstid: | Schemalagd handledningstid: 4 timmar. Utöver det räkna med eget arbete med lika många timmar. |
Redovisning: | Ingen obligatorisk redovisning men diskutera med handledare om det är något du är osäker på! |
Backup: | När du arbetar på egen dator måste du se till att det löpande görs backup på de filer (py-filer) som du skapar under kursens gång. Om du har filerna enbart lagrade på din dator finns risk att allt försvinner vid ett datorhaveri eller vid stöld. |
Använda Python i script-mode
Hittills har vi använt Python i interactive mode i Thonny's shell-fönster. Vi har skrivit enskilda kommandon som utförts (körts) direkt.
Normalt skriver man dock sina Python-satser på en fil som man kan editera, spara och köra upprepade gånger, dvs man kör Python i script mode.
När ett program (pythonfil) körs i datorn säger man också att programmet exekveras.
Det går att använda vilken texteditor som helst men den bör ha särskilt stöd för Python-kod. I vårat fall skall vi använda den inbyggda texteditor
som finns överst i Thonny.
1. Thonny vid start ![]() |
2. Skriv följande två rader i det övre fönstret (eller gör copy/paste):print('Välkommen till Python-världen')
![]() |
3. Spar de två raderna i en fil med Save As i File .
Namnge filen ex1 och spar den i en mapp med
lämpligt namn som tydliggör att du håller på med lektion 2, exvis L2 .
![]() |
4. Överst i Thonny ses namnet på filen ex1.py Python-filer får automatisk .py som efternamn.Filen är sparad i mappen python/ht20/L2 ![]() |
5. Kör filen med de två satserna med
run current script i Run -menyn,
eller klicka på den gröna pilen. Det finns öven ett kortkommando
(F5 för Windows-datorer).
![]() |
  6. Resultat av satserna (scriptet ex1 ) ses i shell-fönstret.
![]() |
.py
.
I ovan exempel har vi skapat mappen python/ht20/L2
. Tanken med den är där spara de program man skriver under denna lektion.
Nu följer ett antal moment där olika delar av Python skall introduceras:
- input-satsen (inläsning, programmet frågar efter data)
- if-satsen
- logiska villkor
- while-satsen
- for-satsen
inputEx.py
, ifEx.py
, logEx.py
, whileEx.py
och
forEx.py
. När du är klar med denna lektion skall du då ha dessa fem filer och filen ex1.py
i den mapp du skapat för lektion 2.
Inläsning med input
I stället för att skriva in värden till variabler i Python-koden kan man låta programmet fråga den
som kör programmet vad värdet ska vara.
Exempel:
Gör New i File för att skapa en tomt fönster som per auto får namnet untitled .
Skriv in ovan två rader (eller kopiera raderna från webbläsaren) in i det tomma fönstret , spara (Save As )
med namnet inputEx
![]() |
Du ser att python-koden i fönstret inputEx är numrerad 1-6. På rad 1 finns en speciell python-sats, som vi har skrivit in, nämligen
raden: # INPUT-satsen Detta är en kommentarsats, sådana satser börjar med tecknet #. Resten av tecknen på raden tolkas som kommentar, något som python hoppar över. Kommentarsatser är text som är till för dem som läser och skriver pythonkoden. Exvis för att förklara saker i koden. I detta fall finns kommentaren bara som information om att koden handlar om input-satsen. Du ser också att python-koden är färgad lite olika. Man kan kallar detta för syntax highlighting. Syftet med det är att göra koden mer läsbar och förståelig. Kommentarsatsen har sin egen färg, texter är gröna, pynton-språkets reserverade ord (input,print) är blåa, variabler är svarta.
Testkör koden med ( |
input
alltid returnerar (ger) svaret som en sträng (text) även om vi skrivit
något som skulle kunna tolkas som ett tal. Svaret lagras i variabeln namn
.
Satsen print(f'Välkommen {namn}!')
skriver ut den text som finns mellan de båda blipparna '
och '
, dvs texten
Välkommen {namn}!
. I texten finns det ett par av {
och }
, s.k. platshållare. I platshållaren finns namnet på
variabeln namn
, detta innebär att den variabelns värde görs om till text.
Ett alternativ till att köra programmet med Run>Run current script visas här:
|
![]() |
Exempel:
I USA brukar man ange bilars bränslekonsumtion i miles per gallon i stället för liter per mil. Följande kod hjälper till med att konvertera mellan dessa värden (1 mile = 1609m, 1 US gallon = 3.785 l):
Kopiera ovan rader från webbläsaren och lägg dem efter de rader nu nyligen skrev, dvs i filen inputEx
. Provkör detta!
Du märker att python kommer att köra även de satser du tidigare skrev i filen inputEx
. Ett sätt att undvika detta är att kommentera
bort de satser man ej vill köra. Detta kan göras genom att stoppa in tecknet #
framför till vänster om dessa satser.
  1. Alla satser körs. Se shell-fönstret.   ![]() |
2. Två satser är bortkommenterade, rad 3 och rad 4
börjar med tecknet # . Raderna blir dessutom gråfärgade
och kommer ej att köras. Körning, se shell-fönstret. ![]() |
#
framför dessa två rader kommer programmet fungera
som tidigare.
Man kan ha hur många sådana här bortkommenterade satser som helst i ett program.
Övning: Svaret innehåller besvärande många siffror (16 st decimaler).
Funktionen round
kan användas för att runda till ett lämpligt antal decimaler.
Lägg till raden:
lpm = round(lpm, 2)
före print
-satsen så
blir värdet korrekt avrundat till 2 decimaler. Variabeln lpm
kommer därmed att ändra värde till att det avrundas till två decimaler.
Testkör.
Ett smidigare alternativ att bortkommentera är genom att markera varje sats i Thonny, se följande bildserie:
  1. Markera de satser som skall bortkommenteras:   ![]() |
2. I Edit välj Comment Out![]() |
3. De markerade satserna får tecknet # först på raden och de blir gråa![]() |
Övningar
Tips: Den pythonkod du skriver i dessa övningar lägger du iinputEx
som där du redan har kod som handlar om input-satsen.
Den kod som du redan skrivit och testat kommenterar du bort. För varje ny övning du börjar med skriv en kommentarsrad, exvis
# Övn1.
-
Skriv och testkör ett program (kod) som läser in ett temperaturvärde i grader Fahrenheit
och skriver ut motsvarande temperatur i Celsius med 1 decimal. Med "läser in" menas att programmet skall fråga användaren.
Omvandlingsformel finns
här
.
f = float(input("Grader Fahrenheit: ")) c = round((f-32)/1.8, 1) print('motsvarar', c, 'grader Celsius')
-
Skriv och testa kod (ett program) som läser in ett kapital (i kronor, heltal),
en räntesats i procent (flyttal)
och ett antal år (heltal) och räknar och skriver ut vad kapitalet blir med ränta på ränta.
k = int(input('Kapital: ')) r = float(input('Ränta: ')) n = int(input('Antal år: ')) result = k*(1+r/100)**n print('Beloppet blir: ', round(result)) # Ger heltalsavrundning
-
Skriv och testa ett program (kod) som läser in två flyttal p och q
och skriver ut rötterna till andragradsekvationen x2 + px + q = 0
Testkör lösningen med p = -3 och q = 2 samt p = q = -1.
Prova också p = q = 1.import math p = float(input('p: ')) q = float(input('q: ')) disc = p*p - 4*q d = math.sqrt(disc) print('x1 = ', (-p + d) /2.0) print('x2 = ', (-p - d) /2.0)
if
-satsen
Tips: Den pythonkod du skriver i dessa övningar lägger du i filen ifEx
.
Den kod som du redan skrivit och testat kommenterar du bort.
För varje ny övning du börjar med skriv en kommentarsrad som kort beskriver övningen, exvis # Denna kod ... bl.a bl.a.
Hittills har alla satser utförts en efter en i tur och ordning.
En vanlig situation är att man vill välja olika vägar beroende på något villkor.
För detta kan man använda en så kallad if
-sats.
Exempel:
Läs in två tal och skriver vilket som är störst.
Kopiera och provkör!
Observera:-
Kolontecknen (
:
) efter villkoretx > y
och efterelse
. -
Indenteringen d.v.s indragningen av
print
-satserna. Indenteringen ska göras med 4 blanksteg vilket Thonny automatiskt lägger till efter en sats som slutar med kolon.
if
-satsens funktion!
Om villkoret är sant d.v.s om x
är större än y
så utförs
de indenterade satserna fram till else:
(två satser i detta fall).
Om villkoret inte är sant d.v.s om x
är mindre än eller lika med y
så utförs de indenterade satserna efterelse:
.
Övning
-
Modifiera programmet som löste andragradsekvationen så att det skriver ut rötterna om dessa
är reella men texten
'Komplexa rötter'
annars.import math p = float(input('p: ')) q = float(input('q: ')) disc = p*p - 4*q if disc < 0: print('Komplexa rötter') else: d = math.sqrt(disc) print('x1 = ', (-p + d) /2.0) print('x2 = ', (-p - d) /2.0)
Satsen elif
Grenarna (satserna som följer raderna med kolon) kan innehålla godtyckliga satser, till exempel if
-satser.
Exempel:
Antag att vi vill undersöka om ett tal är större än eller lika med eller mindre än 0.
Detta kan uttryckas klarare med hjälp av elif
som kan utläsas "else if":
Logiska uttryck
Tips: Den pythonkod du skriver i dessa övningar lägger du i filenlogEx
.
Den kod som du redan skrivit och testat kommenterar du bort.
För varje ny övning du börjar med skriv en kommentarsrad som kort beskriver övningen, exvis # Denna kod ... bl.a bl.a.
Ett logiskt uttryck är ett uttryck som kan vara sant eller falskt.
I Python kallas denna datatyp för bool
och de två värdena
skrivs True
och False
.
Villkoren i if
-satserna ovan är exempel på logiska uttryck.
Dessa konstruerades med hjälp av relationsoperatorerna >
och ==
.
Operator | Betydelse |
---|---|
== | lika |
!= | ej lika |
< | mindre än |
<= | mindre än eller lika |
> | större än |
>= | större än eller lika |
Python har också de logiska operatorerna and
, or
och not
.
teenager = age>12 and age<20
teenager
till True
om variabeln
age
är större än 12 men mindre än 20.
(Anmärkning: I Python kan detta formuleras kortare:
teenager = 12 < age < 20
)
Ytterligare exempel: Koden
while
-satsen
Tips: Den pythonkod du skriver i dessa övningar lägger du i filen whileEx
.
Den kod som du redan skrivit och testat kommenterar du bort.
För varje ny övning du börjar med skriv en kommentarsrad som kort beskriver övningen, exvis # Denna kod ... bl.a bl.a.
En annan vanlig situation är att man vill upprepa en följd av satser flera gånger - en så kallad loop eller slinga.
Exempel 1
Följande program beräknar n! = 1·2·3· ... ·n är för ett inläst värde på n:
Så länge villkoret efter while
är sant, d.v.s så länge i
är mindre än eller lika med
n
så upprepas de indenterade satserna.
Variabeln prod
ackumulerar produkten
och variabeln i
räknar antalet.
Liksom i if
-satsen är både kolon och indentering väsentliga!
Exempel 2: Läs in tal till en lista.
Be användaren mata in positiva och spara dem i en lista. Avbryt när 0 matas in. (Läs gärna lite om Listor, se vänster-marginalen "Minilektion/Referens")break
-satsen
Normalt avslutas en while
-loop när villkoret blir falskt men det går också att avbryta med
en så kallad break
-sats.
Exempel 3: Gissa vilket tal datorn tänker på.
Anmärkning:
I första hand ska man försöka skriva koden så att det syns på while
-villkoret
när loopen ska avbrytas (det är alltid möjligt!) och endast använda break
om det gör koden väsentligt enklare och tydligare!
Övningar
-
Lägg till kod till exemplet 2 ovan som med hjälp av en
while
-sats räknar antalet jämna tal i den inmatade listann = 0 # Räknare för antal jämna tal i = 0 # För att hålla koll på loopen # len(number) betyder längden på listan number, dvs antal tal while i < len(numbers): # För varje tal i listan # numbers[i] är det i:te talet i listan if numbers[i]%2 == 0: # om det talet är jämnt n += 1 # Uppdatera räknaren i += 1 # Nästa tal i listan print('Antal jämna tal: ', n)
-
Skriv kod som ber användaren mata in ett positivt tal.
Så länge det inmatade talet inte är positivt ska frågan ställas om igen
tills användaren ger upp och gör rätt.
Skriv ut texten "OK" när inläsningen lyckats.
x = input('Ge ett positivt tal: ') while float(x) <= 0: x = float(input('Ej positivt! Försök igen: ')) print('OK')
-
Modifiera koden i övningen så att programmet skriver "Äntligen!"
om det krävdes mer än 3 försök.
x = int(input('Ge ett positivt tal: ')) tries = 1 while x <= 0: x = int(input('Ej positivt! Försök igen: ')) tries += 1 if tries <= 3: print('OK') else: print('Äntligen!')
-
Skriv om koden i gissningsleken så att den inte använder
break
!import random number = random.randint(1,100) ans = int(input('Gissa: ')) while ans != number: if ans < number: print('För litet!') else: print('För stort!') ans = int(input('Gissa: ')) print('Rätt!) print('Det var det för den här gången')
for
-satsen
Tips: Den pythonkod du skriver i dessa övningar lägger du i filen forEx
.
Den kod som du redan skrivit och testat kommenterar du bort.
För varje ny övning du börjar med skriv en kommentarsrad som kort beskriver övningen, exvis # Denna kod ... bl.a bl.a.
Ett annat sätt för att upprepa kod är att använda for
-satsen.
I själva verket blir koden lite enklare i flera av exemplen och övningarna ovan med denna sats.
Exempel 1: Beräkning av n! = 1·2·3· ... ·n
med for : |
med while : |
|
prod = 1
for i in range(1, n+1):
prod *= i
|
prod = 1
i = 1
while i <= n:
prod *= i
i += 1
|
Uttrycket range(1, n+1) kommer successivt ge värdena 1, 2, ..., n till variabel i. Vi slipper alltså både att öka i och hålla reda på när iterationen ska avbrytas. Observera att det sista värdet (n+1) inte antas.
Anropet range(n) kommer gå igenom talen 0, 1, ..., n-1.
Beräkningen ovan går alltså också att göra med koden:
for
-satsen kan användas för att gå igenom värdena i en lista med
konstruktionen:
Exempel 2:
Att gå igenom listan numbers
för att räkna
antalet jämna tal blir
for
-satsen (while
-varianten till höger):
n = 0
for x in numbers:
if x%2 == 0:
n += 1
|
n = 0 # Räknare för antal jämna tal
i = 0 # Håller ordning på loopen
# len(numbers) är längden på listan, dvs antal tal i den
while i < len(numbers): # För varje tal listan
# numbers[i] är det i:te talet i listan
if numbers[i]%2 == 0: # Om talet är jämnt
n += 1 # Öka på räknaren
i += 1 # Öka i så att nästa tal hanteras i loopen
|
Övningar
-
Skriv en kod som läser in ett tal x och ett heltal n och som beräknar
xn med multiplikationer d.v.s utan att använda operatorn
**
eller funktionenpow
. Observera att n kan vara negativt!x = float(input('Ge ett tal: ')) n = int(input('Ge ett heltal: ')) p = 1 for i in range(0, abs(n)): p *= x if n < 0: p = 1/p print(f'{x}^{n} = {p}')
-
Skriv kod som skapar en lista innehållande kvadraterna på talen i en annan lista.
numbers = [2, 4, 1, 9, 7] squares = [] for x in numbers: squares.append(x*x) print(numbers) print(squares)
Nästlade for
-satser
En loopkroppen i en for
-sats (gäller även while
-satser)
kan innehålla vilka satser som helst d.v.s även nya for
-satser.
För varje förnamn (fn
) kommer koden alltså gå igenom
alla möjliga efternamn sn
och
lägga till kombinationen i resultat-variabeln.
Övning
-
Givet en lista med positiva heltalsvärden, t.ex.
[10, 15, 24, 17, 9, 8, 3]
. Skriv kod som ritar ut ett liggande stapeldiagram där varje stapel innehåller lika många*
tecken som värdet i listan anger. I detta fall skall alltså utskriften bli:********** *************** ************************ ***************** ********* ******** ***Tips: Anropetprint('*', end='')
undertrycker radframmatningen. Nästaprint
kommer alltså fortsätta på samma rad.values = [10, 15, 24, 17, 9, 8, 3] for v in values: for i in range(v): print('*', end='') print() # Byt rad # Alt, bara en loop for v in values: print('*'*v) # Mångfaldigar strängen '*' v ggr
Anmärkning: Med list-operatorer kan detta resultat åstadkommas enklare. Vi återkommer till det senare i kursen.
Kommentarer och kodlayout
Läs om kodningsreglernaGå till nästa lektion eller gå tillbaka