Programmeringsteknik



Relevanta dokument
Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Föreläsning 2 Programmeringsteknik och C DD1316

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Användarhandledning Version 1.2

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Introduktion till programmering och Python Grundkurs i programmering med Python

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Övningar i 2D2050. Per-Anders Staav (kallas Pa) Epost: eller

DD1311 Programmeringsteknik för S1 Laborationer läsåret

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Föreläsning 1 & 2 INTRODUKTION

Objektorienterad programmering Föreläsning 2

Föreläsning 3 Programmeringsteknik och Matlab DD1315. Importering av moduler. randrange

Övningsuppgifter kapitel 8

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

C++ Lektion Tecken och teckenfält

Programmeringsteknik med C och Matlab

Lär dig programmera! Prova på programmering med enkla exempel! Björn Regnell

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

F4. programmeringsteknik och Matlab

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Inledande programmering med C# (1DV402) Summera med while"-satsen

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Föreläsning 5 Mer om funktioner, villkor

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

MMA132: Laboration 2 Matriser i MATLAB

DD1314 Programmeringsteknik

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

729G04 Programmering och diskret matematik. Python 3: Loopar

TUTORIAL: KLASSER & OBJEKT

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

C++ Slumptalsfunktioner + switch-satsen

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

Uppgifter teknik HT17 (uppdaterad v. 40)

Språket Python - Del 1 Grundkurs i programmering med Python

v. 42 Python HT17 En introduktion Oscar Bergqvist

Föreläsning 1 & 2 INTRODUKTION

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Beräkningsvetenskap föreläsning 2

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Uppgift 1 ( Betyg 3 uppgift )

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

TDIU01 - Programmering i C++, grundkurs

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Laboration: Grunderna i MATLAB

Föreläsning 3 Programmeringsteknik och C DD1316. Innehåll i listor. Uppdateringsoperatorer. +,* och listor. Listor. Indexering

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Erfarenheter från labben

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

Frekvenstabell över tärningskast med C#

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Visual Basic, en snabbgenomgång

v. 43 Python HT17 En introduktion Oscar Bergqvist

Datalogi för E Övning 3

Föreläsning 3. Programmering, C och programmeringsmiljö

Grundkurs i programmering - intro

Platser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat

Introduktion till programmering SMD180. Föreläsning 9: Tupler

Dagens program. Programmeringsteknik och Matlab. Viktiga datum. Ett första exempel. Programmall, vad behöver vi i ett javaprogram?

Föreläsning 3.1: Datastrukturer, en översikt

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Programmering: att instruera en maskin att utföra en uppgift, kräver olika språk:

Introduktion till Matlab

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Mathematica. Utdata är Mathematicas svar på dina kommandon. Här ser vi svaret på kommandot från. , x

Objektorienterad Programmering (TDDC77)

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

729G04 Programmering och diskret matematik. Föreläsning 7

Funktioner. Linda Mannila

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

I Skapa Hej.java och skriv programmet. I Kompilera med javac Hej.java. I Rätta fel och repetera tills du lyckas kompilera ditt program

Språket Python - Del 2 Grundkurs i programmering med Python

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Extramaterial till Matematik Y

STRÄNGAR DATATYPEN. Om du vill baka in variabler eller escape-tecken måste du använda dubbla citattecken. strängar

Planering av ett större program, del 2 - for och listor. Linda Mannila

Inledande programmering med C# (1DV402) Ditt första C#-program med Visual Studio

Använda Python Laboration 1 GruDat, DD1344

Föreläsning 3-4 Innehåll

Föreläsning 1: Intro till kursen och programmering

Föreläsning 18 Filer och avbildningar

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Skolan för Datavetenskap och kommunikation PROGRAMMERINGSTEKNIK FÖRELÄSNING 18

MicroPython Ett textbaserad programmeringsspråk för Micro:bit

For-sats/slinga. Notis

Objektorienterad programmering i Java

Ordlistor, filhantering och ut på webben. Linda Mannila

1 Iteration. 1.1 for-satsen

Transkript:

Programmeringsteknik Materialet i detta häfte är skapat av KTH CSC (http://www.kth.se/csc) och används i en distanskurs som man kan läsa som fristående kurs och få universitetspoäng för. Kursen är avsedd för alla som vill lära sig grunderna i programmering men är också konstruerad för att passa in i några av KTH:s utbildningsprogram. Mer information om kursen finns på: http://www.csc.kth.se/utbildning/kth/kurser/dd100n/ Copyright KTH CSC 2010 för hela häftet. Kopierat med tillstånd av KTH CSC. Bearbetat av Håkan Lundberg, Cybergymnasiet, www.cybergymnasiet.se. KTH CSC

Innehållsförteckning 1. Programmeringsintro...4 Vad är en dator?...4 Vad är ett program?...5 Vad är ett programspråk?...6 Installera Python på din dator...7 Kom igång med Python och IDLE...7 Tilldelning...8 Olika slags värden...8 Uppräkning...9 Utskrifter...10 Kommentarer...11 2. Styrstrukturer...12 Inläsning...12 Villkor...13 Strukturen på en if-sats är...13 Konstanter...14 Else-del i if-sats...14 Flera villkor...15 Likhet...16 While-slingor...16 Hur exekveras programmet?...17 En oändlig while-slinga...18 Struktur på while-sats...19 När ska man använda en while-sats?...19 Inlämningsuppgift 1 (Prat i kvadrat)...20 3. Listor och Anrop...21 Listor...21 Vad är en lista?...21 Hur använder man en lista?...22 Åter till exemplet...23 Mer om listor...25 Uppslagslistor...25 Slingor...26 Moduler...27 Random...28 Sid 2 av 57

4. Funktioner...30 Vad har man funktioner till?...30 Dela upp ett problem i funktioner...30 Definiera en funktion...31 Anropa en funktion...31 Skicka utdata från en funktion (returvärden)...32 Skicka indata till en funktion (parametrar)...35 Rekursion...37 Inlämningsuppgift 2 (Rondelet)...38 Tips...39 Inlämning...39 5. Filer...40 Filhantering...40 Textfiler i Python...40 6. Klasser...42 Objektorientering...42 Attribut...42 Metoder...43 Speciella metoder: konstruktorn och str...43 Klassen...44 Exempel: Husdjursprogrammet...45 Sortering av en lista med objekt...47 Inlämningsuppgift 3 (Nöjesfält)...48 Ordlista...49 Kortfattad programmerings- och Pythonordlista...49 A...50 B...50 D...51 E...51 F...51 G...52 H...52 I...52 K...53 L...53 M...54 N...54 O...55 P...55 R...55 S...55 T...56 U...56 V...57 W...57 ÅÄÖ...57 Sid 3 av 57

1. Programmeringsintro Vad är en dator? En dator i dagligt tal består väsentligen av ett tangentbord, en mus och en skärm som ibland sitter i samma låda som själva datorn. I tekniska sammanhang menar man ibland lådan med datorn och ibland endast processorn som sitter i lådan. Löstagen processor (i svart) med sex rader med kontakter runt om. Processorn sitter fast på ett kretskort, ofta kallat moderkortet och är kopplat till flera olika minnen. Viktigaste minnena är registren i processorn, där alla beräkningar och tolkningar (t ex om ett tal är större än ett annat) sker, RAM-minnet (Random Access Memory) där program ligger när de körs, och skivminnet (ofta kallat hårddisk) där program och dokument lagras för att vara kvar även när datorn har stängts av (till skillnad från RAM-minnet som töms varje gång strömmen stängs av). Minneskort med minnen (RAM) i svart Uppgifter som man brukar se i annonser om datorer är t ex processorhastighet mätt i MHz (MegaHertz), dvs miljoner cykler per sekund eller till och med GHz (GigaHertz), dvs miljarder cykler per sekund. Betyder detta att en 2GHz CPU är dubbelt så snabb som en 1MHz CPU? Inte nödvändigtvis. Det beror också på hur mycket arbete varje CPU utför per cykel. Datorns prestanda är också i högsta grad beroende av minnets storlek och hastighet. RAM-storlek som mäts i MB (MegaByte), dvs miljoner byte. En byte består av vanligen åtta bitar och kan t ex Sid 4 av 57

lagra ett tal mellan 0 och 255. En bit är den minsta minnesenheten på en dator och innehåller en etta eller en nolla. Skivminnet mäts också i byte och är något hundratal gånger större än RAM-minnet. Ibland hör man benämningen "data". I IT-sammanhang betyder data endast information. Personer som använder data (eller ännu värre: "datan") för att referera till själva datorn upplevs ofta som mindre kunniga (se t ex Maria Bloms film Masjävlar) av de som skiljer på datorer och informationen som datorerna behandlar. Om du glömmer bort vad ett visst ord betyder kan du slå upp det i vår ordlista över pythontermer. På många ställen i den här kursen finns det testfrågor som du kan använda för att kolla om du har förstått. Prova först att lösa uppgifterna på egen hand. Här är en första uppmjukningsfråga. Vad är en dator? 1. Detsamma som en processor med minne. 2. Detsamma som en processor, skärm, dator, tangentbord och mus. 3. Detsamma som en data. Vad är ett program? Ett (dator-) program är en uppsättning instruktioner som styr vad datorn ska göra. Vanligen finns det indata (t ex knapp- eller mustryckningar) som behandlas av datorn enligt instruktionerna i programmet vilket resulterar i utdata (t ex text, diagram, bilder) på skärmen. Sid 5 av 57

En analogi är stickning där samma indata (garn) med ett program kan bli till utdata i form av ett par sockor och med ett annat program till en tröja. Precis som själva datorn består ett datorprogram väsentligen av två saker: minne och instruktioner. Minnet kallas för variabler, instruktionerna kallas ofta för satser. Satserna är det som avgör hur variablerna manipuleras (dvs ändrar värde). Vad är ett datorprogram? (Det kan finnas flera riktiga svar.) 1. Något som styr en dator. 2. Detsamma som en processor, skärm, tangentbord och mus. 3. Något som styr hur en dator manipulerar indata för att presentera utdata. 4. En samling obegripliga ord i godtycklig ordning. 5. En samling av variabler och satser. Vad är ett programspråk? En dator förstår endast sitt eget datorspråk, maskinkod, som är mycket svårhanterligt även för de flesta erfarna programmerare. För att underlätta för alla som programmerar skriver man därför vanligen program i ett programspråk som t ex Java, C++ eller som vi ska använda i denna kurs: Python. För att kunna få datorn att förstå och utföra program skrivna i Python krävs det att man översätter (kompilerar, tolkar, interpreterar) det till datorns eget språk. Sid 6 av 57

Installera Python på din dator För att kunna läsa den här kursen måste du installera Python på din dator. Python finns tillgängligt för många olika operativsystem, bland annat Linux/Unix, Mac OS X och Windows, och är enkelt att installera. Innan du laddar ned Python, begrunda nedanstående: Python 3.0 släpptes i början av december 2008, i denna version har bland annat syntaxen för printkommandot ändrats och även en del andra förändringar genomförts. Kursmaterialet i denna kurs är anpassat efter Python 2.4-2.6 vilket innebär att alla exempel, prov och övningar i boken förutsätter att någon av dessa versioner används. För dig som ska installera Python på din dator, välj version 2.6.1 tillgänglig via www.python.org. På webbplatsen python.org hittar du all information du behöver för att kunna ladda ner och installera den senaste versionen av Python på din dator. Gå till python.org och följ instruktionerna för att installera Python. Om du får problem så kan du, som alltid, ställa en fråga i kursens webbforum eller kontakta kursens handledare. Kom igång med Python och IDLE Nästa steg är att börja använda Python och IDLE. IDLE är ett ett utvecklingsverktyg för Python med vars hjälp man enkelt och behändigt kan skriva och testa sina program. One Day of IDLE Toying (http://hkn.eecs.berkeley.edu/~dyoo/python/idle_intro/) är en kort och lättläst introduktion som visar hur man använder IDLE för att skriva sitt första program. Gå dit, läs texten och prova själv på att skriva och köra ett Python-program (svensk översättning finns). För Python finns det alltså två sätt att skriva program. Antingen skriver man programkod direkt i en pythontolk och ser resultatet av varje kommando efterhand som man skriver in sitt program. Detta fungerar bäst om man vill skriva mycket korta program som bara ska användas en gång eller om man vill testa hur något fungerar i Python. Det andra sättet är att använda ett redigeringsprogram, till exempel det som är inbyggt i IDLE, och sedan låta pythontolken översätta och köra programmet. Fördelen med detta är att det blir enklare att gå tillbaka och ändra programmet om det inte blev riktigt rätt eller om man kommer på roliga tillägg. När man skriver större program gör man alltid på detta sätt. Eftersom tolken bara är ett dumt program kräver den att texten i programfilen (eller det du skriver i tolken) mycket strikt följer bestämda regler. Ett väldigt litet pythonprogram som kan kompileras och köras utan fel ser ut så här: print "Hej!" Om man skriver någonting som kompilatorn inte kan översätta kommer den att tala om var det är fel och vägra att översätta allt. Lyckas översättningen så går programmet att köra. I det här fallet kommer texten Hej! att skrivas ut. Sid 7 av 57

Tilldelning För att hålla reda på data i ett program används variabler. Alla variabler har ett namn för att kunna skilja dem åt. Du kan jämföra med minnet på en miniräknare. Enklare räknare har bara ett minne och behöver därför inte namnge det. Mer avancerade räknare har flera minnen som namnges med t ex ett nummer. Ett datorprogram kan hålla reda på en stor mängd data. När man programmerar kan man lägga in data som t ex längd vikt och ålder i datorns minne med hjälp av variabler. För att tilldela variablerna värden skriver man i Python t ex: age = 18 length = 180 weight = 80 I vänsterledet (vänster om =) skriver man namnet på den variabel som ska få ett nytt värde och i högerledet (höger om =) värdet som tilldelas. Likhetstecknet kallas i programmeringssammanhang för tilldelning (eller tilldelningsoperator). Man kan också skriva variabler i högerledet: my_cousins_age = age Då tilldelas my_cousins_age samma värde som age har. Alla variabelnamn i Python måste börja med en (engelsk) bokstav (inte åäö), men efter den kan man blanda bokstäver och siffror. Högerledet kan innehålla uträkningar som behöver utföras innan tilldelningen sker: a = 3 b = a + 15 Ovanstående två rader ser till att b får värdet 18. Ett bra sätt att förstå vad som händer i ett program är att stegvis går igenom det för hand och skriva upp alla variabelvärden. Varje variabel har endast ett värde åt gången och kommer inte ihåg vad för värde den haft tidigare. Vad blir värdet på variabeln d efter följande rader? a = 12 b = a c = a + b + 3 d = c - b Vad är det för fel på följande kod? 6606 = svenska_flaggans_dag 1. 6606 är ett ogiltigt variabelnamn. 2. Det blir fel för att 6606 inte är svenska flaggans dag. 3. Man kan inte tilldela värdet 6606 ett nytt värde. Olika slags värden Det finns olika slags värden man kan tilldela variabler. Som vi tidigare sett kan man tilldela Sid 8 av 57

variabler värden i form av tal, men man kan också tilldela teckenföljder som t ex namn. I datalitteraturen kallas teckenföljderna för strängar (av engelskans string som bland annat betyder sträng och kedja). namn1 = 'Oskar' namn2 = "Kajsa" För att skilja på variabelnamn och strängar omsluter man strängar med apostrofer eller citattecken. namn3 = 'Sima' namn4 = namn3 I exemplet ovan får namn4 värdet 'Sima'. Hade man skrivit apostrofer runt namn3 hade namn4 istället fått värdet 'namn3'. Vad blir det för värden på a och b efter följande rader? djur = 'katt' a = djur b = 'djur' Uppräkning Man kan öka värdet på variabler som tidigare har tilldelats ett värde med hjälp av uppräkningsoperatorn +=. Om variabeln innehåller en siffra räknas värdet upp. Efter följande rader my_age = 19 my_age += 1 får my_age värdet 20. Den första raden ger my_age värdet 19 och den andra raden räknar upp my_age med 1. När du trycker på pil upp eller ned i telefonnummerlistan på din mobil utför den en upp- eller nedräkning på samma sätt som andra raden. Man kan åstadkomma samma sak med satserna: my_age = 19 my_age = my_age + 1 Men så många tecken orkar få programmerare att skriva. Anledningen att variabeln heter my_age istället för min_ålder är att åäö inte fungerar i variabelnamn. Om variabeln innhåller en sträng läggs den nya strängen till den gamla. Efter satserna: husdjur = "hund " husdjur += "och katt" Kommer husdjur att vara "hund och katt". Sid 9 av 57

Vad är värdet på a och s efter följande rader? a = 100 b = 10 a += b s = "svaret är " s += "a" 1. a = 10010, s = "svaret är 10010" 2. a = 110, s = "svaret är a" 3. a = 100, s = "svaret är 100" 4. a = 110, s = "svaret är 110" 5. 1 = 110, s = "svaret är 100" Utskrifter För att skriva ut värden på skärmen använder man instruktionen print. Prova följande pythonprogram i IDLE: x = 15 print x print 1001 print 14 Genom att använda ett kommatecken så kan man skriva ut flera saker på samma rad. Exempelvis skriver print "Charles is", 19, "years old" ut "Charles is 19 years old" på samma rad. Observera att Python automatiskt lägger till ett blanktecken mellan strängarna vid varje kommatecken. Precis samma sak skrivs ut på samma sätt av: age = 19 print "Charles is", age, "years old" Vill man att en senare utskrift (t ex en som görs av en print-sats några rader senare) ska göras på samma rad som den man just skriver ut låter man ett komma stå sist på raden: print "Charles is", age = 2006-1987 print age, "years old" Ovanstående skriver också ut samma sak som tidigare. Om man vill kombinera strängar utan att lägga till ett blanktecken så kan man istället använda sig av ett vanligt plustecken: Sid 10 av 57

print "Charles is", age = 2006-1987 print age + "." Utskriften blir då "Charles is 19.". Kommentarer # Skriv ut Charles ålder print "Charles is", age = 2006-1987 print age, "years old" Den första raden i det här programmet, raden som börjar med #-tecknet, är en så kallad kommentar. Raden påverkar inte vad som händer när man kör programmet utan är enbart avsedd som information för den som läser programmet. I Python räknas allt från och med #-tecknet till radslut som en kommentar. Man kan till exempel skriva så här: salary += 1 # Jippi, löneförhöjning! Kommentarer kan kanske verka överflödiga men är i själva verket mycket viktiga för att man ska kunna förstå och överblicka sina program. Vad skrivs ut när man kör följande program? # Skriv ut Annas telefonnummer namn = 'Anna' telefon = '06509911122' mobil = '07079911322' print namn, "har telefon", telefon Sid 11 av 57

2. Styrstrukturer Mamma ska resa till mormor över helgen. Hon är orolig för att lille Lasse, som ska vara alldeles ensam hemma, kommer att klä sig för tunt och vill därför ha ett program som hjälper honom med klädseln. För att kunna skriva ett sådant program behöver vi lära oss två saker: hur man läser inmatning från tangentbordet och hur man jämför tal. Inläsning För att läsa från tangentbordet använder man en input-sats, t ex temperatur = input() Efter denna sats kommer variablen temperatur att innehålla det som den som körde programmet skrev på tangentbordet (och avslutade med returtangenten). Tyvärr är det svårt för den som kör programmet att fatta att det är just temperatur som ska matas in eftersom programmet inte frågar efter något. Det fixar man lätt med en print-sats: # Exempel som visar hur inläsning går till. print "Ge utetemperatur: " temperatur = input() Den här konstruktionen (skriv ut fråga och läs in svar) är så vanlig att man ordnat ett förkortat skrivsätt för den: # Exempel som visar hur inläsning kan göras kortare. temperatur = input("ge utetemperatur: ") Viktigt att förstå är att input-satser läser inmatningen i den ordning den kommer. Det går inte att hoppa över någon del av inmatningen. Om någon skriver t ex 17[retur]42[retur] och du endast vill läsa det andra talet (42) måste man först läsa det första (17). Vad får a för värde om inmatningen från tangentbordet är 22 <retur> 42 <retur>? a = input() Vad får a för värde om inmatningen från tangentbordet är 17 <retur> 12 <retur>? a = input() a = input() Vad får a för värde om inmatningen från tangentbordet är 22 <retur> 35 <retur>? a = input() b = input() Vad får a för värde om inmatningen från tangentbordet är 19 <retur> 67 <retur>? b = input() a = input() Sid 12 av 57

Villkor När vi väl vet temperaturen kan vi kolla om den är för låg genom att skriva: temperatur = input("ge utetemperatur: ") if temperatur < 5: print "Ta på dej en halsduk, lille vän!" Detta program kommer att se ut så här på skärmen: Ge utetemperatur: 1 Ta på dej en halsduk, lille vän! eller Ge utetemperatur: 17 Detta program kommer alltså att skriva ut texten "Ta på dig en halsduk, lille vän!" endast om (svaret på frågan om) utetemperaturen är mindre än 5. Strukturen på en if-sats är if <BOOLESKT UTTRYCK> : <EN ELLER FLERA SATSER SOM SKA EXEKVERAS> En if-sats startar med reserverade ordet if, efter ordet if ska ett uttryck som resulterar ett booleskt värde (True eller False) komma. Efter uttrycket kommer tecknet kolon (:). Efter kolon kommer de satser som ska exekveras om värdet blir True. Dessa satser ska indenteras (flyttas in några steg) med mellanslags- eller tabulator-tangenten. För att undvika problem bör du inte blanda indentering gjord med mellanslag och tabbar i samma fil. Vad kommer att skrivas ut av följande program om a = 12 och b = 12? if a < b: print "X", print "Y" Vad kommer att skrivas ut av följande program om a = 4 och b = 4? if a <= b: print "X", print "Y" Vad kommer att skrivas ut av följande program om a = 12 och b = 17? if a < b: print "X", print "Y", print "Z" Vad kommer att skrivas ut av följande program om a = 8 och b = 6? if a <= b: print "X", print "Y", Sid 13 av 57

print "Z" Konstanter Programmerare och andra nördar är kända för sin torra humor. Ett sätt att införa det i programmet är att införa en konstant. En konstant i Python är precis som en variabel, men som en konvention skriver man variabelnamnet med versaler, t ex: MAMMAS_FRYSPUNKT = 5 temperatur = input("ge utetemperatur: ") if temperatur < MAMMAS_FRYSPUNKT: print "Ta på dej en halsduk, lille vän!" En konstant ändrar inte funktionen i ett program från användarens sida, men det gör programmet lättare att modifiera för programmeraren (ffa om programmet är stort) och rätt använd kan den också göra programmet tydligare. Else-del i if-sats Om villkoret temperatur < MAMMAS_FRYSPUNKT är False händer ingenting alls när man kör programmet. Det är trist programmering. Mamma vill gärna ha en uppmuntrande utskrift då och bygger ut if-satsen så här: MAMMAS_FRYSPUNKT = 5 temperatur = input("ge utetemperatur: ") if temperatur < MAMMAS_FRYSPUNKT: print "Ta på dej en halsduk, lille vän!" else: print "Mammas gullgubbe slipper halsduk!" Detta program kommer att se ut så här på skärmen: Ge utetemperatur: 2 Ta på dej en halsduk, lille vän! eller Ge utetemperatur: 17 Mammas gullgubbe slipper halsduk! Satserna efter else kommer alltså att utföras när villkoret i if-satsen är False. Vad kommer att skrivas ut av följande program om a = 13 och b = 7? if a <= b: print "A", print "B", else: print "C", print "D" Vad kommer att skrivas ut av följande program om a = 36? Sid 14 av 57

MITTEN = 42 if a <= MITTEN: print "A", print "B", else: print "C", print "D" Flera villkor Plötsligt kommer mamma på att det kan bli ännu kallare och vill ha en tredje utskrift om temperaturen är under noll. # Ett program som visar hur if-elif-else fungerar MAMMAS_FRYSPUNKT = 5 CELSIUS_FRYSPUNKT = 0 temperatur = input("ge utetemperatur: ") if temperatur < CELSIUS_FRYSPUNKT: print "Ta på dej halsduk och mössa!" elif temperatur < MAMMAS_FRYSPUNKT: print "Ta på dej en halsduk!" else: print "Mammas gullgubbe slipper halsduk!" Detta program kommer att se ut så här på skärmen Ge utetemperatur: 3 Ta på dej en halsduk! eller Ge utetemperatur: 17 Mammas gullgubbe slipper halsduk! eller Ge utetemperatur: -2 Ta på dej halsduk och mössa! Hur många villkor som helst kan kombineras med hjälp av elif. Villkoren kontrolleras i tur och ordning, uppifrån och ned. Det första villkor som blir True får programmet att fortsätta exekveringen på de närmast följande indenterade satserna efter kolon fram till nästa ickeindenterade sats. Därefter hoppas resten av if-satsen över. Om inget villkor blir True (och endast då) utförs de indenterade satserna efter else. Vad kommer min, max och b att ha för värden efter följande satser om a = -2? min = 5 max = 10 b = 0 if a < min: min = a elif a > max: max = a Sid 15 av 57

else: b += 1 Likhet När man vill testa likhet så används dubbla likhetstecken. Enkelt likhetstecken används bara till tilldelning. Exempel: betyg = 2123 if betyg == 2000: print "Du har precis kommit in på högskolan" elif betyg > 2000: print "Du har kommit in på högskolan" else: print "Du har inte kommit in på högskolan" Vad skrivs ut om x = 5 och y = 3? if x > 2: if y > 4: print "blå" elif x == y: print "gul" else: print "röd" else: print "grön" While-slingor När en eller flera satser ska upprepas ett antal gånger är en while-sats ett bra hjälpmedel. Anta att man vill skriva ett program som skriver texten "Python" 5 gånger på skärmen. Detta kan man åstadkomma genom att använda en while-sats enligt nedan. Siffrorna i början på varje rad är för att vi ska kunna referera till raderna i texten. När man programmerar skriver man förstås utan siffror och kolon. 1: antal_varv = 0 2: while antal_varv < 5 : 3: print "Python" 4: antal_varv += 1 Innan vi går igenom programmet presenterar vi idén bakom programkoden. För att lösa problemet behöver vi en räknare för att hålla reda på antalet gånger texten "Python" skrivits ut så att programmet kan sluta skriva ut texten efter 5:e gången. Programmet har alltså följande uppgifter att utföra: Skapa en räknare och nollställa den Sid 16 av 57

Kontrollera räknarens värde Skriva ut texten "Python" Uppdatera räknarens värde Nu ska vi gå igenom programmet i detalj. I radnummer 1 har vi koden "antal_varv = 0". Där har vi valt variabeln antal_varv som ska fungera som räknare och får startvärdet 0. Resten av programmet är while-satsen. Syntaxen för en while-sats liknar syntaxen för if-satser som vi har sett tidigare i lektionen om villkor. Radnummer 2 är "while antal_varv < 5 :" som är följande instruktion för datorn: "Exekvera alla indragna rader som kommer efter kolon så länge variabeln antal_varv har ett värde som är mindre än 5" Radnummer 3 (print "Python") är en indragen rad och ingår därför i while-slingan. Den skriver ut texten "Python". Radnummer 4 (antal_varv += 1) ser till att räknaren ökar värdet med ett. Uppdatering av antal_varv är ett viktig steg i while-satsen som tillsammans med villkoret "antal_varv < 5" (i rad 2) avgör om texten "Python" ska skrivas ut ytterligare en gång eller inte. Vad skrivs ut av följande program? i = 0 v = 1 while i < 5: v = i * v print v i += 1 Hur exekveras programmet? antal_varv=0 while antal_varv < 5 : print "Python" antal_varav += 1 I första raden av programmet får variabeln antal_varv värdet 0. Därefter exekveras uttrycket antal_varv < 5 och eftersom att 0 är mindre än 5 är villkoret uppfyllt (True) vilket får till följd att while-slingan startar. Det första som händer i den är att print "Python" exekveras. Därefter exekveras antal_varav += 1 och därmed ändrar antal_varv värde till 1. Nu är slingan slut och därför exekveras uttrycket antal_varv < 5 igen och eftersom att 1 är mindre än 5 går vi ett varv till i while-slingan. Där exekveras print "Python" och antal_varav += 1. Sid 17 av 57

Ovanstående tre satser upprepas ytterligare tre gånger tills antal_varv får värdet 5. När då uttrycket antal_varv < 5 exekveras, till skillnad mot alla tidigare gånger, blir värdet falskt (False) eftersom att 5 inte är mindre än 5. Och därför avslutas exekvering av while-satsen och i det här fallet avslutas även programmet då det inte finns några fler satser kvar att exekvera. I vilken ordning exekveras följande program? A while B: C D Vi antar följande förutsättningar: Programmet går endast tre varv. A är en godtycklig tilldelningssats. B är en godtycklig villkorssats som är sann i tre varv. C och D är godtyckliga utskriftssatser. 1.ABCD 2.ACCCD 3.ABCCCD 4.ABCBCBCD 5.ABCBCBCBD 6.ABCABCABCD En oändlig while-slinga Om man tar bort rad nummer 4 från programmet får man följande: antal_varv = 0 while antal_varv < 5 : print "Python" Vi ser att variabeln antal_varv inte kommer att ändras i while-satsen. Detta gör att villkoret (antal_varv < 5) kommer förbli sant under hela programmet alltså kommer texten "Python" att skrivas ut om och om igen oändligt många gånger. Om du råkar ut för detta när du kör ett program kan du avbryta programmet genom att trycka Ctrlc. Det gör du genom att först trycka ner tangenten märkt "Ctrl" på tangentbordet och fortsätta hålla den nere och samtidigt som du också trycker ner "C". Hur många gånger skrivs texten "hej" när man kör följande program? v = 5 while v > 5: print "hej" v += 1 print "hej" Sid 18 av 57

Kommer följande program skriva ut texten "hej då"? Om inte, varför? i = 0 while i < 10: print "hej" print "hej då" Struktur på while-sats Strukturen på en while-sats är exakt som strukturen på en if-sats om man bara byter ut if mot while i en if-sats. while <BOOLESKT UTTRYCK> : <EN ELLER FLERA SATSER SOM SKA EXEKVERAS> En while-sats startar med reserverade ordet "while", efter ordet "while" ska ett uttryck som resulterar ett booleskt värde (True eller False) komma. Efter uttrycket kommer tecknet kolon (:). Efter kolon kommer de satser som ska exekveras flera gånger. Vad är det som är fel i följande while-sats? Programmet ska skriva ut "hej" oändligt antal gånger. i = 1 WHILE i < 10: print "hej" 1. 'WHILE' och 'print "hej"' måste stå rakt under varandra och ej vara förskjutna. 2. i = 1 ska tas bort. 3. i < 10 ska ändras till i == 1. 4. Ordet 'WHILE' ska stå med små bokstäver. När ska man använda en while-sats? En while-sats används när en eller flera rader kod ska exekveras ett bestämt eller obestämt antal gånger efter varandra. Följande är exempel på program där antalet upprepningar är obestämd och beror på användarens inmatning: tal = input("gissa ett tal mellan 1 och 100:") while tal!= 74 : tal = input("fel, försök igen:") print "Grattis du gissade rätt!" I vilka av följande tillfällen kan man med fördel använda sig av while-satser? 1. När man vill att programmet ska skriva ut samma text flera gånger efter varandra. 2. När man vill skriva ut alla tal mellan 5 och 95. 3. När man vill utföra en sak 10 gånger. Sid 19 av 57

Inlämningsuppgift 1 (Prat i kvadrat) I den första inlämningsuppgiften ska du skriva och skicka in ditt första pythonprogram. Programmet ska skriva ut de första n kvadrattalen: 1*1, 2*2,..., n*n, där talet n anges av den som använder programmet. Programmet ska också skriva ut summan av dessa kvadrattal. Här är ett exempel på en körning: Välkommen till prat i kvadrat. Hur många kvadrattal vill du skriva ut? 4 1 * 1 = 1 2 * 2 = 4 3 * 3 = 9 4 * 4 = 16 Summan av kvadrattalen: 30 Programmet ska finnas i en fil med namnet Uppgift1.py. Följ den här mallen: # Programmeringsteknik webbkurs KTH inlämningsuppgift 1. # <Ditt namn> # <Datum> # <Kort beskrivning av vad programmet gör> <Programkod> Innan du skickar in programmet så ska du testa att det fungerar. Kontrollera speciellt att programmet fungerar korrekt även om användaren skriver in talet 0 eller 1. (I den här uppgiften finns det inget krav på vad som ska hända om användaren matar in ett negativt tal eller skriver in något annat än ett heltal. Om du vill så får du dock gärna försöka upptäcka felaktig inmatning och skriva ut lämpliga felmeddelanden.) Observera att filen måste vara i textformat, vilket den automatiskt blir om du skapar den med hjälp av IDLE. Detta för att vi ska kunna prova och testköra ditt program. Sid 20 av 57

3. Listor och Anrop Listor Oftast är den som skriver ett program dvs programmeraren inte den som kommer att använda det. Den som skriver programmet har kunskap om programmering men man ställer inga krav om kunskap i programmering för den som ska använda programmet. Detta gör att programmeraren måste skriva programmet på ett sätt så att den kan köras av olika användare med olika förväntningar. Antag att vi vill skriva ett program som ska läsa in fem stycken namn och när man har matat in alla fem namnen skrivs de ut i omvänd ordning (dvs sista namnet först). Med den programmeringskunskap du har idag är detta fullt möjligt. Det är bara att använda sig av fem olika variabler för att lagra namnen och sedan skriva ut dem i omvänd ordning, som programmet nedan. (Funktionen raw_input fungerar ungefär som input. Skillnaden är att raw_input inte försöker översätta indata till lämpligt format utan läser in hela raden som en teckensträng som kan bestå av både bokstäver, siffor, mellanslag och andra tecken.) namn1 = raw_input("ange ett namn: ") namn2 = raw_input("ange ett namn: ") namn3 = raw_input("ange ett namn: ") namn4 = raw_input("ange ett namn: ") namn5 = raw_input("ange ett namn: ") print namn5, namn4, namn3, namn2, namn1 Programmeraren har bestämt att 5 och endast 5 namn ska matas in. Programmet fungerar varken för färre eller fler antal namn. Det vore bättre om programmet ställer en fråga om hur många namn som ska matas in i början av programmet och användarens svar på denna fråga avgör om hur många variabler som ska användas till att lagra alla namn. Men programmeraren kan fortfarande inte veta hur många variabler som ska användas eftersom att olika användare kommer att kunna mata in olika antal namn. Hur ska programmeraren göra? Lösningen är att använda en lista. Vad är en lista? En lista är variabel som kan ha flera värden. Varje värde får ett eget index (nummer) som kan användas för åtkomst eller modifiering av värdet. Om en vanlig variabel fungerar som en stol så fungerar en lista som en bänkrad i en biograf när det är numrerad placering. Telefonnummerlistan i din mobil är ett exempel på en lista. Sid 21 av 57

Hur använder man en lista? Listor skrivs med hjälp av klamrar [] namnlista = 3*[None] namnlista blir då en variabel som har plats för 3 olika värden. None betyder att alla platserna ska vara lediga. Om man vill tilldela första platsen i variabeln ett värde t ex talet 47 gör man på följande sätt: namnlista[0] = 47 I ovanstående rad är namnlista namnet på listan. [0] specificerar avsedd plats i listan, 0 är ett index som används för specificera första plats. = 47 som vi vet sedan tidigare är en tilldelningssats. Hela raden gör att första plats i listan får värdet 47. Programmerare är lite lustiga på det sättet att 0 betyder första plats i en lista. Detta gäller i flera programspråk, t ex Java och C++. Om man vill tilldela andra plats i listan ett nytt värde t ex "hej" använder man därför indexet 1: namnlista[1] = "hej" För att skriva ut alla värden som finns i listan kan man skriva som nedan: print namnlista Om man endast vill skriva ut värdet på en specifik plats i vektorn får man använda sig av klamrar igen: print namnlista[2] Raden ovan skrivet ut värdet som finns på tredje platsen i listan. Hur många platser har följande lista? Sid 22 av 57

bilar = 16*[None] Åter till exemplet Nu när vi har lärt oss lite om listor ska vi försöka skriva programmet som frågar efter ett antal namn och skriver ut dem i omvänd ordning: 1. antal_namn = input("hur många namn vill du mata in? ") 2. namnlista = antal_namn*[none] 3. i = 0 4. while i < antal_namn: 5. namnlista[i] = raw_input("ange ett namn: ") 6. i += 1 7. j = antal_namn - 1 8. while j >= 0: 9. print namnlista[j] 10. j -= 1 I rad 1 frågar programmet efter ett tal (antal namn) inmatningen lagras i variabeln antal_namn. I rad 2 skapar vi en lista som har lika många platser som användarens svar från första raden. I rad 3 använder vi iterationsvariabeln i som ska användas i while-slingan som finns i rad 4-6. Rad 4-6 är en while-slinga som ska upprepa satsen i rad 5 så länge variabeln i är mindre än antalen namn som ska matas in. Rad 5 frågar användaren efter ett namn och svaret kommer att lagras på i:te platsen i namnlista. I rad 6 vi ökar det värde som i har med 1. En sammanfattning av den första while-slingan är att variabeln i startar med värdet 0 och i första varvet i slingan kommer namnlista[i] alltså att motsvara namnlista[0] eftersom i är 0. Alltså tilldelas första plats i listan ett nytt värde. Sedan när i ökas med 1 så får variabeln i värdet 1. Och i andra varvet kommer namnlista[i] motsvara namnlista[1] dvs andra plats i listan osv. Detta upprepas tills i blir lika med antal_namn och alla platser i listan har fått ett värde. När while-slingan i rad 4-6 är klar kommer listan innehålla så många namn som användaren ville mata in. Nu är det dags att programmet skriver ut alla namn i omvänd ordning. För att skriva ut sista namnet först måste vi ta reda på index för det sista namn som matades in. Vi vet att index för första namnet är 0, index för andra namnet är 1 och index för tredje namnet är 2 osv. Men vad är index för det sista namnet? Vi vet att antal namn som har matats in är lika många som värdet antal_namn (rad 1 i programmet). Om antal_namn t ex har värdet 10 så ska sista namnet ha placerats i plats nummer Sid 23 av 57

9 (= 10-1). I radnummer 7 vill vi tilldela variabeln j ett startvärde, startvärdet ska vara samma värde som index för sista namnet i listan. Med ovanstående kunskap vet vi att j = antal_namn - 1 kommer att vara index för den sista plats i listan. Rad 8-10 är en while-sats som skriver ut alla element från namnlista i omvänd ordning. Så här fungerar den andra while-satsen: Variabeln j har ett startvärde som är lika med index för sista platsen. While-satsen ska upprepa print-satsen (rad 9) så länge variabeln j har ett värde som är större eller lika med 0. Första varvet i slingan kommer namnlista[j] att motsvara sista namnet som finns i listan eftersom att j har just ett värde som är lika stort som index för sista namnet. På rad 10 kommer värdet av variabeln j minskas med 1. Alltså, j kommer att ha samma värde som index för näst sista namnet i listan och därför i andra varvet i slingan kommer namnlista[j] att motsvar näst sista namn i listan osv. Antag att vi har listan ages med ålder på 50 personer. Vilket av följande är korrekt om man vill komma åt femtonde elementet i listan? 1.ages[14] 2.ages14 3.ages15 4.ages, 14 5.ages[15] 6.ages, 15 Antag att vi har listan ages med ålder på 50 personer. Vilket av följande kodexempel summerar alla element i listan ages? 1. i = 0 sum = 0 while i < 50: sum += ages + i i += 1 2. i = 0 sum = 0 while i < 50: sum += ages[i] i += 1 3. summera(ages) 4. i = 0 Sid 24 av 57

sum = 0 while i < 50 sum += i i += 1 Mer om listor Det finns ytterligare några list-kommandon som är bra att känna till. Man kan lägga till ett nytt element i slutet av en lista med hjälp av append(): namn = ["Adam", "Bertil", "Ceasar"] namn.append("david") # Listan namn utökas till ["Adam", "Bertil", "Ceasar", "David"] Man kan också slå samman två listor med hjälp av ett vanligt plus-tecken: a = [1, 2, 3] + [4, 5] # Resultatet blir [1, 2, 3, 4, 5] Slutligen kan man plocka ut dellistor på följande sätt: veckodagar = ["mån", "tis", "ons", "tor", "fre", "lör", "sön"] # plockar ut elementen fr o m index 0 t o m index 4 i listan vardagar = veckodagar[0:5] # plockar ut elementen fr o m index 5 t o m index 6 i listan helgdagar = veckodagar[5:7] Uppslagslistor Ibland så har man en mängd data där det inte är naturligt att numrera elementen som i en vanlig lista. Då kan man istället använda en uppslagslista (dictionary). En uppslagslista består av ett antal poster, där varje post har en nyckel och ett värde. I följande exempel så håller vi reda på antalet dagar per månad med hjälp av en uppslagslista. I varje post så finns det en nyckel, som är en textsträng som innehåller månadens namn, och ett värde, som är ett tal som anger antalet dagar i månaden. Man kan använda både strängar och tal som nycklar och värden. month = {"jan":31, "feb":28, "mar":31, "apr":30, "maj":31, "jun":30, "jul":31, "aug":31, "sep":30, "okt":31, "nov":30, "dec":31} print month["feb"] # Skriver ut 28 month["feb"] = 29 # Ändrar "feb":s värde till 29 print month["feb"] # Skriver ut 29 # Tar bort en post och lägger till två nya i uppslagslistan. del month["feb"] month["feb_vanlig"] = 28 month["feb_skotte"] = 29 Sid 25 av 57

# Skriver ut False eftersom månaden "qui" inte finns med i uppslagslistan. # (Quintilis döptes om till juli för att ära Julius Caesar.) print month.has_key("qui") # Metoden keys() ger en lista med alla nycklar i uppslagslistan. # Utskriften blir (observera att en uppslagslista inte är ordnad): # ['mar', 'okt', 'aug', 'sep', 'apr', 'jun', 'feb_vanlig', # 'jul', 'jan', 'feb_skotte', 'nov', 'maj', 'dec'] names = month.keys() print names Slingor Det är så pass vanligt att man går igenom listor eller strängar från början till slut att det finns ett särskilt kommando för detta i Python, den så kallade for-satsen. Utskriften från följande program tanter = ["Brun", "Grön", "Gredelin"] for tant in tanter: print "Tant", tant blir Tant Brun Tant Grön Tant Gredelin For-satsen har alltså följande format for <index> in <lista>: <sats> där <index> är ett variabelnamn, <lista> en lista och <sats> en sats som kommer att utföras en gång för varje element i listan. I det första varvet av listan så kommer variabeln <index> att innehålla det första elementet i listan, i det andra varvet så innehåller den det andra elementet, och så vidare. For-kommandot kan också användas för att gå igenom de flesta ordnade typer, till exempel en sträng. Här är ett exempel där vi använder en for-sats för att kontrollera om tecknet W finns med i en sträng: alfabetet ="ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ" for bokstav in alfabetet: if bokstav == "W": print "Ja, W fanns med i alfabetet!" For-satsen är också mycket användbar om man vill gå igenom en lista av tal, sådana listor kan man nämligen snabbt och lätt skapa med hjälp av kommandot range(). Här är ett exempel: Sid 26 av 57

#Skriver ut: 1 2 3 4 5 6 7 8 9 for i in range(1, 10): print i, Man anger en range med hjälp av startvärde, slutvärde och uppräkning. Observera att startvärdet finns med i listan, slutvärdet är däremot en övre gräns som inte finns med i listan. Här är ett par exempel: a = range(100) # [0, 1, 2, 3,..., 99] b = range(0, 100, 5) # [0, 5, 10, 15,..., 95] Moduler Stora program delar man upp i mindre delar med bland annat funktioner. Funktionerna kan placeras i olika filer. En fil med en samling av funktioner kallas för modul. För att vi ska kunna använda en viss funktion från en viss modul måste vi importera tillhörande modul innan anropet av funktionen. Importeringen kan man göra med en enkel import-sats som vi förklarar nedan. Man kan ha stort nytta av modularisering i program. Med modularisering kan man återanvända kod vilket gör att man inte behöver lägga tid på och anstränga sig för att skriva en motsvarande kod som redan har skrivits. Dessutom blir stora program med flera tusen rader kod mer överskådliga om de delas upp på ett bra sätt i moduler. I denna kurs tar vi inte upp hur man modulariserar utan vi nöjer oss med att lära hur man anropar funktioner som finns i moduler. När man installerar Python medföljer en hel del moduler. För att använda en funktion som finns i en modul måste man importera modulen. Detta gör man med hjälp av reserverade orden from, import och modulnamnet. Information om vilka moduler som följer med och vilka funktioner finns i varje modul kan man hitta på http://docs.python.org/lib/lib.html. Anta att vi behöver beräkna roten ur 23 i ett program. Vi har från http://docs.python.org/lib/lib.html fått informationen att i modulen math finns en funktion som heter sqrt(x) som beräknar roten ur x och returnerar svaret. För att använda funktionen ska man importera modulen genom att skriva följande sats: from math import * Först nu efter importeringen kan vi anropa funktionen sqrt enligt nedan: sqrt(23) Observera att import-satsen behöver endast vara med en enda gång för att man ska kunna anropa en funktion flera gånger i ett program. Ett bra ställe för import-satser är därför i början av programmet. Vad betyder modularisering? 1. Dela upp ett program i fristående delar. 2. Slå ihop två program till ett. Sid 27 av 57

3. Slå ihop flera program till två. 4. Slå ihop tre program till ett. Vad är modularisering bra för? 1. För att man ska kunna återanvända kod. 2. För att man kommer att höja prestanda hos programmet. 3. För att man ska få ett mer överskådligt program. 4. Är ett sätt att gömma undan kod så att andra inte ska kunna förstå programmet. Random Ett exempel på en modul som man kan importera är random som förser programmeraren med slumptal. Ibland vill vi att ett program ska vara oförutsägbart. Dvs det ska inte gå att förutse vad som kommer att hända i nästa stund av programmet. Detta beteende är väldigt vanlig i t ex spel där spelet byter strategier eller beter sig olika vid olika tillfällen. T ex ett äventyrsspel där det plötsligt kan dyka upp ett monster. Detta kan man åstadkomma med hjälp av slumpfunktionen random() som finns i modulen random. En modul är en samling med funktioner och annat som kan vara till användning i många program och är ett sätt att organisera funktioner. För att kunna använda funktionen random() måste man ha importerat modulen random i programmet, detta gör man med den enkla import-satsen: from random import * Efter denna sats kan man anropa funktionen random() som genererar ett slumptal (decimal) från och med 0 till 1. Till exempel: from random import * s_tal = random() s_tal kommer då att ha ett värde som är mindre än 1 och större eller lika med 0. Om man vill generera heltal så kan man använda funktionen randrange() som också finns i modulen random. h_tal=randrange(1,3) Variabeln h_tal kommer att bli heltalet 1 eller heltalet 2. randrange(a,b) betyder att slumpa ett heltal, heltalet kommer att vara större eller lika med a och mindre än b. När skriver följande program texten "Det kommer att bli en solig sommar"? from random import * weather = random() if weather < 0.2 : print "Det kommer att bli en solig sommar" else: print "Det kommer att bli en regnig sommar" Sid 28 av 57

1. Alltid. 2. Endast när slumptalet som genererats av weather = random() är större än 0.2. 3. Endast om det inte regnar när man kör programmet. 4. Aldrig. 5. Endast när slumptalet som genererats av weather = random() är mindre än 0.2. Sid 29 av 57

4. Funktioner Vad har man funktioner till? Stora program är besvärligare att konstruera än små. Men man kan göra det enklare för sig genom att dela upp programmet i funktioner. En funktion är som ett litet delprogram i programmet. När man anordnar tävlingar med riktiga sniglar tar det mycket lång tid innan deltagarna kommer i mål. Vi ska istället skriva ett litet program som simulerar en tävling mellan två sniglar: --------------------------------------------------- VEM HAR DEN SNABBASTE SNIGELN? Här får din snigel tävla mot en vältränad racersnigel. Skriv in namnet på din snigel så sätter tävlingen igång! --------------------------------------------------- Vad heter din snigel? Ebba Klara...färdiga...gå! Ebba: - - - - - - - - - - - - - - - - - - - - - - - - - @ Racersnigeln: - -- - - - - - - - - - - - - - - - - - - @ Det här loppet tog en oväntad vändning, Ebba vann! Dela upp ett problem i funktioner För att programmet ska bli enklare att skriva bestämmer vi först vilka funktioner vi ska ha. Det är inte alls självklart hur programmet ska delas upp i funktioner; samma problem kan lösas på många olika sätt! Vi vill se till att varje funktion har ett enda uppdrag. Här är ett förslag på uppdelning: 1. Skriv ut informationsrutan och läs in namnet på snigeln 2. Simulera tävlingen och rita upp banorna 3. Skriv ut vem som vann Ettan och tvåan består av flera olika moment. Vi gör det ännu enklare för oss genom att dela upp i ännu mindre delar: 1. Skriv ut informationsrutan 2. Läs in namnet på en snigel 3. Simulera tävlingen 4. Rita upp en snigels bana 5. Skriv ut vem som vann Vi börjar med att skriva in dessa moment som kommentarer i filen snigel.py, för att vi ska hålla reda Sid 30 av 57

på vad som är kvar att göra. Då får vi också en kommentar för varje funktion, så att det syns vad som händer var. Fråga: Tänk om vi ville skriva ett program för stavningskontroll, i vilka funktioner skulle vi då dela upp det? Definiera en funktion Först kommer funktionshuvudet (första raden i funktionen). Exempel: def visainformation(): Funktionshuvudet består av fyra delar. Ordet def (talar om att en funktion ska definieras här) Funktionens namn, gärna ett verb som beskriver vad funktionen gör Ett par parenteser () Ett kolon Under funktionshuvudet kommer funktionskroppen, som helt enkelt är en följd av indenterade satser som funktionen ska utföra. Så här ser hela funktionen ut: # Skriver ut informationsrutan def visainformation(): print """ --------------------------------------------------- VEM HAR DEN SNABBASTE SNIGELN? Här får din snigel tävla mot en vältränad racersnigel. Skriv in namnet på din snigel så sätter tävlingen igång! ---------------------------------------------------""" (För att kunna skriva en sträng som sträcker sig över flera rader så startar och avslutar vi strängen med tre stycken "-tecken. Vanliga strängar, som börjar och slutar med enkelt citattecken, kan nämligen inte innehålla radbrytningar.) Lägg till koden ovan i din fil snigel.py och provkör. Men vad nu - programmet skriver inte ut något alls? Gå vidare till nästa avsnitt för att få reda på varför! Anropa en funktion Satserna i funktionskroppen utförs inte om inte funktionen anropas. Anropet ska stå längst ner i programmet, under funktionsdefinitionerna. Den delen av programmet kallar vi huvudprogrammet. Anropet består bara av funktionens namn följt av ett parentespar. Om du lägger till anropet sist i ditt program ska alltihop se ut så här: Sid 31 av 57

# Skriver ut informationsrutan def visainformation(): print """ --------------------------------------------------- VEM HAR DEN SNABBASTE SNIGELN? Här får din snigel tävla mot en vältränad racersnigel. Skriv in namnet på din snigel så sätter tävlingen igång! ---------------------------------------------------""" # Visa information om tävlingen visainformation() # Läs in namnet på en snigel # Simulera tävlingen # Rita upp en snigels bana # Skriv ut vem som vann Spara i filen snigel.py och provkör! Skicka utdata från en funktion (returvärden) Då ger vi oss på nästa funktion, som ska läsa in namnet på en snigel. Namnet på snigeln är utdata från funktionen. Den som kör programmet och knappar in namnet tycker förstås att det är indata, men ur funktionens synvinkel är det nåt som ska skickas ut. För att skicka ut ett värde ur funktionen skriver vi ordet return följt av den variabel vi vill skicka ut värdet på. Funktionen som läser in namnet kommer att se ut så här: def lasnamn(): namn = raw_input("vad heter din snigel? ") return namn När vi ska anropa funktionen måste vi ta hänsyn till att den returnerar ett värde. Därför skriver vi anropet i en tilldelningssats, med en variabel till vänster som får ta emot det returnerade värdet. Variabeln behöver inte ha samma namn som variabeln i return-satsen inuti funktionen. dinsnigelsnamn = lasnamn() När den här satsen utförs av Python kommer följande att hända. Först anropas funktionen lasnamn, som läser in namnet och returnerar det. Sen kommer det returnerade värdet att lagras i variabel dinsnigelsnamn. Vi lägger in den nya i filen snigel.py och provkör. # Skriver ut informationsrutan def visainformation(): Sid 32 av 57

print """ --------------------------------------------------- VEM HAR DEN SNABBASTE SNIGELN? Här får din snigel tävla mot en vältränad racersnigel. Skriv in namnet på din snigel så sätter tävlingen igång! ---------------------------------------------------""" # Läs in namnet på en snigel def lasnamn(): namn = raw_input("vad heter din snigel? ") return namn # Visa information om tävlingen visainformation() # Läs in namnet på en snigel dinsnigelsnamn = lasnamn() # Simulera tävlingen # Rita upp en snigels bana # Skriv ut vem som vann Men hur ska vi veta om det fungerade eller inte? Jo, vi lägger in en kontrollutskrift print "Din snigel heter alltså", dinsnigelsnamn allra sist i programmet. Kontrollutskrifter är ett enkelt sätt att se om programmet fungerar som det ska, och är till stor nytta när man försöker ta reda på varför programmet inte gör som det ska. Provkör igen. När programmet fungerar kan du ta bort kontrollutskriften! Det här är viktigt, så vi tar ett exempel till, den här gången med två returvärden. Nästa funktion ska simulera tävlingen, på det här viset: Sniglarna startar bägge på startstrecket, dvs vid 0 Vi skriver ut Klara...färdiga...gå Och startar själva tävlingen, som representeras av en while-slinga I varje varv i slingan låter vi sniglarna ta varsitt skutt av slumpmässig längd När någon av sniglarna (eller bägge) passerar mållinjen så avbryter vi Sist returnerar vi bägge sniglarnas slutpositioner def tavling(): snigelbana1 = 0 snigelbana2 = 0 print "Klara...färdiga...gå! \n" while snigelbana1 < DISTANS and snigelbana2 < DISTANS: snigelbana1 += random.randrange(5) snigelbana2 += random.randrange(5) return snigelbana1, snigelbana2 Sid 33 av 57

I return-satsen allra sist kan vi se att två värden returneras, åtskilda med kommatecken. Givetvis måste vi då också ta emot två värden i huvudprogrammet. Den distans (i centimeter) som sniglarna ska tillryggalägga representeras av konstanten DISTANS. En variabel som ska ha ett konstant värde under hela programmet brukar man skriva med stora bokstäver, VERSALER. Python bryr sig inte om det, men andra människor som läser programmet kan se vad man menar. Vi definierar DISTANS överst i huvudprogrammet, och frågar oss om den kommer att synas (vara tillgänglig) inuti funktionen? Lägg in den nya funktionen i snigel.py, enligt nedan. Glöm inte att lägga in kontrollutskrifter av snigelbana1 och snigelbana2 innan du provkör! import random # Skriver ut informationsrutan def visainformation(): print """ --------------------------------------------------- VEM HAR DEN SNABBASTE SNIGELN? Här får din snigel tävla mot en vältränad racersnigel. Skriv in namnet på din snigel så sätter tävlingen igång! ---------------------------------------------------""" # Läser in namnet på användarens snigel def lasnamn(): namn = raw_input("vad heter din snigel? ") return namn # Simulerar en tävling mellan två sniglar def tavling(): snigelbana1 = 0 snigelbana2 = 0 print "Klara...färdiga...gå! \n" while snigelbana1 < DISTANS and snigelbana2 < DISTANS: snigelbana1 += random.randrange(5) snigelbana2 += random.randrange(5) return snigelbana1, snigelbana2 DISTANS = 30 # Visa information om tävlingen visainformation() # Läs in namnet på en snigel dinsnigelsnamn = lasnamn() # Simulera tävlingen snigelbana1, snigelbana2 = tavling() Sid 34 av 57