från ab provexemplar huvudrutin...

320
Provexemplar från Huvudrutin AB 079-0770292 Huvudrutin AB Räkna med Python Jörgen Städje

Upload: others

Post on 06-Jun-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

Huvudrutin AB

Räkna med PythonJörgen Städje

Page 2: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

Tomsida

Page 3: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA MED PYTHON 1

Räkna med Python

Välkommen till Pythons underbara värld

Huvudrutin AB

Page 4: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA MED PYTHON 2

Jörgen Städje SM0FIX

Page 5: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA MED PYTHON 3

Kundkontakt:

Huvudrutin AB Lönngränd 4 193 35 Sigtuna

Produktinformation och kundstöd: http://huvudrutin.se

Författare: Jörgen Städje

Medhjälpare: Cecilia Widell

Utgåva 1.3 © 2018-2019 OHData AB Ansvarig utgivare: Oskar Holmlund Licensierad till Huvudrutin AB Detta verk är skyddat av upphovsrättslagen.

ISBN 978-91-639-8043-5

Page 6: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA MED PYTHON 4

Innehåll 1. Välkommen till Pythons underbara värld............6

1.1. Specifikation 7 1.2. Teckenförklaring 7

2. Introduktion .............................................................8 2.1. Hur är boken uppbyggd? 8 2.2. Därför valde vi Python till denna bok 8 2.3. Perspektiv på Python 9 2.4. Efter det här ska du kunna 10 2.5. Hjälp oss att bli bättre 10

3. Skapa din programmeringsmiljö.........................11 3.1. Terminalvyn – en dialog med Python 12 3.2. Programredigeraren 15 3.3. Variabelvyn 19 3.4. Menyraden 20

Del 1 .............................................................................21 4. Programmeringens metodik.................................22

4.1. Bakverk som program 22 4.2. Flödesschemat 23 4.3. Kakrecept som flödesschema 25 4.4. Kommentarer 26 4.5. Praxis i denna bok 26 4.6. Undvik spaghetti 27

5. Räkna som vanligt i Python .................................28 5.1. Vanliga operatorer 28 5.2. Inte lika vanliga operatorer 29 5.3. Utskrifter 31

6. Variabler .................................................................34 6.1. Så skapas variabler i Python 34 6.2. Variabeltyper 38 6.3. Till höger om likhetstecknet 41 6.4. Stöd och hjälp 47

7. In- och utmatning av textsträngar ......................48 7.1. Strängar och strängvariabler 48 7.2. Strängformatering 50 7.3. Utskrift i detalj 53 7.4. Styrtecken 55 7.5. Inmatning 57 7.6. Stöd och hjälp 60

8. Frågesatser .............................................................61 8.1. Frågesatsens uppbyggnad 62 8.2. Block 64 8.3. Flöde i en enkel frågesats 65 8.4. Ett större block 68 8.5. Frågesatsen else 69 8.6. Frågesatsen elif 70 8.7. Kombinationen if-elif-else 71 8.8. Multipla if-elif-else 73 8.9. Frågesatser och strängar 75 8.10. IX Logiska operatorer 77 8.11. Logiska fel i frågesatser 80 8.12. Stöd och hjälp 81

9. Listor .......................................................................82 9.1. Listans uppbyggnad 82 9.2. Lägga till och ta bort poster 84 9.3. Delmängd av lista 86 9.4. Hela listan 87 9.5. Gör en lista av en sträng 88 9.6. Numerisk lista 89 9.7. Statiska listor – tupler 91 9.8. Listor av listor 92 9.9. HFJXF RÅFWJ SQZWN LYAU 92 9.10. Stöd och hjälp 94

10. While-slingor.........................................................95 10.1. While-slingans uppbyggnad 95 10.2. Enkel while-slinga 96 10.3. Oändliga slingor 96 10.4. Continue och break 97 10.5. Slinga med lista 100 10.6. Kapslade while-slingor 102 10.7. Stöd och hjälp 104

11. Dictionaries ........................................................105 11.1. Dictionaryts uppbyggnad 105 11.2. Enkla dictionaries 105 11.3. Olika sätt att modifiera ett dictionary 107 11.4. Dictionary som lista 108 11.5. Stöd och hjälp 110

12. For-slingor ..........................................................111

12.1. For-slingans uppbyggnad 111 12.2. Enkel for-slinga 111 12.3. Skapa en lista med range 112 12.4. Kapslade slingor 115 12.5. Slingor med dictionaries 118 12.6. Undersök slumptal med slinga 119 12.7. Stöd och hjälp 121

13. Funktioner ..........................................................122 13.1. Funktionens uppbyggnad 122 13.2. Funktion med inparametrar 125 13.3. Funktion med returparametrar 127 13.4. Funktionsanrop inifrån en funktion 129 13.5. Standardvärden för parametrar 130 13.6. Moduler 131 13.7. Att smita ur en funktion för tidigt 134 13.8. Godtyckligt antal inparametrar 135 13.9. IX Rekursion 135 13.10. Stöd och hjälp 138

14. IX Matplotlib – grafik ........................................139 14.1. Diagramritning 139 14.2. Stapeldiagram 147 14.3. Cirkeldiagram 152 14.4. Kurvor av matematiska funktioner 156 14.5. Interaktiva diagramfönster 159 14.6. Stöd och hjälp 163

15. IX SymPy – symbolisk matematik....................164 15.1. Definiera symboler 164 15.2. Snygga utskrifter med Pretty Print 165 15.3. Konvertera textsträngar till ett symboliskt uttryck 165 15.4. Substitution 165 15.5. Förenkling 166 15.6. Lösning av ekvationer 167 15.7. Derivata och integraler 168 15.8. Gränsvärden 169 15.9. Plotta funktioner 171 15.10. Plotta i tre dimensioner 173 15.11. Stöd och hjälp 173

16. IX Läsa CSV-filer................................................174 16.1. CSV-filer i praktiken 174 16.2. Inläsning av CSV-filer i Python 177 16.3. Övningar på CSV-filer 181

17. IX Arbeta med SQL-databaser .........................182 17.1. Introduktion till databaser 182 17.2. Praktiska exempel med SQLite3-tolken 184 17.3. Arbeta med SQLite i Python 190 17.4. Prova på ett fullständigt databasprogram 195 17.5. Blockschema 215 17.6. Lärdomar 216 17.7. Övningar på databasen 216 17.8. Stöd och hjälp 216

18. IX Klasser ............................................................217 18.1. Klassens uppbyggnad 217 18.2. Gömma data för världen 219 18.3. Metoden __init__() 220 18.4. Klasser inuti andra klasser 221 18.5. Klasser i praktiken 222 18.6. Övningar på klasser 227 18.7. Stöd och hjälp 227

19. Felsökning...........................................................228 19.1. Förklaring av enklare syntaktiska fel 228 19.2. Om indrag saknas 231 19.3. Oväntat indrag 232

Del 2 ...........................................................................233 20. Reella tal och deras egenskaper ......................234

20.1. De naturliga talen 234 20.2. Positionssystemet 236 20.3. Rationella och irrationella tal 237 20.4. Prioriteringsregler 239 20.5. Potenser 241 20.6. Rötter 247 20.7. Stöd och hjälp 248

21. Algebra ................................................................249 21.1. Formulera ett uttryck 249 21.2. Tilldela värden 250 21.3. Förenkla uttryck 251 21.4. Parentesmultiplikation med två parenteser 253 21.5. Parentesmultiplikation med negativa tal 255 21.6. Ekvationer 255

Page 7: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA MED PYTHON 5

21.7. Lösa ut variabler 256 21.8. Stöd och hjälp 257

22. Geometri..............................................................258 22.1. Enheter och prefix 258 22.2. Figurer i två dimensioner 260 22.3. Pythagoras sats 262 22.4. Objekt i tre dimensioner 263 22.5. Skala 265 22.6. Stöd och hjälp 266

23. Sannolikhet och statistik..................................267 23.1. Hur allting började 267 23.2. Läges- och spridningsmått 268 23.3. Normalfördelning eller gaussisk fördelning 270 23.4. Slumptal 271 23.5. Sannolikhet 272 23.6. Frekvenstabeller 274

24. Samband och förändring ..................................277 24.1. Procent 277 24.2. Förändringsfaktor 278 24.3. Samband 280 24.4. Ekvationssystem 283 24.5. Stöd och hjälp 284

25. Problemlösning ..................................................285 25.1. Algoritmer 285

26. IX Paraduppgifter ..............................................287 26.1. Morsesändare 287 26.2. Marsraket 289 26.3. II Mandelbrots mängd 292

27. Terminologi för din egen skull.........................294 28. Installation av Thonny med tillbehör .............297

28.1. Bygg lämplig katalogstruktur 297 28.2. Installation av Thonny i Unix-liknande system 297 28.3. Installation av Thonny i Mac OSX 298 28.4. Installation av Thonny i Windows 299 28.5. Installation av tillbehör 300

29. Andra utvecklingsmiljöer än Thonny .............302 29.1. Repl.it 303 29.2. Eclipse Che 303 29.3. Cloud9 304 29.4. IDLE 304 29.5. Din hjälp uppskattas 304

30. Versionshantering .............................................305 30.1. Så går det till normalt – oflexibelt 305 30.2. Med versionshantering – flexibelt 305 30.3. Så fungerar systemet 306 30.4. Gör en ändring och publicera den 306 30.5. Se ändringar 306 30.6. Installera ett system 306 30.7. Spara filen med innehåll i katalogstrukturen 307 30.8. Om du valt Git 308 30.9. Filformat 311 30.10. Säkerhetskopiering 311

31. Lathund till Thonny 3.1 ....................................312 31.1. Thonnys menysystem 312

32. Bilagor .................................................................316 32.1. Läs mer på Wikipedia 316 32.2. Om Huvudrutin AB 316 32.3. Om Python 316 32.4. Om Thonny 316 32.5. Om versionshantering 316 32.6. Om SQL och databaser 316 32.7. Om Internet 316 32.8. Om IT-hot 317 32.9. Bildförteckning 317

Page 8: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VÄLKOMMEN TILL PYTHONS UNDERBARA VÄRLD

RÄKNA MED PYTHON 6

1. Välkommen till Pythons underbara värld

Välkommen till förlaget Huvudrutins kurs i pythonprogrammering. Förhoppningsvis kommer du att tycka om att själv kunna skriva program och få datorerna att lyda din minsta vink.

Det här är inte en matematikbok, för sådana finns det redan så många av. Mate-matikens grunder förutsätts du ha skaffat dig på annat sätt. I denna bok repeteras bara vissa av grunderna för att visa på samban-den. Programmering är inte nödvändigtvis

matematik, men det kan vara. Matematiska problem behöver inte lösas med programme-ring, men det kan vara nyttigt eller i vissa fall enklare.

Just nu trycker du bara på en knapp i ett kalkylprogram, så fungerar det. När du har läst, gjort och förstått boken kan du själv skriva program och få dem att göra just det du vill, som att lösa matematiska problem, sammanställa statistik eller rita diagram. Du kommer att få lära dig:

Hur du programmerar Hur ett program kan fås att lösa repetitiva uppgifter Hur ett program kan fås att visa grafik Hur du avlusar dina program Hur ett program kan byggas ut med fler och nya funktioner

Boken kommer att visa att ämnet inte alls är för svårt, utan övar din förmåga att tänka logiskt, ta till dig kunskaper och arbeta metodiskt.

Denna bok följer Skolverkets styrdokument för matematikämnet från 2017-07-01.

Om du vill fördjupa dina kunskaper kan du fortsätta med Huvudrutins Digitalslöjd, en bok om slöjd i en digital värld med digitala verktyg. Du får ägna dig åt verkliga elektroniska byggprojekt, som du kan experimentera med och bygga vidare på.

Givet i Saltsjö-Boo, 2019

Jörgen Städje

Page 9: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VÄLKOMMEN TILL PYTHONS UNDERBARA VÄRLD

RÄKNA MED PYTHON 7

1.1. Specifikation

Ämne: Programmering i matematikämnet

Filosofi: Enkel till medelsvår programmering på svenska

Årskurser: Från årskurs 7

Programmeringsspråk: Python version 3.6 eller senare

Utvecklingsmiljö Windows XP-10: Thonny Linux: Thonny BSD: Thonny Mac OS: Thonny Chromebook: Cloud 9, Eclipse Che På Internet: https://repl.it/

Skillnader mellan Thonny och andra miljöer nämns i kapitel 29.

Tillhörande programpaket Du hittar länkar till alla behövliga programpaket på huvudrutin.se

Facit Facit till övningsuppgifterna finns under fliken Räkna med Python på huvudrutin.se

1.2. Teckenförklaring

I boken används olika signaltecken för att beteckna arbetsuppgifter och svar.

betecknar en övning, alltså något som ska funderas på och lösas. betecknar en uppmaning till diskussion. betecknar svaret på en övning. Övningars svårighetsgrad: De övningar och uppgifter som har olika svårighetsgrad, har åsatts årskurssymboler. Uppgifterna med de gröna symbolerna VII VII IX är avsedda för motsvarande årskurser i grundskolan, medan uppgifterna med de blå symbolerna I II III IV är avsedda för gymnasieskolan.

Tecknet !! anger att du själv ska mata in text i terminalvyn.

Page 10: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

INTRODUKTION TILL KURSEN

RÄKNA MED PYTHON 8

2. Introduktion

2.1. Hur är boken uppbyggd?

Boken är uppbyggd så att grundläggande kunskaper i programmering finns samlade i Del 1 och uppgifter kring det centrala innehållet i matematikkursen finns i Del 2.

Undervisningen bör läggas upp så att de alla grundläggande programmeringskunskaperna i Del 1 behandlas först. När de olika momenten i matematikkursen inträffar under läsåret finns uppgifter och övningar i Del 2.

Vissa övningar i del 2 är baserade på verkliga situationer. Övningarna finns i alla svårig-hetsgrader, från det allra enklaste till sådant som passar elever som söker utmaningar.

Boken visar hur utvecklingsmiljön Thonny används för att ge enkel åtkomst till Python. Thonny är ett pedagogiskt program som kraftigt underlättar inlärning och förståelse för programmering.

2.2. Därför valde vi Python till denna bok

Python valdes för att det är ett språk som används ”på riktigt” i professionella tillämp-ningar och det är lämpligt att du lär dig ett språk med stor genomslagskraft som du kan använda i framtiden. Några av de största organisationerna som använder Python är till exempel Wikipedia, Google, Yahoo, CERN och NASA.

Python finns inbyggt i många produkter, som videoredigeringsprogram, CAD-program, animeringsprogram, ritprogram och olika program för musikkomposition.

Andra språk har andra användningsområden. Ericssons språk Erlang skapades först och främst för programmering av telefonväxlar. ADA används främst av militär och flygindu-stri för programmering av flygplan, robotar osv. Ska man ha tidskritiska program, som i switchaggregat, rymdfarkoster och liknande är det assembler eller C som gäller.

Page 11: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

INTRODUKTION TILL KURSEN

RÄKNA MED PYTHON 9

2.3. Perspektiv på Python

Du kanske trodde att programmering var ett modernt påfund? Så är det inte. Istället har 200 år av kontinuerlig utveckling fört oss till det stadium vi befinner oss i idag.

Både metoderna att programmera och själva pogramspråken har utvecklats ordentligt bara de senaste 20-30 åren. Framför allt är det metoder för att få säkra, väl fungerande och väl dokumenterade program som förbättrats. Programmering är inte längre ett ex-pertämne för män i vita rockar, utan har flyttat in i grundskolan.

Python började som ett hobbyprojekt omkring år 1990 för programmeraren Guido van Rossum, ef-tersom han ville ha en bättre efterföljare till språket ABC som han arbetat med tidigare. Språket döptes efter BBCs TV-serie Monty Pythons flygande cirkus.

Page 12: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

INTRODUKTION TILL KURSEN

RÄKNA MED PYTHON 10

Nästa bild visar hur språket har utvecklats under åren, från rena experiment till stabila utgåvor med ständigt nya egenskaper. Utvecklingen är ingalunda slut, utan kommer att fortsätta med nya fiffigheter under många år framöver.

Pythons tidslinje med hela utvecklingsarbetet och alla utgåvor

2.4. Efter det här ska du kunna

När du är klar med boken ska du självständigt kunna skriva program i språket Python. Du ska också kunna dokumentera och avlusa (rätta) ett program och kunna använda ett system för versionshantering.

Om kunskapskraven för betyg A skriver Skolverket ”eleven för välutvecklade och väl un-derbyggda resonemang om tillvägagångssätt och om resultatens rimlighet i förhållande till problemsituationen samt kan ge förslag på alternativa tillvägagångssätt” vilket är ett krångligt sätt att skriva att du måste förstå vad du håller på med. Det är kanske inte så konstigt?

2.5. Hjälp oss att bli bättre

Hjälp oss! Vi vill att denna bok ska utvecklas för att kunna möta dina behov. Har du idéer eller anmärkningar är författaren glad att få reda på det, så de kan komma med i de årliga uppdateringarna som du kommer att få tillgång till.

Skulle du ha förslag, eller om något är oklart kan du kontakta kundstödet på [email protected]. Vi uppskattar dina synpunkter.

Page 13: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 11

3. Skapa din programmeringsmiljö

Thonny är ett program som används till inmatning av programsatser i Python. Program-satser som sparas i en fil, kallas källkod. Thonny är speciellt bra i pedagogiska samman-hang då man till skillnad från andra utvecklingsmiljöer kan stega sig genom programsat-serna och få visuell återkoppling vid varje steg. Den ger utmärkt hjälp vid felsökning.

Thonny utvecklades av Aivar Annamaa vid Datavetenskapliga institutionen vid Universi-tetet i Tartu i Estland, med hjälp från olika personer runt om i världen. Python version 3 är inbyggd, så för att börja lära dig programmering behöver du bara installera systemet och köra igång.

I fortsättningen är det meningen att du ska följa med i texten och göra alla räkneuppgifter med utvecklingsmiljön Thonny igång och se till att du får samma svar som i texten. In-struktioner om hur du installerar Thonny finns i kapitel 28.

Vid normalt arbete har Thonny fem vyer, som används i en bestämd ordning. Program-met kan konfigureras med fler eller färre vyer.

Thonny är specifikt skapad för att lära sig programmering. När du lärt dig hur du ska göra, kan du använda vilken programmeringsmiljö som helst, som till exempel Eclipse CHE, Repl.it, Qt Creator osv. De flesta miljöerna fungerar på liknande sätt, även om det finns undantag.

Page 14: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 12

3.1. Terminalvyn – en dialog med Python

Python är ett språk som läser instruktioner ungefär som du själv gör. Tänk dig att du föl-jer ett kakrecept för att komma fram till ett resultat. Du tar rad för rad och till sist blir det goda kakor. På samma sätt tar Python dina programsatser i den ordning du skrivit dem och gör precis det du skrivit. Av den anledningen måste instruktionerna i dina pro-gramsatser, precis som i kakreceptet, vara i rätt ordning.

Python är en tolk som kan läsa klartext och göra beräkningar eller utföra uppgifter. Pythontolken förstår att 2 * 3 betyder att datorn ska multiplicera 2 med 3 och efter att du tryckt på Enter kommer resultatet 6 att skrivas ut på skärmen.

När du kommunicerar med tolken arbetar du i Terminalvyn. Prompten >>> (klarteck-net) som anger att Python är redo för ett kommando, finns alltid i terminalvyn. Där kan du alltid ge ett kommando. Skulle prompten inte finnas där, håller datorn förmodligen på med något som tar lite tid.

Tar programmet för lång tid och behöver stoppas, görs det med ett klick på stoppsymbo-len, längst till höger på ikonraden.

Då återkommer prompten.

I denna bok används en standard, så att:

>>> print ("prov")

anger att du arbetar mot tolken i terminalvyn, medan

print ("prov")

anger att det rör sig om en sats inmatad i programredigeraren, det övre fönstret på skär-men. Se sida 15.

Överfört i praktiska kommandon till datorn går det till på följande sätt att använda ter-minalvyn. Börja med att starta miljön Thonny. Klicka på Thonnys Th-ikon på skrivbor-det. Miljön startar, men den är helt tom.

Page 15: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 13

Terminalvyn där tolken finns är fönstret längst ned i mitten. Använd den genom att sätta markören där. Att ha en dialog med tolken är ett samspel mellan dig och tolken. Du skri-ver en programsats, tolken ger ett svar och ber om nästa sats.

Page 16: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 14

Så här går arbetet till. Python ber om ett kommando, en fråga, en sats, du ger ett komman-

do, Python svarar och ber om nästa kommando.

Skriv en programsats, exempelvis 2*3 och tryck Enter.

Terminalvyn kommer att mata ut svaret, som ju bör bli 6. Har du av misstag skrivit något annat, som 2%!&3, kommer terminalvyn istället att mata ut ett eller flera felmeddelan-den. Rätta felet genom att skriva en ny programsats och stava rätt den här gången.

Bilden nedan visar hur det kan se ut i praktiken i Thonny. Programmeraren har blivit lite modigare och ber pythontolken om två saker:

Skriv ut texten ”Vad blir 2 * 3?”. Det sker med satsen !!

>>> print ("Vad blir 2 * 3?")

I nästa steg ber man Python att faktiskt utföra beräkningen 2 gånger 3 med satsen !!

>>> 2*3

Page 17: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 15

Den första satsen innebär inte alls att Python räknar ut vad 2 gånger 3 är. Den bara skri-ver ut den begärda texten ”Vad blir 2 * 3?”. I det här fallet händer ingenting, men du kan ta det som exempel på hur man får datorn att skriva ut text. Datorn gör ingenting själv, utan bara det du har begärt. Det är precis som kakreceptet. Står det ”Sätt ugnen på 175 grader” så gör du bara det. Du öppnar inte ugnsluckan, du ställer inte in någon bakplåt eller liknande.

Andra satsen utför den faktiska beräkningen och lämnar korrekt svar.

Fördelen med att ha en dialog med pythontolken är att du får svar direkt efter varje sats och kan se att du får den effekt du vill i dina kommandon. Men när du avslutar din dialog med tolken så har du förlorat det du matade in. Det kan vara ett problem.

Terminalvyn visar hur det går att köra programmet, om det blir fel, eller om det blir rätt. Kom ihåg att:

Satserna du skriver i terminalvyn försvinner. De kan inte sparas.

3.1.1. Arbeta med piltangenterna Efter en tids arbete i terminalvyn har du skrivit ett antal rader och tryckt <Enter> och raderna har körts. Den här gången blev det fel. Du ser felet och skulle vilja ha tillbaka förra raden för att rätta felet och återanvända raden.

Tryck pil-upp så hämtas förra raden och du kan flytta mar-kören, ändra och återanvända den. Du kan trycka pil-upp och bläddra hur många rader som helst och återanvända. Det sparar massor med tid.

3.1.2. Töm terminalvyn (shell) Ibland kan det hända att terminalvyn blir full av utskrifter och det kan bli lite rörigt. Om du vill ha en ren och snygg terminalvy, kan du tömma vyn genom att välja menyalternati-vet Edit > Clear shell eller högerklicka i terminalvyn och välja Clear. Men då försvin-ner alla satser du skrivit och du kan inte backa tillbaka med piltangenterna.

3.2. Programredigeraren

Oavsett om du väljer att börja ett helt nytt projekt, eller arbeta vidare på ett befintligt, arbetar du i programredigeraren som är den centrala arbetsvyn. Programredigeraren används för att skapa och redigera filer. Den är en helt valig textbehandlare, där du kan skriva text, sudda, kopiera och klistra in, som i vilken annan textbehandlare som helst.

Program som du vill spara måste skrivas i programredigeraren.

Börja med att aktivera radnumreringen genom att välja Tools > Options och kryssa i rutan Show line numbers. Det blir behändigt senare , inte minst för att alla felmedde-landen pekar ut radnummer.

Programredigeraren har ett par specialegenskaper. Thonny är vänlig nog att markera alla reserverade ord, som def, if och else med lila text för att det ska vara lättare att förstå. Textsträngar, som ”Rätt svar” alltså texter som inte kan köras utan bara skrivas ut som de är, visas i grönt för att det ska framgå utom allt tvivel att de är just textsträngar.

Page 18: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 16

Parenteser är viktiga i programmering. När markören står invid en parentes i programmet blir parentesen blåmarke-rad för att tolken markerar alla passande parentespar i blått när man närmar sig den ena parentesen, så att det ska

vara lätt att kontrollera om man glömt en parentes. Du kommer att få uppleva många situationer där en högerparentes saknar vänsterparentes och vice versa.

Mata in följande programsats, som du känner igen från avsnittet ovan om en dialog med Python.

# mitt_första_program.py print ("Vad blir 2 * 3?") print (2 * 3)

När Thonny känner igen att du håller på att skriva ett ord (som en variabel, ett funk-tionsnamn, eller ett reserverat ord) kan den hjälpa till genom att presentera en snabblista med tänkbara ord som börjar på samma bokstav, som du kan vilja använda.

Snabblistan kommer fram efter en stund när du börjat skriva. I bilden visas alla tänkbara verb som börjar med bokstaven p. Använd piltangenterna på tangentbordet för att välja i listan och tryck <Enter>, istället för att behöva skriva själv och riskera att stava fel. Skulle listan försvinna för att du klickar någonstans, kan du alltid kalla fram den med Ctrl+<mellanslag>.

När du är klar har programmet ännu inte fått något namn, utan heter fortfarande <untit-led>. Spara satserna genom att välja File > Save och ange filnamnet mitt_första_program.py. Använd alltid tillägget .py efter filnamnet för att visa för dig själv att filen innehåller pythonsatser.

3.2.1. Spara

När du blivit van kan du istället trycka Ctrl-S.

Page 19: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 17

Dialogrutan Spara som öppnas. Anledningen till att det blev Spara som istället för att filen bara sparades, är att den inte fått något namn ännu. Du måste döpa den och det sker i dialogrutan Spara som. Observera att Spara-rutan kan se olika ut i olika operativsy-stem.

Se till att den övrsta listrutan visar rätt sökväg, så programmet sparas på rätt ställe på hårddisken. Ge därefter filen ett beskrivande filnamn i rutan Filnamn. Namnet var som sagt mitt_första_program.py. Klicka på knappen Spara.

Fliken som förut hette <untitled> heter numera ”mitt_första_program.py”.

Den översta listrutan i dialogrutan visar mappar. I ditt system kan mapparna heta något annat, som katalog eller folder. I vilket fall som helst pekar sökvägen (path) i listrutan ut platsen på din hårddisk där du kommer att spara filen. Välj en mapp och spara alltid dina python-program där. Det är viktigt att du har ordning på din hårddisk och inte bara spa-rar filerna lite var som helst, för då kommer varken du eller programmen att hitta dem senare.

3.2.2. Filträdet Filträdet är en representation av de filer som finns på din hårddisk eller hemkatalogen för din användare på nätverket.

Det är därifrån du väljer och hämtar befintliga filer. Det går att använda menyalternativet File > Open också, men det är snabbare och bekvämare att välja den grafiska översikten.

Syns inte filträdet på din skärm, väljer du alternati-vet View > Files.

Leta fram filen du nyss sparade, mitt_första_program.py i filträdet. Den bör lämp-ligen fnnas i den mapp du gjort till arbetsmapp.

Page 20: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 18

3.2.3. Så används Thonny praktiskt Systemet används alltid på samma sätt, nämligen till att skriva program, avlusa dem och till sist göra en lyckad körning. Så här går utvecklingsprocessen till.

Page 21: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 19

3.2.4. Körning Det är dags att köra ditt första program. Om du har stavat allting rätt kommer det att fungera och ge en utskrift i terminalvyn. Välj menyalternativet Run > Run current script för att starta körningen.

Alternativt kan du använda den gröna körikonen, eller trycka F5 på tangentbordet.

Så här bör resultatet se ut.

3.3. Variabelvyn

En variabel är en behållare där programmet kan spara ett värde och arbeta med det i se-nare programsatser.

Variabelvyn visar en sammanställning av alla variabler som används i programmet. Att kunna se variablernas värden i varje stund är ovärderligt vid felsökning, för att kunna förstå vad som håller på att hända med exempelvis en variabel som plötsligt får fel värde. Det traditionella sättet att hålla reda på detta är att lägga in felsökningsutskrifter på lämpliga ställen i programmet och skriva ut variablerna. Det är en klumpig och tidsödan-de metod som inte kan rekommenderas generellt.

Visa variabelvyn genom att välja menyalternativet View > Variables.

Page 22: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SKAPA DIN PROGRAMMERINGSMILJÖ

RÄKNA MED PYTHON 20

Mata därefter in följande programsats i terminalvyn !!

summa = 2 * 3

Betrakta nu variabelfönstret. Du ser att variabeln summa visas med rätt värde.

Mera om variabler hittar du på sidan 34.

Kanske du har fel i programmet så att det inte kan köras? Beskrivning av enklare fel finns på sidan 228.

3.4. Menyraden

Som alla program har Thonny en menyrad där du kan styra programmets uppförande helt och hållet, starta nya projekt, stänga gamla, avlusa, flytta runt vyerna och avsluta pro-grammet.

Strax under menyraden hittar du en rad ikoner för de vanligaste funktionerna, som att starta ett nytt projekt, spara, köra och avlusa. De tre orange, lite ”trasiga” pil-ikonerna har med avlusning att göra, men kan inte användas förrän du har Thonny i avlusningslä-ge. Till sist finns den röda stopp-ikonen som används för att få stopp på skenande pro-gram.

De flesta menyalternativ har även tangentbordsgenvägar som är mycket snabbare att an-vända än att leta i menyer. Ett nytt projekt påbörjas med Ctrl-N, spara är Ctrl-S, kör är F5 och avlusning görs med Ctrl-F5. I avlusningsläget finns ytterligare snabbkommandon, främst F7 som används för att fortsätta avlusningen på nästa programrad.

Fullständig information om hela menysystemet finns på sidan 312.

Page 23: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA MED PYTHON 21

Del 1 Introduktion till programmering

Page 24: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROGRAMMERINGENS METODIK

RÄKNA MED PYTHON 22

4. Programmeringens metodik

Hur bör du tänka när du programmerar? Vad innebär programmering?

Datorns processor har ett antal byggstenar tillgängliga, som exempelvis addition och sub-traktion. Om datorn inte instrueras att utföra något, gör den ingenting. Det är här pro-grammeraren kommer in. Med hjälp av dessa byggstenar kan programmeraren få datorn att lösa alla sorters problem.

En programmerare bygger större händelseförlopp med hjälp av många mindre, logiska byggstenar. Anledningen till att man använder sig av små byggstenar är att de är lätta att förstå var för sig. När alla små händelseförlopp är klara, sätter programmeraren samman dem till ett större flöde.

När du blir mera van kommer du att kunna hantera stora system. Genom att bygga upp dem av små byggstenar, förblir de lätta att förstå.

4.1. Bakverk som program

Du har bjudit hem gäster på kladdkaka och te och nu ska du snabbt vispa ihop en kaka. Det är väl bara att blanda? Du hittar ett recept i kokboken.

Kladdkaka

3 dl strösocker 2 ägg 100 smält smör 1,5 dl vetemjöl 4 msk kakao 1,5 tsk vaniljsocker 1 krm salt

Sätt ugnen på 160°C. Rör ihop allt. Häll det i en smörad form med ströbröd. Grädda i 30 minuter i den nedre delen av ugnen. Låt svalna. Servera med vis-pad grädde.

Page 25: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROGRAMMERINGENS METODIK

RÄKNA MED PYTHON 23

Det verkar ju enkelt, men hur går det till i detalj? För en kakbagare är det mest rutin, men en programmerare måste fundera väldigt noga på vartenda litet steg, för datorn kan inte fundera åt dig. Datorn gör bara det du säger åt den.

Se kakreceptet som ett program som är avsett att följas till punkt och pricka. Du måste samla ihop ingredienserna, se efter att de inte har möglat, hitta något att blanda dem i, bröa en form och så vidare.

Eller nästan till punkt och pricka, för människan har en del inbyggd logik i form av för-värvade kunskaper som används för att modifiera arbetsgången. ”Rör ihop allt” duger inte riktigt som detaljbeskrivning. Blandningsföljden är viktig.

Överfört till programmering kallas det för programmets flöde. Börja med att blanda alla våta ingredienser för att få något vått att blanda det torra i efteråt. Det blir svårare att blanda om du gör tvärt om.

På samma sätt är det med program. Du tänker ut, beskriver och formaliserar alla åtgärder du vill att datorn ska utföra och skriver ned dem på ett standardiserat sätt, som kan för-stås av både människor och maskiner – ett programspråk. Som med alla språk finns bara ett visst antal ord och de måste användas på rätt sätt och i rätt ordning – syntax.

Skulle du få frågan ”Kaka äta du min vill” skulle du ha svårt att förstå. Du skulle tala om för den som frågar att du inte begriper och när denne rättat syntaxen till ”Vill du äta min kaka” går det bättre.

Men det underlättar om du använder ett hjälpmedel för att översiktligt visa hur du tänkt – ett flödesschema. Det kan göra det lättare för dig själv och andra att förstå tankegång-en. Allting handlar om att vara klar och tydlig.

4.2. Flödesschemat

Körningen av ett program kan beskrivas som ett flöde, en riktning. Ett sådant flöde kan visas i form av ett stiliserat, standardiserat diagram som beskriver hur byggstenarna sit-ter ihop med varandra. Vänj dig vid att alltid beskriva dina program med flödesscheman.

Hur detaljerat du ritar flödesschemat beror på vem som ska läsa det. En annan program-merare, eller läraren behöver få se alla detaljer, medan någon som bara vill ha en översikt-lig förståelse kan nöja sig med ett grövre blockschema.

Schemat ritas med olika typer av standardsymboler för bearbetning, hämtning av indata, visning, utdata, valsituationer, start och slut och olika pilar.

Startruta. Flödesscheman börjar alltid med en startruta som ska in-nehålla ordet Start, eller programmets eller funktionens namn. Start-rutan ska ha rundade hörn.

Pilar och linjer. Flödet visas med en linje. Den normala riktningen i flödet är nedåt och åt höger, precis som när man läser text. Skulle du behöva visa ett flöde som går uppåt eller åt vänster, måste linjen ha en pilspets.

Bearbetning. Alla typer av bearbetning symboliseras med en rektang-el som innehåller en kort text som beskriver bearbetningen.

Page 26: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROGRAMMERINGENS METODIK

RÄKNA MED PYTHON 24

Anrop av en funktion eller subrutin. Symbolen visar att en funktion som definieras någon annan stans, anropas härifrån. Symbolen an-vänds för att förenkla flödesschemat. Texten i rutan ska visa funktio-nens namn.

Frågesatser visas som romber, där flödet kommer in uppifrån och kan ta två eller flera vägar ut: nedåt, åt vänster eller höger. Som vanligt är standardriktningen nedåt och åt höger. Vid varje utgång ska utfallet av frågan visas, oftast ett Ja eller Nej. Alternativet Ja, eller ett i övrigt lyckat utfall bör fortsätta nedåt.

Utskrift. Vill du särskilt visa utskrift på papper, ser symbolen ut som ett avrivet pappersark med vågig nederkant.

Inmatning. Vill du särskilt visa inmatning från användaren ser sym-bolen ut som en rektangel med sned överkant, lite som ett tangentbord från sidan.

Datalagring. Operationen att spara data i minne eller på disk ser ut som en kaffeburk i perspektiv, med en pil mot burken (vid skrivning) eller mot den flödesschemasymbol (vid läsning) som beordrade läsning-en.

Slut. Flödet ska avslutas med en stoppruta som ska innehålla ordet Slut, Return, Break eller motsvarande. Stopprutan ska ha rundade hörn.

Page 27: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROGRAMMERINGENS METODIK

RÄKNA MED PYTHON 25

4.3. Kakrecept som flödesschema

Proceduren är ett tydligt flöde uppifrån och ned. Gör så här! Inte på något annat sätt!

Flödesschemat innehåller alla program-meringens element med exempelvis vän-teslingor som upprepas tills något villkor är uppfyllt, som att kakan har bakats fär-digt. Rutan Blanda alla ingredienser är ett funktionsanrop till en funkton som förklarar just detta.

Men schemat tar inte alls upp alla detal-jer, för då skulle det bli för långt. Bröa en form är ett anrop till en funktion som gör just detta. Hur det går till får du fun-dera ut längre fram.

Nu har du fått reda på hur du, eller kan-ske en dator skulle utföra receptet. I nästa kapitel blir det du som skriver själva receptet, eller kanske vi ska kalla det vid dess rätta namn: programmet.

4.3.1. Övningar Nu är det din tur att rita flödesschemor. Diskutera gärna med en kamrat.

a) Hoppsan! Schemat ovan beskriver inte hur man bröar en form. Rita själv ett schema för detta, som börjar med startsymbol, visar hur man gör en tuss av hushållspapper, gni-der den mot smör osv., tills man häller av det överflödiga ströbrödet.

b) På slutet finns instruktionen att provsamaka kakan. Blev den god? Om den inte blev det, vilka alternativ kan du själv tänka ut för den fortsatta hanteringen (kasta bort, igno-rera, hälla på glasyr)? Rita ett flödesschema för valsituationen?

d) Du glömde göra te. Gör ett flödesschema för hur man gör te. Ange särskilt hur du gör för att ta reda på om tepåsarna har dragit tillräckligt länge.

e) Du glömde vispa grädden också. Gör ett flödesschema som i detalj visar hur man vispar grädde och undersöker när man vispat färdigt. Du får inte vispa för mycket, för då blir det smör.

Page 28: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROGRAMMERINGENS METODIK

RÄKNA MED PYTHON 26

4.4. Kommentarer

Flödesschemat är en översiktlig beskrivning av ett program. När du ser programmets källkod är det inte alla gånger uppnebart hur det fungerar. Därför måste du sätta in kor-ta, detaljerade beskrivningar i källkoden som ska beskriva samma sak som i flödessche-mat.

Ett program utan kommentarer är inget program. Kommentarer är ovärderliga för att du själv och andra ska förstå hur programmet fungerar. Kanske inte omedelbart efter att det skrivits, men efter en vecka behöver du kunna förklara för dig själv hur du tänkte. För-klara varje rutin med en kommentar. Om du tänkt ut några särskilt snitsiga matematiska operationer bör du förklara både operationen och de variabler som ingår.

# Detta är en kommentar i Python

Kommentera på svenska, såvida inte läraren ber dig använda något annat språk. Om du inte tror att din kod kommer att återanvändas i ett annat land, finns det ingen anledning att skriva på engelska.

4.5. Praxis i denna bok

Praxisen i denna bok innebär att du:

Dokumenterar programmen med kommentarer där det anses vara lämpligt, så att var-je funktion får minst en kommentar som visar hur den fungerar, vad argumenten är till för och vad den eventuellt återlämnar (returnerar) för slutresultat.

Använder flödesscheman för att visa på det övergripande sammanhanget, visa på olika frågesatser och hur de styr om programflödet.

Använder tomrader för att dela programmet i olika skeden. Behövs det, bör ett skede inledas med en kommentar.

Det får till resultat att

Kvaliteten på slutresultatet blir högre.

Din dokumentation blir mera begriplig.

Dina program blir lättare att rätta och ändra.

Page 29: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROGRAMMERINGENS METODIK

RÄKNA MED PYTHON 27

4.6. Undvik spaghetti

Det finns tusen sätt att skriva ett program, som uppnår samma mål, men bara ett fåtal av dem är bra. Använder du den praxis som beskrivs ovan, kommer dina program att bli lätt-begripliga, överskådliga och rakt på sak.

Skriver du väldigt rörig kod, kan en erfaren programmerare börja prata om ”spaghetti-programmering”. Det kan verka smart just när du hittat på det, men det är förödande för förståelsen. Lösningen heter strukturerad programmering.

Page 30: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA SOM VANLIGT I Python

RÄKNA MED PYTHON 28

5. Räkna som vanligt i Python

Nu har det blivit dags att börja använda Python rent praktiskt. Låt oss mjukstarta med några kända räkneexempel för att du ska känna dig hemma.

5.1. Vanliga operatorer

Addition (+), subtraktion (–), multiplikation (*) och division (/) fungerar som vanligt i Python.

Operator Beskrivning Exempel Resultat + Addition 9 + 4 13 – Subtraktion 9 - 4 5 * Multiplikation 9 * 4 36 / Division 9 / 4 2.25

Det är frivilligt att slå ett mellanslag mellan siffrorna och operatorerna. Python bryr sig inte om vilket du gör, men det blir överskådligare om du skjuter in mellanslag.

5.1.1. Prova på a) Kalle har fyra cyklar och får tre av Lisa. Hur många cyklar har Kalle?

b) Lisa har sju cyklar och Kalle smyger sig in på natten och tar tre av dem. Hur många har Lisa då?

c) Lisa planterar sju tomatplantor. På varje planta växer det nio tomater. Hur många to-mater får Lisa?

d) Lisa ger Kalle hälften av tomaterna. Hur många tomater får Kalle?

5.1.2. Lösningsförslag a) !!

>>> 4 + 3 7

b) !!

>>> 7 - 3 4

c) !!

>>> 7 * 9 63

d) !!

>>> 63 / 2 31.5

Page 31: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA SOM VANLIGT I Python

RÄKNA MED PYTHON 29

5.1.3. Övningar på enkla beräkningar Gör följande beräkningar i terminalvyn.

a)

9+4 9–4 5*8 45/7 1.5+3.14*66.67 (32–16)/2

3*(5–15) 2/7*19**3 2*10 b) Lisa har fått en rabattkupong av den affär där hon handlar. Hennes varukorg är fylld med

0,8 kg sallad som kostar 20 kronor/kg 2 st tonfiskburkar som kostar 15 kronor/st 1 gurka som kostar 10 kronor 0,6 kg tomater som kostar 25 kronor/kg 1,15 kg vattenmelon för 24 kronor/kg

Hur mycket ska Lisa betala?

c) Myggforskningslabbet annonserar efter blodgivare. Varje mygga dricker 5 mikroliter blod per tillfälle. Enligt forskningsanläggningens föreskrifter får en anställd bara ge 4,5 deciliter blod. Hur många myggor kan sticka en anställd?

d) En sorkpopulation består av 300 individer när de tre stadskatterna flyttar in. Efter åtta veckor är bara de 20 mest erfarna sorkarna kvar. Hur många sorkar fångar de tre katter-na per dag?

5.2. Inte lika vanliga operatorer

Utöver operatorerna som återfinns i matematiken har de flesta programmeringsspråk ytterligare några som kan vara nyttiga.

Operator Beskrivning Exempel Resultat // Heltalsdivision 9 // 4 2 % Rest vid heltalsdivision 9 % 4 1 ** Potens 2 ** 3 8

5.2.1. Prova på a) Ett schackbräde är kvadratiskt och har åtta rutor längs en sida. Hur många rutor är det totalt?

b) Du har hittat en låda full med muttrar. Men hur många är det, på ett ungefär? Lådan är 10 x 10 x 10 centimeter och en mutter är 5 mm i diameter och 5 mm hög. Då går det 20 muttrar längs en sida. Hur många ryms det i hela volymen?

c) Tänk dig att du har 11 karameller och 4 barn. Hur många hela karameller får varje barn?

Page 32: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA SOM VANLIGT I Python

RÄKNA MED PYTHON 30

Det är svårt att dela karameller för att de är hårda och brukar gå sönder i småbitar som ändå inte kan fördelas jämnt mellan barnen. I detta fall är du intresserad av hur många hela karameller du kan dela ut till barnen utan att det blir orättvist.

d) Hur många hela karameller blir kvar till föräldern som delar ut godiset?

5.2.2. Lösningsförslag a) !!

>>> 8 ** 2 64

b) !!

>>> 20 ** 3 8000

c) 11 karameller / 4 barn = 2,75 karameller per barn. Men du vill ha hela karameller. Lösningen är att använda heltalsdivision, vilket i Python uttrycks med dubbla divisions-tecken !!:

>>> 11 / 4 2.75

>>> 11 // 4 2

d) Python har en inbyggd funktion för att beräkna resten. Den uttrycks med procentteck-en (%) !!:

>>> 11 % 4 3

Barnen får alltså 2 karameller var och föräldern får 3 karameller.

Page 33: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA SOM VANLIGT I Python

RÄKNA MED PYTHON 31

5.2.3. Övning – heltalsdivision a) Beräkna

2*3//2

2*(3//2)

19//4

b) Vid affärens superrea på melon kostar de 1,99 kronor/kg. Du köper 50 kg. Varje bär-kasse klarar av 6 kg. Hur många kassar behöver du ta och hur många meloner behöver du bära löst i handen om du vill vara miljövänlig och inte gå med halvtomma kassar. Vi antar att det är EU-anpassade meloner på exakt 1 kg.

5.2.4. Rest vid heltalsdivision a) Beräkna

2%2

2*(3%2)

b) Om du vill ha ett svar på en beräkning som hamnar mellan 0 och 10 så kan du använda moldulus-operationen. Prova att beräkna

1032345678%10

98786%10

123456789987654321%10

5.2.5. Potenser a) Beräkna

2**3

b) Prova att beräkna 2**0, 2**1, 2**2, 2**3, 2**4 och så vidare. Ser du något samband med till exempel storlekarna på dataminnen, USB-minnen, SD-kort och liknande?

5.3. Utskrifter

Du får programmet att skriva ut text på skärmen genom att använda funktionen print(). Funktioner utför tjänster åt programmet. Inbyggt i Python finns funktionen print som skriver ut texter i terminalvyn. Det finns många flera inbyggda funktioner som kommer att tas upp allt eftersom du får behov av dem.

När du skriver ut, fyller du parentesen med den text du vill ha utskriven. Du kan skriva ut texter och siffror genom att skriva dem separerade med komma, exempelvis !!

>>> print("Hej på världen") Hej på världen

>>> print('Hej på världen') Hej på världen

>>> print("Hej ", 'på ', ”världen”) Hej på världen

För att skriva ut texter, måste de omges av citationstecken, enkla eller dubbla.

Page 34: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA SOM VANLIGT I Python

RÄKNA MED PYTHON 32

5.3.1. Print-funktionens argument För att kunna använda en funkton måste du veta vilka argument du kan skicka till den.

Syntaxen beskriver alla möjligheter med kommandot på ett sätt som inte kan missförstås. Alla pythonfunktioner beskrivs på precis samma sätt i dokumentationen.

print(*objekt, sep=' ', end='\n', file=sys.stdout, flush=False)

Funktionsbeskrivningen visar obligatoriska och frivilliga argument. De obligatoriska de-larna skrivs med rak stil medan de frivilliga skrivs kursiverat. Dokumentationen brukar börja med en allmän beskrivning: Print skriver ut alla objekt till filen file. Objekten kan vid utskriften åtskiljas av sep och utskriften avslutas med end.

Obligatorisk del:

Det enda som är obligatoriskt är objekt. Objekt kan vara en listra av strängar, uttryck eller variabler. Listans delar ska åtskiljas av kommatecken. Ett absolut minimum är en tom lista i form av print(), vilket producerar en tomrad.

Frivilliga delar:

Separatorn sep= får användas och kommer då att skrivas ut mellan objekten. Då ska se-pratatortecknet anges inom enkla citationstecken och åtföljas av kommatecken.

Radslutstecknet end= får användas och åtföljas av kommatecken. Om det inte används, avslutas utskriften med \n som är nyrad.

Argumentet file är stället där texten ska matas ut och det är normalt bildskärmen.

Argumentet flush=False anger att utskriften hamnar i en buffert, som skrivs ut när operativsystemet får tid över. Det sker i normalfallet ändå på en gång. Använder du True kommer systemet att ge utskrifterna högre prioritet vilket gör resten av körningen lång-sammare.

5.3.2. Prova på a) Använd en printsats för att skriva ut texten ”5 myror är flera än 4 elefanter” där siff-rorna ska anges som tal, inte text. Använd både dubbla och enkla citationstecken.

b) Skapa en prinsats som skriver ut texten ”Tio gånger tjugo är 200” där talet 200 är en beräkning av 10*20.

5.3.3. Lösningsförlag a)

>>> print(5, "myror är flera än", 4, 'elefanter.') 5 myror är flera än 4 elefanter.

b)

>>> print("Tio gånger tjugo är", 10*20) Tio gånger tjugo är 200

Page 35: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

RÄKNA SOM VANLIGT I Python

RÄKNA MED PYTHON 33

5.3.4. Print Använd funktionen print och formge svaren från uppgift 5.1.3, så att utskrifterna ser ut ungefär som nedan. Talen är inte de riktiga, utan bara ett exempel.

Lisa ska betala 45 kronor En anställd kan bli stucken 600 000 000 gånger Varje katt fångar 300 sorkar per dag

5.3.5. Övning a) Använd prinstatsen och beräkna och visa 10-20.

Exempel på utskrift:

10-20 = –20

b) Använd prinstatsen och beräkna och visa 2**3.

Exempel på utskrift:

2**3 = 8

c) Lisa går och handlar. Hon har köpt 0,8 kg sallad som kostar 20 kronor/kg.

Hjälp kassörsen och skriv ut ett kvitto som visar priset på salladen. Printsatsen ska inne-hålla en multiplikation av kilopriset och inhandlad mängd.

Exempel på utskrift:

0,8 kg sallad à 20 kr/kg = 16,00 kr

Page 36: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 34

6. Variabler

Du förvarar antagligen olika saker i lådor och burkar, allt efter vad det är för sak. Det är bekvämt att ha saker i lådor, så man kan sätta en skylt på lådan och beskriva vad det är i den, som suddgummin, sytråd, kolvar eller vevstakar.

Våta saker, som sylt och honung, förvarar man lämpligen i en glasburk. Annars skulle de rinna ut. Torra saker, som tändstift, är bättre att ha i en papplåda som är mera tålig mot hårda saker.

Datorer gör på precis samma sätt och har olika sorters lådor och burkar för olika sorters data. Det är viktigt att använda rätt sorts låda. Det är precis lika ödesdigert för en pro-grammerare att förväxla text och siffror, som för en bilmekaniker att förväxla en vindru-tetorkare och en gaspedal. De passar helt enkelt inte i hålet och även om mekanikern bankade i dem, skulle de inte fungera efteråt.

Den grundläggande formen av data som Python kan lagra i sina behållare är olika former av tal, som heltal och decimaltal, logiska flaggor och text.

I Python kallas text för strängar, vilket behandlas närmare på sidan 47.

6.1. Så skapas variabler i Python

En variabel är en namngiven behållare med ett värde lagrat i behållaren, precis som Ban-dit Rock är namnet på radiostationen på frekvensen 106,7 MHz. Värdet kan ändras under programmets gång, precis som radiofrekvenser kan ändras med åren. Syntaxen, alltså de grammatiska reglerna för att skapa en variabel ser ut så här.

namn = värde

Variabeln måste heta något så man ger den ett beskrivande namn, till exempel Svar eller Dryck. Värdet kan vara av flera slag, som siffror eller texter, men det kan även vara resul-tatet av ett matematiskt uttryck.

>>> Svar = 7

Innan Python såg just den här programsatsen så fanns inte variabeln Svar. I och med att du har matat in raden och tryckt Enter, har variabeln också skapats. Så enkelt är det att skapa variabler i Python.

Page 37: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 35

>>> Uträkning = 2 + 2

En variabel kan tilldelas ett matetematiskt uttryck också.

>>> Dryck = "Kaffe"

Exakt detsamma gäller för strängvariabeln Dryck, som inte fanns förrän den tilldelades värdet Kaffe.

Vill du visa värdet på variabeln Svar i terminalvyn, skriver du helt enkelt variabelns namn och trycker Enter.

>>> Svar 7

Då matas värdet ut.

6.1.1. Namngivning av variabler Det finns några regler kring variabelnamn som du måste följa.

Namnet får innehålla vanliga bokstäver, alltså A-Ö och a-ö.

Namnet får innehålla understrykningstecknet _

Namnet får innehålla siffror, men inte börja med en siffra.

Namnet får inte innehålla mellanslag eller andra skiljetecken.

Namnet får inte vara ett reserverat ord som if, def, while osv. Det kommer att ge ett felmeddelande. Se de reserverade orden i nästa avsnitt.

Skiftläget har betydelse. A är ett annat tecken än a.

Undvik variabelnamn som ”O” (versalt o) eller ”l” (gement L) eftersom de kan förväx-las med noll (0) och ett (1).

För din egen skull bör du ge variablerna korta, beskrivande namn på svenska. Det ska vara lätt att förstå vad de representerar!

Variabelnamn måste vara unika. En variabel kan bara användas till en sak. Tilldelar du variabeln Svar värdet 7 och därefter värdet ”Oskar” kommer den att bli en textva-riabel och sjuan är försvunnen.

6.1.2. Reserverade ord Reserverade ord är sådana ord som inte får användas som variabel- eller funktionsnamn i program. Python kommer att lämna ett felmeddelande om du försöker använda dem fel-aktigt.

and as assert async await break class continue def del elif else except False finally for from global if import in

is lambda None nonlocal not or pass raise return True try while with yield

Page 38: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 36

6.1.3. Svenska tecken Det är en evig debatt om man ska använda svenska tecken i variabelnamn. Python tillåter svenska tecken och så länge programmet ska användas i svenska sammanhang och förstås av svenskar ska också programsatserna skrivas på svenska och med svenska tecken. Al-ternativet är att skriva allt på engelska.

Visst kan du skriva

alder = 18

men håll med om att

ålder = 18

är lättare att begripa.

Låt också bli att blanda svenska kommentarer och engelska variabelnamn. Programmet blir varken bättre eller mera lättförståeligt för att du lägger in engelska variabelnamn. Alla uppgifter i denna bok kan utan vidare skrivas och lösas på svenska eftersom Python version 3 kan hantera svenska tecken.

6.1.4. Prova på med frukter

Skriv ett pythonprogram i programredigeraren som beräknar följande.

a) Äter du två frukter varje skoldag, hur många frukter äter du per vecka?

b) På ett läsår är det 38 veckor. Hur många frukter äter du på ett läsår?

Spara programmet under namnet läsårsfrukter.py och kör det.

Page 39: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 37

6.1.5. Lösningförslag # läsårsfrukter.py # Beräkna antal frukter per vecka om du äter 2 frukter # per dag antal_frukter_per_vecka = 2 * 5 print("Varje vecka äts ", antal_frukter_per_vecka, " frukter.") # Beräkna antal frukter per läsår om varje läsår är 38 # veckor antal_frukter_per_läsår = antal_frukter_per_vecka * 38 print("Varje läsår äts ", antal_frukter_per_läsår, " frukter.")

Nu kan du köra filen.

Varje vecka äts 10 frukter. Varje läsår äts 380 frukter.

6.1.6. Flödesschema Flödesschemat är inte över sig komplicerat. Precis som i programkoden har flödet fyra huvuddelar. Beräkna, skriv ut, beräkna igen och skriv ut. Sedan är det slut.

6.1.7. Analys Definiera variabeln antal_frukter_per_vecka och tilldela den värdet 2 frukter gånger 5 dagar.

Variabelnamnet är valfritt, men bör vara en beskrivning av syftet med variabeln, enligt resonemanget om namngivning av variabler på sidan 35. Du hade kunnat döpa variabeln till krfst4dutt men håll med om att antal_frukter_per_vecka är ett bättre beskrivande namn som alla förstår, framförallt du själv en månad senare, utan att behöva stu-dera programmet särskilt noga.

För att få antal frukter per läsår, måste antalet frukter per vecka mul-tipliceras med läsårets veckor.

Slutligen måste resultatet skrivas ut, för att du ska få se det.

6.1.8. Enkla variabelövningar Använd terminalvyn och skapa följande variabler

a) Skapa en variabel med namnet färdig och sätt den till False.

b) Skapa en räknare med namnet antal_kaniner, som tilldelas vär-det 0.

c) För att det ska hända något, så tilldelar du variabeln antal_kaniner värdet 2.

d) Skapa de nya variablerna sida1, sida2 och hypotenusa. Tilldela dessa värdena 6, 8 och 10.

e) Skapa en ny variabel kallad triangelns_omkrets och tilldela den värdet av summan av sida1, sida2 och hypotenusa.

f) Skapa en till variabel, area och tilldela den värdet av sida1 * sida2 delat med 2.

Page 40: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 38

g) Sätt variabeln färdig till True.

6.2. Variabeltyper

Förutom värde och namn har variablerna en typ som beskriver det värde som lagrats i variabeln. I Python hanteras typerna automatiskt när en variabel tilldelas ett värde. Du har hittills sett programexempel på heltal och strängar.

De grundläggande datatyperna i Python är följande:

Heltal

# Det går tusen meter på en kilometer meter = 1000

I Python används det engelska orden ”integer” eller ”int” för heltal.

Flyttal, reella tal

# Approximation av pi pi = 3.1415926

Det engelska ordet ”float” används för reella tal.

Bråktal

# Så här skrivs bråket tre fjärdedelar bråket = fraction ('3/4')

Det engelska ordet ”fraction” används för bråktal.

Text

# En beskrivande text beskrivning = "En beskrivande text" beskrivning2 = 'En annan beskrivande text'

Text som består av flera bokstäver i rad kallas för strängar, eller på engelska ”string” vil-ket behandlas närmare på sidan 47. Du kan använda dubbla eller enkla citattecken, bara du inte blandar dem vid samma sträng.

Boolesk variabel

# Sätt en boolesk flagga som anger att det är natt nu Natt = True

Logiska flaggor som anger om något är sant eller falskt kan också lagras, som orden True eller False i datatypen ”boolean”.

IX Imaginära tal

# Så här skrivs imaginära tal. Imaginära tal är ett # talpar med en reell och en komplex del imaginärtal = 7 + 19 * 1j

Det engelska ordet ”complex” används för imaginära eller komplexa tal, där ”1j” beteck-nar roten ur minus ett.

Page 41: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 39

6.2.1. Djupare information i Object Inspector Variabeltypen visas närmare i Thonnys vy Object Inspector med djupare information, alltså inte bara variabelns namn utan även hur den representeras i programmet, dess typ, längd mm. Den är nyttig när du ska ta reda på varför vissa värden inte blir som de ska.

Börja med att ta fram Object Inspector genom att välja View > Object Inspector.

Överst i bilden syns variabelvyn med de variabler som används i programmet. Den blåmarkerade variabeln rad undersöks närmare av inspektören.

Den viktigaste informationen finns i inspektörens titelrad, nämligen variabelns klass tuple, alltså en statisk lista. Det kan förklara varför du får fel på en tilldelningsoperation.

Väljer du visningstypen Data får du se de data som finns i tuplen i detta nu. De gula blädderpi-larna kan användas till att bläddra bland tidigare visade variabler.

Strängen 0x3F5A0F8 anger variabelns ”namn” så som datorn ser det, egentligen dess adress i minnet. Visningstypen Atts visar på egenskaper som faller utanför denna bok.

Växlar du till fliken Assistant får du antingen se olika varningar som enligt Thonny själv kan hoppas över om du tycker att programmet fungerar bra, eller glada tillrop, som ”The code in program.py looks good”.

6.2.2. Typkonvertering med muffins Det finns situationer när man vill ha kontroll över vilken typ variabeln ska ha, om man till exempel gör en beräkning och resultatet blir ett flyttal, fast ett heltal hade passat bätt-re i sammanhanget. Det går bra att räkna med och dela på vaniljmuffins. Men inte cho-kladmuffins, som är heltalsmuffins. De kan inte delas och har inga decimalmuffins.

Antag att du har fyra barn som ska dela på 11 odelbara chokladmuffins !!

>>> muffins_per_barn = 11/4

Om Python själv får välja så är muffins_per_barn av typen flyttal (float) vilket är kor-rekt på alla sätt och vis. Det visar Python om du ber om variabeltypen med funktionen type() !!

>>> type (muffins_per_barn) <class 'float'>

Men chokladmuffinsarna är fortfarande odelbara, så i just detta sammanhang så är det bättre att muffins_per_barn är av typen heltal (int) !!

>>> muffins_per_barn = int(11/4)

Genom att omsluta 11/4 med funktionen int() tvingar du fram ett heltalsresultat. Att ändra typ på detta sätt, kallas typkonvertering. !!

>>> type (muffins_per_barn) <class 'int'>

Python visar att konverteringen skett.

Page 42: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 40

Bilden visar hur Python kan konvertera variabler mellan olika typer för att det ska gå att räkna med dem eller använda dem på det sätt du önskar.

På första raden gör funktionen int() ett heltal av ett flyttal och fjärdedelen går bort. int() kan också göra ett heltal av texten ”4”. Texten kan se ut som ett tal, men är ändå en text.

På tredje raden gör funktionen float() decimalmuffins av heltalet 3 och resultatet blir 3,0 vilket är detsamma som tre muffins och en tom muffinsform på tiondelspositionen. flo-at() kan också göra om texten ”3.5” till ett flyttal.

Slutligen kan funktionen str() göra om exempelvis flyttalsmuffins till en text. Text går inte att räkna med.

6.2.3. Identifiera variabeltyper a) Skapa en variabel med namnet månens_omkrets. Tilldela den värdet av beräknignen 3474 kilometer gånger π. Vilken variabeltyp är det?

b) Skapa en variabel med namnet tal och tilldela den värdet 15. Vilken variabeltyp är det?

c) Du ska skriva ett program som styr den nya generationens maskin som plockar jordub-bar: Jordgubbsplockare 2.0. När man startar den anger man olika startvärden:

Page 43: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 41

Hur många jordgubbsplantor som växer per rad.

Vilken jordgubssort det är, så att maskinen kan skriva ut etiketterna på kartongerna.

Man anger även om den ska ta med inte fullt mogna bär.

Man anger bärens mognadsgrad i procent.

Så här fungerar den: När maskinen ställts in går den fram och tillbaka över jordgubbslan-det och plockar gubbar. När den plockat 15 stycken, byter den kartong. När Jordgubbs-plockare 2.0 blivit klar med jordgubbslandet, avrapporterar den antalet plockade jordgub-bar, antalet omogna jordgubbar som är kvar i landet och hur många kartonger det blev.

Beskriv vilka variabler du kan identifiera i uppgiften och ge förslag på namn och typer och rita ett flödesschema på hur du tror att maskinen fungerar. Använd Object Inspector för att verifiera att du resonerat rätt.

6.3. Till höger om likhetstecknet

I en variabeltilldelning utvärderar Python uttrycket till höger om likhetstecknet först, innan den utför tilldelningen till variabeln.

Eftersom ett program sällan blir rätt på en gång, finns inbyggda möjligheter till avlusning (debugging). Avlusarens funktion är att visa i detalj hur Python ”tänker” när den tar sig igenom ditt program för att du ska förstå hur programflödet löper.

Avlusning kan bara ske efter att alla syntaktiska fel rättats. Finns det syntaktiska fel (grammatiska fel, stavfel) kvar i texten, startar inte avlusaren (Se sidan 228).

I en variabeltilldelning utvärderar Python uttrycket till höger om likhetstecknet först in-nan den utför tilldelningen till variabeln.

Här är det första, enkla program som ska avlusas. Du kan kopiera det härifrån och öva dig på att avlusa själv !!

# kassakvitto.py kexchoklad_pris = 10 skumtomtar_pris = 7 sega_ormar_pris = 14 print("kvitto") print("kexchoklad", kexchoklad_pris) print("skumtomtar", skumtomtar_pris) print("sega ormar", sega_ormar_pris) summa = kexchoklad_pris + skumtomtar_pris + sega_ormar_pris print("Att betala", summa)

Page 44: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 42

Programmet är en enkel simulation av en kassaapparat som ska slå samman priserna för tre olika sorters godis och skriva ut ett kvitto.

När programmet ligger färdigt i programredigeraren, ser det ut så här. Notera betydelsen av all den gröna och blå texten.

För att starta en avlusning börjar du med att välja Run > Debug current script (ni-cer). Det finns tre typer av avlusning: nicer, faster och birdseye. Nicer är den grund-läggande metoden du alltid ska använda, medan faster är översiktligare och bara visar programmets flöde i stort. Birdseye kräver installation av ett särskilt felsökningsverktyg, som inte är nödvändigt i detta skede.

För att börja stegningen genom programsatserna trycker du F7 eller väljer Run > Step into.

Page 45: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 43

Avlusningen börjar med första programraden, där kexchoklad_pris kommer att sättas till 10. Notera att avlusningsikonerna i form av orange pilar nu är tillgängliga, men att lus-ikonen för att starta avlusning inte längre är tillgänglig. Du kan inte heller spara eller köra programmet i detta läge.

Välj Run > Step into eller tryck F7 en gång till.

Värdet på uttrycket på höger sida om likhetstecknet kommer att utvärderas.

Värdet på konstanten visade sig utvärderas till 10, presenteras blåmarkerat och tilldelas variabeln kexchoklad_pris.

Nu vet du hur avlusaren undersöker konstanters och variablers värden. Låt oss gå vidare till en utskrift. Stega själv vidare i avlusningen med F7 tills du når rad 4, som avser att skriva ut rubriken ”kvitto”.

Page 46: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 44

I steg 1 har avlusaren hittat raden print(”kvitto”) men vet ännu inte vad den ska göra med den.

Ett tryck på F7 tar oss till steg 2 där avlusa-ren visar användaren vad den sats den avser att undersöka.

I steg 3 börjar avlusaren med att undersöka argumentet till funktionen print och tror att det är en sträng, nämligen strängen ”kvit-to”.

I steg 4 visar avlusaren att strängen var kor-rekt skriven och strängens värde har utvärde-rats till ”kvitto”. Utvärderat och klart, visas värdet i blått.

Strängen appliceras i steg 5 som argument till funktionen print.

I steg 6 har funktionen print gjort sitt jobb och ordet kvitto skrivs ut i terminalvyn.

Inte nog med det. Som alla funktioner, skulle print kunna returnera ett värde till huvudru-tinen, men inte i detta fall. Avlusaren visar att det inte fanns något returvärde genom att visa None utvärderat och klart i blått.

De övriga print-satserna i programmet utvär-deras på precis samma sätt.

Page 47: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 45

Nu ska kassapparaten slå ihop priset på alla varorna och skapa den summa som ska beta-las.

Variabeln summa utvärderas på rad 8. Avlusaren har redan kontrollerat utvärderingen av priserna på varorna kexchoklad, skumtomtar och sega ormar. Värdena återfinns i vari-abelvyn. Rubriken skrevs ut på rad 4 och de individuella varorna skrevs ut på raderna 5-7. Du ser att variabeln summa inte finns ännu.

Ett tryck på F7 tar oss till nästa steg, där utvärderingen börjar med att undersöka hela tilldelningen och att det är korrekta variabelnamn, som redan är definierade.

Därefter har avlusaren givit sig på variabeln kexchoklad_pris och talar om att denna nu kommer att utvärderas.

Variabeln har utvärderats till värdet 10.

Efter några tryck på F7 är priset på skumtomtar utvärderat till 7.

Nästa steg är utvärdering av de sega ormarna.

Page 48: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 46

Deras pris utvärderas till 14.

Det är dags att beräkna hela uttrycket och tilldela det till variabeln summa. Datorn är duktig och slår ihop 10+7+14 till 31.

Ett sista tryck på F7 och det är dags att skriva ut variabeln summa. Du ser i variabelvyn att variabeln nu existerar och har tilldelas värdet 31. Annars hade det inte gått att skriva ut den.

Det här avsnittet har visat rätt-sökning. Längre fram ska vi ta oss an den tunga felsök-ningen av typiska fel och de felmeddelanden de genererar.

6.3.1. Avrundningsfel Vid flyttalsberäkningar på en dator kan det dyka upp siffror i slutet av resultatet som inte var förväntade. Dessa siffror påverkar normalt sett inte resultatet eftersom man i mate-matiken har räkneregler för hur många värdesiffror och decimaler som ska användas i svaret, beroende på hur många som används i själva beräkningen !!

>>> 0.2 + 0.4 0.6000000000000001

Orsaken till att det dyker upp en etta i slutet av svaret beror på datorns sätt att represen-tera flyttal i minnet och är inte unikt för Python, utan finns i andra programmeringsspråk också.

Page 49: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VARIABLER

RÄKNA MED PYTHON 47

6.3.2. Förkortande operatorer Python har en mängd förkortande operatorer som ersätter det vanliga skrivsättet för enk-la additioner, subtraktioner osv.

Säg att du står i grönsaksdisken med en påse bananer och vill ha en banan till. Det kan du uttrycka så här !!

>>> Banan = 1 >>> Banan = Banan + 1

Men det finns ett enklare sätt !!

>>> Banan += 1

Denna sats ger precis samma resultat som i förra stycket. Variabeln ökas med ett. På samma sätt kan du skriva !!

>>> Banan -= 1 >>> Banan *= 7 >>> Banan /= 9

Du förstår förmodligen vad som händer? I första satsen subtraheras ett från variabelns värde. I andra satsen multipliceras variabeln med 7 och i den tredje divideras den med 9. Det är helt och hållet upp till dig vilken variant du föredrar att använda. De ”långa” och de ”korta” metoderna är lika ”rätt”.

6.3.3. Övning a) Använd progreammet läsårsfrukter.py från 6.1.5 och undersök programmet med Thonnys avlusningsfunktion. Beskriv med egna ord hur satsen

antal_frukter_per_läsår = antal_frukter_per_vecka * 38

fungerar.

b) Ersätt följande långa satser med förtortande operatorer:

banan = banan * 2 årslön = veckolön * 52 raket = raket – 1

6.4. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 50: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 48

7. In- och utmatning av textsträngar

Program kommunicerar med användaren genom text. Programmet lämnar textmeddelan-den och användaren svarar genom att skriva text.

Även i grafiska tillämpningar så kommunicerar användaren och datorn med text. För att ge programmet något att arbeta med, får du skriva på tangentbordet. Det du skriver på tangentbordet kallas för en sträng.

Här är det helt klart att programmet vill att du skriver ett filnamn.

7.1. Strängar och strängvariabler

En variabel tilldelas en textsträng genom att du omsluter texten med citationstecken, an-tingen dubbla (") eller enkla ('), men inte båda blandat för samma sträng.

Datatypen för att hantera text kallas sträng eller textsträng. I Python används det eng-elska ordet ”string” eller förkortningen ”str” för att beteckna textsträngar.

7.1.1. Slå ihop strängar Prova följande satser i tolken !!

>>> förnamn = "nova" >>> efternamn = 'katt'

Page 51: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 49

Behöver man slå ihop två strängar till en, gör man det enkelt med hjälp av +tecknet !!

>>> fullständigtnamn = förnamn + efternamn >>> fullständigtnamn 'novakatt'

Inte särskilt snyggt. Vi är vana vid att för- och efternamn skiljs åt med ett blanksteg. Blanksteg lägger du till genom att helt enkelt addera ett tomrum i form av " " !!

>>> fullständigtnamn = förnamn + " " + efternamn >>> fullständigtnamn 'nova katt'

Om du vill veta hur många tecken som finns i en textsträng kan du be Python räkna dem med funktionen len(). Den räknar alla tecken i strängen, även blankstegen !!

>>> len (fullständigtnamn) 9

7.1.2. Inga dubbla enkla Du kan inte använda två enkla citationstecken efter varandra ('') för att få ett dubbelt. För dig kan '+' se ut som " men så lätt lurar man inte Python, som kommer att se det som en tom sträng och lämna ett felmeddelande.

Gör inte så här:

>>> ''text'' File "<pyshell>", line 1 ''text'' ^ SyntaxError: invalid syntax

7.1.3. Strängvariabler a) Skapa en variabel som innehåller din postadress. Kalla den postadress.

b) Slå ihop strängen ”Postadress: ” med variabeln postadress och kalla resutatet post-adressrad.

c) Avänd fuktionen len() för att ta reda på hur många tecken det är i variabeln post-adressrad.

d) Skriv ett program som lagrar ditt namn, adress och telefonnummer i respektive variab-ler. Formge en utskrift som ser ut ungefär så här:

Namn: Nova Katt Postadress: I skogen Ort: På landet Telefon: 070 610 26

Spara programmet med filnamnet Min.adress.py och kommentera ordentligt.

Page 52: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 50

7.2. Strängformatering

Det finns ett antal funktioner i Python för att förenkla hanteringen av textsträngar och göra snygga utskrifter.

Vi är vana att en mening börjar med stor bokstav. Du kan behöva skriva ut ett värde ur en variabel som du inte vet vilket skiftläge det har. Då kan du använda funktionen capitali-ze() för att skapa en textsträng med inledande versal !!

>>> mening = "början på en mening" >>> mening.capitalize () 'Början på en mening'

Innehållet i variabeln mening har inte ändrats utan captalize() bara visar en kopia av variabeln med inledande versal !!

>>> mening 'början på en mening'

Som du ser har variabeln mening fortfarande kvar sina gemener !!

>>> nymening = mening.capitalize () >>> nymening 'Början på en mening'

Om du tilldelar resultatet av mening.capitalize() till en ny variabel, kommer den nya variabeln dock att få den versalgemena texten.

När du skriver ut ett fullständigt namn är det lämpligt att både för- och efternamn börjar med versal. Om du inte vet vilket skiftläge tecknen har i fullständigtnamn kan du an-vända funktionen title() för att tvinga fram versalgemena ord. Title() fungerar på sam-ma sätt som captalize() och förändrar inte innehållet i fullständigtnamn !!

>>> fullständigtnamn = "NovA KaTT" >>> fullständigtnamn.title() "Nova Katt"

Du kan ha behov av att skriva ut en mening med enbart versaler eller enbart gemener, oavsett hur den var sammansatt från början. För det finns funktionerna upper() som ger versaler och lower() som ger gemener !!

>>> knasmening = "varning! se UPP för FLYGANDE bäckaSIner" >>> knasmening.upper() "VARNING! SE UPP FÖR FLYGANDE BÄCKASINER" >>> knasmening.lower() "varning! se upp för flygande bäckasiner"

För rubriker kan ibland en centrerad text passa sig. Istället för att du själv ska behöva räkna ut hur många blanksteg som behövs, särskilt om utskriftsfunktionen inte vet vad variabeln innehåller, kan du använda funktionen center() för att automatiskt centrera texten på tillgängligt utrymme.

Center har följande syntax: strängvariabel.center(bredd, utfyllnad)

Page 53: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 51

Använd det så här !!

>>> rubrik = "viktigt" >>> rubrik.center(20) " viktigt " <---- 20 tecken --->

Konstanten 20 anger hur många tecken bred strängen blir totalt. På detta utrymme stop-par center() in texten och fyller ut resten med blanksteg.

Center() kan förses med specifikation om utfyllnadstecken, till exempel = för att det hela ska bli mera imponerande !!

>>> rubrik = "viktigt" >>> rubrik.center(20, "=") "======viktigt======="

För att det hela ska bli riktigt imponerande kan ordet ”viktigt” behöva framhävas. Då kan du kombinera center() med upper() !!

>>> rubrik = "viktigt" >>> rubrik.center(20, "=").upper() "======VIKTIGT======="

På samma sätt kan du få höger- och vänsterställd text på en angiven bredd.

Vänsterställning har följande syntax: strängvariabel.ljust(bredd, utfyllnad)

Högerställning har följande syntax: strängvariabel.rjust(bredd, utfyllnad)

7.2.1. Strängformatering Funktionerna rjust() och ljust() på samma sätt som center().

a) Skriv ut följande tabell med hjälp av ljust() och rjust().

Tal Namn 1 000 000 Miljon 100 000 Hundratusen 1000 Tusen 1 Ett

b) Gör tabellen snyggare genom att ge den en centrerad rubrik som är utfylld med lik-hetstecken, så här.

== Stora och små tal === Tal Namn 1 000 000 Miljon 100 000 Hundratusen 1000 Tusen 1 Ett

Page 54: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 52

7.2.2. Format Format-funktionen kan användas till att formatera strängar på en mängd olika sätt, som att slå ihop strängar med strängar, strängar med variabler osv. Det gör man genom att sätta ut platshållare i grundsträngen, som format-funktionen ersätter med de olika argu-ment (värden) som står innanför parentesen, i den ordning de förekommer i parentesen.

I praktiken kan det se ut så här.

>>> "Namn: {0} {1}".format(förnamn, efternamn) Namn: nova katt

Format tar den första variabeln i listan, nämligen förnamn och placerar den istället för platshållaren {0} och den andra variabeln efternamn istället för {1}. Vid utskriften hamnar förnamnet först.

7.2.3. Platshållare Platshållaren kan också användas till att formatera texten som ska sättas in och placera den på olika sätt i en given spaltbredd.

Så anger till exempel platshållaren {1:<7} fyra saker.

Ettan anger numret på den variabel som ska hämtas ur format-listan, på samma sätt som i förra exemplet.

: är en avgränsare som anger att ett formateringsuttryck följer.

< betyder att texten i spalten ska vänsterställas. Som du ser pekar den åt vänster. > anger att texten ska högerställas, medan ^betyder att texten ska centreras i det till-gängliga utrymmet.

Siffran 7 anger hur bred spalten minst blir, eftersom spalten fylls ut med mellanslag om variabeln är kortare än sju tecken, medan längre variabler skrivs ut i sin helhet.

Formatering är en hel värld för sig. Läs mer under rubriken Om formatering av strängar på http://huvudrutin.se/index.php/lankar

7.2.4. Standardvärden för platshållare Om du inte vill ändra ordningen på variablerna i .format-listan kan du låta standardord-ningen gälla. Då behövs inga nummer i platshållarna.

>>> "Namn: {} {}".format(förnamn, efternamn) Namn: nova katt

Variablerna kommer då att sättas in i den ordning de förekommer i .format-listan. Det enda problemet är att detta kommer att göra programmet mindre överskådligt.

Page 55: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 53

7.2.5. Prova på enkla format() Programmeraren på Byråkratbyrån AB tycker att det är besvärligt att byta plats på för-namn och efternamn i hela befolkningsregistret när han ska skriva ut blanketter. Hjälp honom genom att byta plats på namnen med format().

Hans nuvarande kod ser ut så här:

print(förnamn, ", ", efternamn)

Skapa variablerna förnamn och efternamn så att du får ett fungerande program och tilldela dem godtyckliga personnamn. Byt sedan plats på namnen i utskriften med hjälp av format().

7.2.6. Lösningsförslag # namnflyttare.py förnamn = 'Nova' efternamn = 'Katt' print('{1}, {0}'.format(förnamn, efternamn))

7.3. Utskrift i detalj

Oftast är man intresserad av att formge text för att utskriften ska bli tilltalande och det kan man göra på många sätt.

När du ska komponera dina egna utskrifter måste du börja tänka i rader och positioner. Printsatsen börjar på första bästa position där markören står, och lämnar i från sig kon-trollen där den slutade mata ut tecken, vare sig det är mitt på en rad, eller i början av en ny rad. Där kommer den att fortsätta nästa gång.

Syntaxen för print() är

print(*objects, sep=' ', end='\n')

Argumentet *objects är en godtyckligt lång, kommaseparerad lista med strängar och va-riabler som ska skrivas ut.

Argumentet sep= anger avgränsaren som skrivs ut mellan posterna i listan *objects. Om inget annat sägs blir det ett blanktecken, men du kan ange valfritt tecken eller sträng !!

>>> print("Namn:", förnamn, efternamn, sep='_') Namn:_nova_katt

Argumentet end= anger hur den utskrivna raden ska avslutas. Om du inte använder \n avslutas raden med nyrad, men ibland kan det vara praktiskt att istället ange ingen rad-brytning (end=""), eller blanktecken (end=" ") om du skulle vilja fortsätta på samma rad med nästa print-sats.

# katt_utan_end.py förnamn = "nova" efternamn = 'katt' print("Namn:", end=" ") print(förnamn, end=" ") print(efternamn) >>> %Run 'katt utan end.py' Namn: nova katt

Page 56: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 54

7.3.1. Utskriftsformatering i praktiken Antag att du vill skriva ut en tabell. Den kan innehålla väldigt många variabler. Du kan också vilja kasta om dem på olika sätt och ange olika kolumnbredder.

# tabellprov.py print ('{1:<7} {0:<8} skonr {2:>2} längd {3:^5}' .format ('Kalle', 'Karlsson', 45, 186)) print ('{1:<7} {0:<8} skonr {2:>2} längd {3:^5}' .format ('Anna', 'Andersson', 36, 157)) print ('{1:<7} {0:<8} skonr {2:>2} längd {3:^5}' .format ('Nova', 'Katt', 2, 41)) print ('{1:<7} {0:<8} skonr {2:>2} längd {3:^5}' .format ('Nils', 'Nilsson', 43, 172))

Utskriften kommer att se ut som följer.

Karlsson Kalle skonr 45 längd 186 Andersson Anna skonr 36 längd 157 Katt Nova skonr 2 längd 41 Nilsson Nils skonr 43 längd 172

Den utskriften blev inte så snygg.

Formatering är en skön konst. För att göra en snygg tabell måste man se till att alla ta-bellkolumner är lika breda, oavsett hur brett innehållet på en rad är. Dessutom ska texter alltid vara vänsterställda i spalten, medan tal ska vara högerställda, så att entalen ham-nar under varandra. Därför måste spalten kunna fyllas ut med blanksteg till höger eller vänster för att justeras snyggt. Vissa värden kanske passar bäst centrerade.

Notera att för- och efternamn kastades om i utskriften, eftersom platshållarna för nam-nen skrevs i omvänd ordning: {1} {0}.

För att få raka spalter är det enklast att öka spaltbredden för efternamnet från {1:<7} till {1:<9}. Då blir utskriften så här.

Karlsson Kalle skonr 45 längd 186 Andersson Anna skonr 36 längd 157 Katt Nova skonr 2 längd 41 Nilsson Nils skonr 43 längd 172

När man skriver ut tabellmaterial kommer det alltid att komma strängar med oväntade längder. Hellre än att försöka anpassa spaltbredderna i efterhand, kan man sätta hårda begränsningar för spaltbredderna och klippa bort överskjutande tecken.

Det som sagts om utskrifter i detta avsnitt gäller även för tilldelning till en strängvariabel, exempelvis så här.

Nova = ('{1:<8} {0:<8} skonr {2:>2} längd {3:^5}' .format ('Nova', 'Katt', 2, 41))

Textsträngen som lagras i variabeln kan då komma att se ut så här:

"Katt Nova skonr 2 längd 41"

Notera att detta är en enda sträng, inte en lista med variabler.

Page 57: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 55

7.3.2. Praktisk användning av format() Att formge en tabell genom att sätta in blanksteg är inte särskilt optimalt. Funktionen format() har en fullständig uppsättning verktyg för att göra korrekt formaterade tabel-ler.

a) Gör om övning 7.2.1 men använd format() istället.

b) Skriv ett program som matar ut följande tabell, med vänsterställda och centrerade ko-lumner. Använd format() och fuska inte med blanksteg.

Tillbehör Affes wurstar Raggarrondellen Gurkmajonnäs x

Surkål x Stark senap x

Ketchup x Potatismos x Räksallad x x

Strips x Kötthalt i korven 93,5 % 14 %

7.4. Styrtecken

Om du vill formge utskriften exaktare, till exempel genom att använda tabbtecken för att göra snygga tabeller, eller tvinga fram tomrader för att göra avstånd i utskriften. För det-ta finns specialtecken. Styrtecknet kommer inte att skrivas ut, utan istället resultera i en order att utföra något, som att hoppa till ny rad eller gå framåt ett antal blanksteg på skärmen.

I engelsk text brukar styrtecknen kallas för escapesekvenser, vilket går tillbaka på sättet som exempelvis bildskärmar och skrivare reagerade på sådana teckensekvenser förr i ti-den. I modern programmering har det inget med tangenten <Esc> att göra.

Vill du till exempel ha en tabb mellan två tal, kan du skriva så här !!

print ('234 \t 567')

Vill du tvinga fram två tomma rader mellan två textrader kan du skriva så här !!

print ('Första raden \n\n Tredje raden')

7.4.1. Sammanfattning av styrtecken Teckenkombination Ger som resultat, eller skriver ut

\n Börja om på ny rad \r Börja skriva ut i början på raden (tänk ”retur”) \t En tabulator \" Ett dubbelt citattecken \' Ett enkelt citattecken \\ Ett bakåtlutande snedstreck

Citationstecken är ett specialfall vid strängformatering. Du kan förhindra att Python ser dem som avgränsare, genom att använda ett styrtecken, eller att använda den ena typen av citationstecken som avgränsare och skriva ut den andra, valfritt vilket !!

Page 58: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 56

>>> exempel_str1 = "en 'textsträng'" >>> print(exempel_str1) en 'textsträng' >>> exempel_str2 = 'en "textsträng"' >>> print(exempel_str2) en "textsträng"

Styrtecken eller outskrivbara tecken (unprintable characters) används även vid modern ordbehandling i dator, de syns bara inte. Men det går att visa dem om man vill, som här i MS Word.

Man brukar ha visningen av de outskrivbara tecknen avstängda vid normal redigering, men det går att visa dem om man vill ha bättre kontroll på sitt arbete, för att se att inga oönskade tecken kommer med i texten. Blanksteg visas som en liten prick, tabbtecken som en högerpil, obrytbara blanksteg som en liten ring, radslut som ett sk stycketecken och avstavningsförbud som ett minustecken med häng.

7.4.2. Styrtecken Du jobbar på Ericsson där det är ny företagspolicy att alla inmatningar ska föregås av lo-gotypen \\\. Skriv en input-sats som frågar hur många suddgummin du förväntas förbruka det kommande kvartalet, tar antalet och skriver ut det. Policyn kräver att logotypen visas även vid utskrifter.

Exempelkörning:

\\\ Antal suddgummin: 10 \\\ Registrerat antal: 10

Det är inte helt lätt att skriva ut \\\. Det är knepigheten i denna övning.

Avståndet mellan ”antal:” och siffran är lite längre. Det ska utföras med en tabulering.

Page 59: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 57

7.5. Inmatning

För att ett program ska vara användbart måste det kunna ta emot indata från använda-ren, som senare kan bearbetas av programmet. Pythonfunktionen input() används till att ställa en fråga, inväntar och hanterar det användaren skriver på tangentbordet.

Syntaxen för input() är:

indata = input([hänvisning])

Input uppmanar användaren att lämna ett svar, med en hänvisning. Om hänvisningen finns med, skrivs den ut i terminalvyn, utan radslut. Det användaren svarar, görs till en sträng som tilldelas en variabel.

Så här fungerar det i detalj i Python.

När input-satsen körs kommer uppmaningstexten i parentesen att visas i terminalvyn. Den bör uppmana användaren att mata in data. När användaren gör det, tilldelas varia-beln indata det som användaren svarade. Det ser man både i variabelvyn och i Object

Page 60: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 58

inspector. Inspektören visar något annat också, nämligen att indata är en sträng, alltså en text, även om värdet råkar se ut som siffror.

Med kännedom om att inmatat data alltid blir till en sträng, kan bearbetningen av varia-beln indata fortsätta, till exempel genom att göra om strängen till ett tal, om man vet att det rör sig om siffror.

En uppgift är att man vill fråga användaren om dennes namn.

# namnfråga.py förnamn = input("Förnamn ") efternamn = input("Efternamn ") fullständigtnamn = förnamn + " " + efternamn print("Välkommen", fullständigtnamn)

input() tilldelar variablerna förnamn och efternamn det användaren skriver, i form av strängar.

7.5.1. Inmatning av tal Nästa exempel är ett program som beräknar och skriver ut potenser. Programmet ska fråga efter uttryckets bas och dess exponent och ska därefter utföra beräkningen och skri-va ut resultatet på en rad.

# exponentfråga.py bas = input("Ange bas ") exponent = input("Ange exponent ") produkt = bas ** exponent print("{0}^{1} = {2}".format(bas, exponent, produkt))

Det kan verka enkelt, men Python protesterar.

Vad händer? Rad 1 och 2 körs utan problem och användaren kan mata in en tvåa och en trea, men rad 3 ger ett ”TypeError: unsupported operand type” vilket beror på att pro-grammet försöker göra en matematisk beräkning, fast variablerna i beräkningen är av typen strängar.

input() tilldelar alltid variabeln ett strängvärde. Allt som matas in med input() förblir en sträng om inget annat sägs. Strängen kan mycket väl vara en siffra, men är ändå av typen sträng. Det kan vara korrekt i andra fall, men denna beräkning kräver siffror. Åt-gärda det genom att konvertera strängarna till heltal, så här.

bas = int(input ("Ange bas ")) exponent = int(input ("Ange exponent ")) produkt = bas ** exponent print("{0}^{1} = {2}".format(bas, exponent, produkt))

Page 61: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 59

Funktionen int() tvingar Python att göra om de inmatade strängarna till heltal, som går bra att göra exponenter av.

7.5.2. Eliminering av oönskade tecken i indata Det är vanligt att man vill rensa indata från användaren på oönskade tecken. Ett av de vanligaste tecknen man vill bli av med är blanktecken eftersom användare gärna slinter på mellanslagstangenten.

Använd exemplet på sidan 57 men antag att användaren råkar skriva ett par extra mel-lanslag före namnen. Då kan körningen se ut så här.

Förnamn Nova Efternamn katt Välkommen Nova katt

Ett sätt att åtgärda detta är att använda funktionen strip() och skriva om satserna så här !!

förnamn = input("Förnamn ") efternamn = input("Efternamn ") helanamnet = förnamn.strip() + " " + efternamn.strip() print("Välkommen", helanamnet)

Vid körning kommer det att se ut så här.

Förnamn Nova Efternamn Katt Välkommen Nova Katt

Om inget annat sägs i funktionen strip() kommer blanktecken att rensas. Vill du rensa indata på andra tecken än blanktecken, anger du det önskade tecknet som argument till funktionen. Skriv till exempel strip('a') för att rensa bort alla ”a” från början och slutet av strängen.

Innehållet i variablerna förnamn och efternamn ändras inte. Istället tilldelar strip() variabeln helanamnet en rensad kopia av de förstnämnda variablerna.

7.5.3. Inmatning Det finns ännu flera metoder att skala bort oönskade tecken i ett inmatat värde, till ex-empel funktionerna rstrip() och lstrip().

Page 62: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IN- OCH UTMATNING AV TEXTSTRÄNGAR

RÄKNA MED PYTHON 60

a) Du ska fara utför Niagarafallet i en tunna. Tunnorna måste måttbeställas. För att be-räkna kostnaden för tunnan måste Dödsförakt AB ha din kroppslängd i meter. Tunnorna kostar 1024,50 kronor per meter. Skriv ett program som tar in din kroppslängd i meter och presenterar tunnans pris.

b) Medarbetarna på sängfabriken Sussegott somnar ofta på mellanslagstangenten när de ska mata in kundorder. Skriv ett program som tar emot en inmatning med godtyckligt antal blanktecken före och efter ett ord och tar bort blanktecknen i början och slutet av den inmatade strängen och presenterar den med ”rensat” utseende. Använd funktionerna strip(), rstrip() och lstrip().

7.6. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 63: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 61

8. Frågesatser

Program består av ett flöde av programsatser som ska köras i en bestämd ordning för att lösa en uppgift. Under normal programkörning går flödet uppifrån och ned, precis som ett kakre-cept.

Men när du följer ett kakrecept kan det hända att du kan behöva göra något annat än vad den som skrev receptet förväntade sig. Antag att receptet anger hallonsylt, men att du inte har någon hallonsylt. Istället har du frysta bär. Du avviker från receptet, tar ut bären ur frysen, tinar dem, mosar och sockrar.

Ibland måste programmeraren kunna göra ett vägval och välja vilka programsatser som körs for att lösa uppgiften, beroende på förutsätt-ningarna. Det utförs med frågesatser. Precis som det låter, ställer programmeraren en fråga och beroende på svaret på frågan ändras flödet av satser. De programkonstruktioner som kan ändra flödet är frågesatser, som behandlas i det här kapitlet, slingor (sidan 111) och funk-tioner (sidan 122).

Page 64: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 62

8.1. Frågesatsens uppbyggnad

if logiskt_uttryck: Block med programsatser

Frågesatsens konstruktion bygger på att man inleder med nyckelordet if följt av ett lo-giskt uttryck och avslutar raden med ett kolon. Frågesatsen följs av ett block med en eller flera programsatser.

I ett flödesschema används en romb som symbol för en frå-gesats. Flödet börjar uppifrån och frågesatsen har alltid åtminstone två utvägar, sant eller falskt. I praktiken kom-mer svaret att bli ja eller nej. Om svaret på frågan är Ja viker flödet av och utför det block som tillhör frågesatsen och är respons på svaret, för att sedan fortsätta i program-mets normala flöde. Om svaret är Nej fortsätter flödet rakt ned och utför de satser som finns där.

8.1.1. Logiska uttryck Det logiska uttrycket kan ses som en fråga, som: är temperaturen lika med 0, eller är temperaturen större än 0, eller är temperaturen större än eller lika med 0 osv. Om svaret på frågan är Ja (True) så körs blocket med programsatser som hör till frågesatsen. Om svaret på frågan är Nej (False) körs inte blocket, utan programmet hoppar till raden efter blocket.

För att konstruera logiska uttryck använder man jämförelseoperatorer och bygger upp den frågeställning man vill ha svar på. Resultatet av frågeställningen blir antingen Ja (True) eller Nej (False). I Python blir svaret alltid ett booleskt värde.

Jämförelseoperatorerna är ungefär desamma som används i matematiken.

Fråga Skrivsätt i Python Skrivsätt i matematiken Är A lika med 7 A == 7 A = 7 Är A större än 7 A > 7 A > 7 Är A större än eller lika med 7 A >= 7 A ≥ 7 Är A mindre än 7 A < 7 A < 7 Är A mindre än eller lika med 7 A <= 7 A ≤ 7 Är A inte lika med 7 A != 7 A ≠ 7 Några saker att vara observant på:

”Lika med” utförs med två likhetstecken. Används ett likhetstecken är det en varia-beltilldelning. A=7 i Python betyder ”A sätts till värdet 7”. A==7 ställer frågan ”är A lika med 7?”

I operatorerna större än eller lika med och mindre än eller lika med står lik-hetstecknet till höger om pilen.

De jämförelseoperatorer som består av två tecken ska skrivas ihop utan blanksteg emellan. Annars ser Python det som ett syntaxfel.

Page 65: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 63

8.1.2. Prova på Använd terminalvyn och utvärdera dessa logiska uttryck

a) Är 7 större än 42?

b) Är 7 mindre än 42?

c) Är 7 inte lika med 42?

d) Är 'adam' lika med 'Adam'?

e) Ställ upp den logiska jämförelsen du hittar i följande berättelse.

Nuvarande världsrekord för kulstötning är 23,12 meter. Den okände tyske kulstötaren Alfred Kugelstoss stöter 27 meter. Stöter han längre än världsrekordet?

8.1.3. Lösningsförslag a)

>>> 7 > 42 False

b)

>>> 7 < 42 True

c)

>>> 7 != 42 True

d)

>>> 'adam' == 'Adam' False

e)

>>> 27 > 23.12 True

8.1.4. Övning Kalle och Ada är ute och promenerar en vinterkväll. Temperaturen är under noll och Kal-le köper två varmkorvar i ett korvstånd. Kalles korv är 17 cm medan Adas bara är 14. Vems korv är längst? Kalle ska betala och korvarna kostar 50 kronor tillsammans. Kalle har bara 20 kronor. Kan Kalle förvänta sig att få växel tillbaka? Kalle och Ada gör en springnota. Kalle och Ada springer lika snabbt. Korvföreståndaren springer snabbare än Ada. Kommer Kalle att få diska?

Ställ upp de logiska jämförelserna du hittar i berättelsen. Motivera med variabelnamn som pris, fart, längd osv.

Page 66: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 64

8.2. Block

Ett block är ett antal satser som logiskt hålls samman till en enhet. Det logiska består i att blocket utför en bestämd uppgift åt den sats som inleder dem, som en frågesats eller en funktionsdefinition. Blocket består i sin enklaste form av en enda programsats, men kan också ha flera satser.

Ett block av satser skapas genom att man gör ett indrag i början av sat-serna, med 4 blanksteg, eller en tabb. Tabben kommer att omvand-las till fyra blanksteg av program-meringsmiljön. Indraget kallas på engelska för indentation. När du

avslutar det logiska uttrycket med ett kolon förstår programredigeraren att nästa sats är en del av ett block och gör indraget själv i fortsättningen. Om blocket innehåller en ny frågesats med kolon kommer redigeraren att hjälpa dig med dubbla indrag.

När blocket är slut och du inte vill ha flera indragna rader, justerar du tillbaka till den indragsnivå som if-satsen hade som inledde blocket. På så sätt visar du att blocket är slut.

Läs mer om när det blir fel i block, på sidan 231.

8.2.1. Prova på Använd terminalvyn, skriv frågesatser och lägg in en enkel utskrift i blocket.

a) Är 7 * 6 större än eller lika med 42?

b) Är 7 * 6 mindre än eller lika med 42?

c) Tilldela variabeln A produkten av 7 * 6 och undersök om A inte är lika med 42?

d) Är 'adam' inte lika med 'Adam'?

8.2.2. Lösningsförslag a)

>>> if 7 * 6 >= 42: ....print('7*6 är större än eller lika med 42') 7*6 är större än eller lika med 42

Notera att Pyhon själv gör ett indrag på 4 blanksteg före print-satsen! Indraget är ett krav i Python.

b)

>>> if 7 * 6 <= 42: print('7 * 6 är mindre än eller lika med 42') 7 * 6 är mindre än eller lika med 42

c)

>>> A = 7 * 6 >>> if A != 42: print('A är inte lika med 42')

Page 67: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 65

Ingen utskrift visas som resultat, eftersom A har värdet 42.

d)

>>> if 'adam' != 'Adam': print("'adam' är inte lika med 'Adam' ") 'adam' är inte lika med 'Adam'

8.2.3. Övning – jämförelseoperatorer Skriv ett program som frågar användaren efter två tal. Programmet ska jämföra talen och skriva ut vilket tal som är störst, genom att både ange ordningsnumret och själva talet. Om talen är lika stora, ska detta också visas. Exempelkörning:

Mata in tal 1: 19 Mata in tal 2: 100 Tal 2, 100, är större än tal 1, 19.

8.3. Flöde i en enkel frågesats

För att undersöka hur frågesatser fungerar, kommer här ett program som hjälper till att avgöra om man behöver ha mössa på sig innan man går ut. Flödes-schemat till vänster ser ut som nedan i Python. Mata in koden i Thonny och spara som mössa.py.

# mössa.py # Fråga användaren temperatur = int(input("Vad är temperaturen ute? ")) # Frågesats "Är värdet för variabeln # temperatur under 0?" if temperatur < 0: # Om svaret är ja, körs detta block print("Ta på dig mössan") print("Välkommen ut!")

Testa programmet med olika indata och se vad som händer. Använd Thonnys avlusare och stega igenom programmet genom att välja Run > Debug current script (nicer) eller tryck Ctrl+F5.

Page 68: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 66

Avlusaren stannar direkt på den första körbara satsen.

Tangenten F7 stegar fram genom programmet. När du tryckt F7 sex gånger har avlusa-ren utvärderat inmatningssatsen och det är dags för dig att ange en temperatur i termi-nalvyn. Försöker du trycka F7 en gång till protesterar Thonny. Skriv siffran 5 och tryck Enter.

Vid nästa tryck på F7 har programmet tagit in femman och lagt den i satsen int() som gör om texten ”5” till siffran 5.

Efter ytterligare ett par F7 är det dags för utvärdering.

Tryck flera F7 och utvärderingen når pudelns kärna: är 5 mindre än 0?

Nej, minsann. Svaret är False. Det betyder att blocket efter frågesatsen, som bara består av satsen print ("Ta på dig mössan") inte kommer att köras. Se flödesschemat i inled-ningen.

Istället avser Python att skriva ut ”Välkommen ut!”

Page 69: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 67

Efter ytterligare några tryck på F7 har texten skrivits ut i terminalvyn. Thonnys avlusare indikerar också att satsen med funktionen print() inte returnerar något värde (None) till något överliggande program, vilket är helt rätt. Vid nästa tryck på F7 avslutas program-met.

Avlusa programmet igen med Run > Debug current script, men nu har det blivit vin-ter och utetemperaturen är –5 grader.

När du kommit fram till det ställe där du ska ange en temperatur, skriver du –5 och trycker Enter.

Frågesatsen finner att –5 är mindre än 0 och svaret på frågan är True.

Page 70: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 68

Det betyder att blocket efter frågesatsen ska köras. Du uppmanas i terminalvyn att ta på dig mössan. Inte heller denna print-sats returnerar något värde till något överliggande program.

Därefter meddelar teminalvyn att du är välkommen ut.

8.4. Ett större block

Blocket kan bestå av flera programsatser. I följande exempel har blocket efter frågesatsen utökats med en sats.

# mössa2.py # Fråga användaren temperatur = int(input("Utetemp?")) # Frågesats "Är innehållet i # variabeln temperatur under 0?" if temperatur < 0: # Om svaret är ja körs detta block print("Ta på dig mössan") print("Glöm inte vantarna") print("Välkommen ut!")

Det finns inga begränsningar för hur många programsatser som kan finnas med i ett block.

Dessutom kan man ha ytterligare if-satser och därmed ytterligare block inuti ett block.

Page 71: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 69

8.5. Frågesatsen else

Frågesatsen if kan byggas ut med satsen else (annars) som fångar upp programflödet om sva-ret på frågan blir nej (False). Med ord kan man formulera flödet som ”Om temperaturen är mindre än 0 använd mössa. Använd annars sol-hatt”. Satsen else är bara en direkt reaktion på if och tar inte emot några ytterligare logiska ut-tryck utan följs av ett kolon och ett block med programsatser.

if logiskt_uttryck: Block 1 med programsatser else: Block 2 med programsatser

Satsen else hör alltid ihop med en villkorssats som if eller while och kan inte stå ensam.

Uttryckt i Python ser flödesschemat ovan ut så här.

# mössa3.py # Fråga användaren temperatur = int(input("Vilken är temperaturen ute? ")) # Frågesats "Är värdet för variabeln temperatur under 0?" if temperatur < 0: # Om svaret på frågan är ja körs detta block print("Ta på dig mössan") print("Glöm inte vantarna") else: # Om svaret på frågan är nej körs detta block print("Ta på dig solhatten!") print("Välkommen ut!")

8.5.1. Prova på Använd avlusningsfunktionen i Thonny och undersök själv flödet och jämför med flödes-schemat. Använd följande indata:

a) Börja med att ange en riktig sommartemperatur över noll grader.

b) Fortsätt med minus fem grader och se skillnaden.

8.5.2. Lösningsförslag Avlusningskörningen i Thonny visas inte.

a) Om användaren anger att det är riktig sommarvärme på 2 grader så ser resultatet av körningen ut så här i terminalvyn.

Page 72: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 70

>>> %Run 'mössa.py' Vad är temperaturen ute? 2 Ta på dig solhatten! Välkommen ut!

Eftersom svaret på frågan i frågesatsen if är Nej så visas uppmaningen att använda sol-hatten.

b)

>>> %Run 'mössa.py' Vad är temperaturen ute? -5 Ta på dig mössan Glöm inte vantarna Välkommen ut!

8.6. Frågesatsen elif

Det är inte så ofta man går med solhatt när det är +2 grader ute, utan det finns en period på vårkanten då man inte har något alls på huvudet. När temperaturen passe-rat 20 grader är det mera rimligt att man använder en solhatt. I ord kan man ut-trycka följdfrågan som ”Om temperaturen är mindre än 0 grader, använd en mössa och handskar. Annars om temperaturen är över 20 grader, använd en solhatt”.

I Python heter denna följdråga elif (en förkortning av else if – annars om). elif är en frågesats och ska ha ett logiskt uttryck att fundera över. Detta uttryck ska vara uppfyllt för att det påföljande blocket med programsatser ska utföras. Man kan ha flera elif-satser staplade efter varandra.

if logiskt_uttryck: Block 1 med programsatser elif logiskt_uttryck: Block 2 med programsatser

När programmet utökats med följdfrågan elif ser det ut så här.

# värstingmössa.py # Fråga användaren temperatur = int(input("Vilken är temperaturen ute? ")) # Frågesats "Är värdet för variabeln temperatur under 0?" if temperatur < 0: # Om svaret på frågan är ja körs detta block print("Ta på dig mössan") print("Glöm inte vantarna")

Page 73: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 71

# Om svaret på frågan ovan är nej körs denna frågesats # och ställer en fråga till. # "Är innehållet i variabeln temperatur över 20?" elif temperatur > 20: # Om svaret på andra frågan är ja körs detta block print("Ta på dig solhatten!") print("Välkommen ut!")

8.6.1. Prova på Använd avlusningsfunktionen i Thonny och undersök själv flödet och jämför med flödes-schemat. Använd följande indata:

a) Börja med att ange en temperatur över 25 grader.

b) Fortsätt med 10 grader och se skillnaden.

8.6.2. Lösningsförslag Avlusningskörningen i Thonny visas inte.

8.7. Kombinationen if-elif-else

Man kan kombinera frågesatserna if och elif med annars-satsen else för att fånga upp alla tänkbara utfall i programmet. Om svaren på de logiska uttrycken i båda frå-gesatserna if och elif utvärderats till Nej körs else.

if logiskt_uttryck: Block 1 med programsatser elif logiskt_uttryck: Block 2 med programsatser else: Block 3 med programsatser

När programmet gjorts fullständigt, med alla satserna if, elif och else ser det ut som på nästa sida.

Page 74: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 72

# solhatt.py # Fråga användaren temperatur = int(input("Vilken är temperaturen ute? ")) # Frågesats "Är värdet för variabeln temperatur under 0?" if temperatur < 0: # Om svaret på frågan är ja körs detta block print("Ta på dig mössan") print("Glöm inte vantarna") # Om svaret på frågan är nej körs följande frågesats # och ställer en fråga till. # "Är innehållet i variabeln temperatur över 20?" elif temperatur > 20: # Om svaret på andra frågan är ja körs detta block print("Ta på dig solhatten!") else: # Om andra svaret också är nej körs detta block print("Känn efter vad som behövs") print("Välkommen ut!")

8.7.1. Prova på Använd avlusningsfunktionen i Thonny och undersök själv flödet och jämför med flödes-schemat. Använd följande indata:

a) Börja med att ange en temperatur på 10 grader.

b) Fortsätt med –100 grader och se skillnaden.

8.7.2. Lösningsförslag Avlusningskörningen i Thonny visas inte.

8.7.3. Övning på frågesatser a) Skriv ett program där användaren får svara Ja eller Nej. Programmet ska visa vilket svaret blev. Om användaren svarade något annat, skrivs ingeting ut. Exempelkörning:

Svara Ja eller Nej: Ja Du svarade Ja. >>>

b) Om användaren svarar något annat än Ja eller Nej, kan resultatet bli följande:

Svara Ja eller Nej: ja >>>

Åtgärda tankevurpan.

c) Ändra programmet från deluppgift b) ovan så att det antar att om man inte svarat Ja, så är svaret Nej och visar detta i utskriften.

d) Om användaren är olydig och svarar Kanske eller något annat, ska programmet detek-tera även detta och klaga med en felutskrift.

Page 75: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 73

8.8. Multipla if-elif-else

Ibland behöver man skriva flera frågesatser efter varandra. Det kan röra sig om att skilja ut och särbehandla en mängd olika värden för en variabel, som temperaturen på smält socker för att koka knäck, göra karameller eller klistra ihop pepparkakshus.

if temperatur < 110: print("Sockret har inte smält ännu") elif temperatur <= 115: print("Hårda trådar bildas") elif temperatur <= 120: print("Mjuk kula bildas") elif temperatur <= 126: print("Fast kula bildas") elif temperatur <= 140: print("Hård kula bildas") elif temperatur <= 150: print("Mjuk karamell bildas") elif temperatur <= 160: print("Hård karamell bildas") elif temperatur <= 170: print("Klar smet bildas") elif temperatur <= 177: print("Smeten blir brynt") elif temperatur <= 180: print("Smeten blir mörk") else: print("Över 180° svartnar sockret och smakar illa")

Page 76: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 74

8.8.1. Prova på

a) Vilken sorts fordon? Skriv ett program som frågar användaren efter antal hjul på ett fordon och avgör om det är en lastbil, en bil, en trehjuling eller en cykel.

b) Vad händer om användaren provar att ange -2 hjul? Sätt in en frågesats som för-hindrar detta och lämnar ett felmeddelan-de.

8.8.2. Lösningsförslag a) Programmet blir ett antal elif-satser staplade på varandra, som skiljer ut olika värden för variabeln hjul.

# hjulkul.py # Fråga användaren Hjul = int(input("Hur många hjul? ")) # Avgör typ av fordon if Hjul > 4: print("En lastbil") elif Hjul == 4: print("En bil") elif Hjul == 3: print("En trehjuling") elif Hjul <= 2: print("En cykel")

Observera att det kan finnas enhjuliga cyklar. Därför frågar man om mindre än eller lika med två hjul.

b)

Inget fordon har negativt antal hjul. Fordonet måste ha minst ett hjul. Följande sätts in istället för if Hjul > 4: så att programmet börjar med att ta reda på om det är noll eller negativt antal hjul.

if Hjul < 1: print("Nähä du! Fordonet måste ha minst ett hjul!") elif Hjul > 4:

Page 77: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 75

8.8.3. Utökad frågesats a) En plattsättare ska sätta upp kakel i ett badrum. Han har med sig 19 lådor kakel som innehåller 150 plattor vardera. Plattorna är 20 x 20 cm. Badrummet är 2 x 3 meter och 2,4 meter i tak. Räcker plattorna till badrummet? Räcker plattorna till ytterligare ett likadant badrum?

Lösningen ska utföras som en frågesats inuti en annan frågesats och enbart en utskrift får presenteras.

b) Hjälp din lärare vid betygssättning av prov. Följande intervall gäller.

0–20 poäng ger betyg E 21–30 poäng ger betyg D 31–40 poäng ger betyg C 41–45 poäng ger betyg B 46–50 poäng ger betyg A

Skriv ett program där läraren kan mata in ett poängtal varefter programmet lämnar mot-svarande betyg. Programmet ska också undersöka om läraren matat in ett heltal och i annat fall lämna ett felmeddelande och be denne ange värdet igen.

8.9. Frågesatser och strängar

Man kan jämföra strängar för att se om de är lika !!

>>> 'en text' == 'en text' True

Det är kanske uppenbart att man kan jämföra om ett tal är större än ett annat, men det-samma kan man göra med strängar. Det går att jämföra om bokstäver är ”större” eller ”mindre” än andra bokstäver. Därför kan strängar jämföras med samma logiska uttryck som tas upp i avsnitt 8.1.1 för tal.

Det uppenbara användningsområdet för detta är sortering av olika slag, när man exem-pelvis vill skapa alfabetiskt sorterade listor som:

Alterschnitzel Alzheimer Anckarström Andersson

Datorn ser egentligen inte bokstäver som bokstäver utan som tal i en lista kallad ASCII-koden (American Standard Code for Information Interchange), men när datorn sedan vi-sar ASCII-koder för oss människor omvandlas de till bokstäver. Det finns många olika kodtabeller, som Unicode, Windows västerländsk och DOS västerländsk, men alfabetets 25 första tecken A-Z har samma koder i alla.

Här är början på ASCII-koderna:

Versaler Decimalt Gemener Decimalt A 65 a 97 B 66 b 98 C 67 c 99 D 68 d 100

Page 78: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 76

Prova olika jämförelser genom att mata in följande i terminalvyn !!

>>> 'abc' > 'abc' False

Strängen abc är naturligtvis lika stor som strängen abc.

>>> 'abd' > 'abc' True

Gemena d har ASCII-värdet 100 och är alltså större än gemena c.

>>> 'abc' > 'abC' True

Gemena c har högre ASCII-värde än versala C.

8.9.1. Frågefunktioner för strängar För vardagsbruk har konstruktörerna av Python eliminerat problemen med detaljunder-söknignar av strängar och skapat färdiga funktioner som utför de vanligaste kontrollerna åt dig. Du behöver bara ta hand om svaret på frågan, True eller False. Här är de vikti-gaste.

Funktion Är True om alla tecken i strängen är: isalnum() alfanumeriska, alltså siffror eller boktäver, men inte skil-

jetecken eller blanksteg isalpha() alfabetiska, alltså inte siffror, skiljetecken eller blanksteg isdecimal() decimala siffror, 0-9 islower() gemener isupper() versaler

Det här är bara början. Flera funktioner finns i dokumentationen till Python med en hel-täckande beskrivning, vid https://docs.python.org/3/library/stdtypes.html#string-methods

Prova till exempel följande !!

>>> 'b'.isspace() False

Naturligtvis är bokstaven b inte ett blanksteg.

8.9.2. Testa enskilda tecken i en sträng Strängar är uppräkningsbara typer som består av enskilda tecken, så det går bra att plocka ut de individuella elementen (bokstäverna) med en for-slinga och undersöka de enskilda tecknen ett och ett.

Följande program undersöker om en sträng innehåller ett likhetstecken. I så fall rör det sig om en variabeltilldelning. Prova !!

# likhetshittare.py for tecken in 'var = 12': if tecken == '=': print("Strängen innehåller en tilldelning")

Page 79: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 77

8.9.3. Undersök strängar Skriv ett program som undersöker om det går bra att konvertera ett inmatat värde till ett tal. Det fungerar till exempel inte om strängen bara består av en tomrad eller bokstäver.

Så här bör körningen se ut.

Mata in ett tal: 12 Giltigt tal Mata in ett tal: Två Ogiltigt tal - innehåller bokstäver Mata in ett tal: 9 4 Ogiltigt tal - innehåller ett blanksteg

Prova att mata in alla möjliga sorters tecken. Använd dig av frågefunktionerna isspace() med flera som du hittar i tabellen ovan.

8.10. IX Logiska operatorer

Ibland vill man att flera logiska (booleska) villkor ska vara uppfyllda för att ett block med programsatser ska köras. Därför kan man kombinera flera logiska operatorer och be-stämma exakt vad som ska hända om en eller flera av dem är sanna eller falska. Villkoren kombineras med de booleska operatorerna and (och), or (eller) och not (icke, eller mot-sats) och kan dessutom kombineras med parenteser och parentesnivåer.

8.10.1. And Om man vill ta reda på om ett värde ligger inom ett visst intervall är and en bra operator.

if temperatur >= 0 and temperatur <= 20:

vilket betyder: om temperaturen är högre än eller lika med 0 och lägre än eller lika med 20 så kommer blocket att köras. Om värdet för temperatur är 40 kommer den första jämförelsen att vara sann och den andra att vara falsk vilket gör att hela uttrycket blir falskt.

För att beskriva de logiska operatorernas funktion brukar man använda sig av sannings-tabeller. De kan verka lite abstrakta vid första anblick men ger en bra överblick av hur de logiska operatorerna arbetar.

and och resultatet om uttrycken A och B är sanna eller falska.

A B A and B Sant Sant Sant Sant Falskt Falskt

Falskt Sant Falskt Falskt Falskt Falskt

Bara om både A och B är sanna kommer hela uttrycket att bli sant.

8.10.2. Or Om man behöver uppfylla åtminstone ett kriterium men inte vet vilket som kommer gälla, kan or användas.

if temperatur < –40 or temperatur > 40:

Page 80: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 78

vilket betyder: om temperaturen är lägre än –40 eller om temperaturen är över +40, kommer blocket att köras. Om värdet för temperatur är 7 kommer båda jämförelserna att vara falska vilket gör att hela uttrycket blir falskt.

or och resultatet om uttrycken A eller B är sanna eller falska.

A B A or B Sant Sant Sant Sant Falskt Sant

Falskt Sant Sant Falskt Falskt Falskt

Om antingen A eller B är sanna kommer hela uttrycket att bli sant.

8.10.3. Not not används för att invertera utvärderade logiska uttryck. Antag att man vill ha precis det motsatta mot föregående uttryck, nämligen att ta reda på om temperaturen inte lig-ger utanför intervallet –40 ... 40 grader

if not(temperatur < –40 or temperatur > 40):

vilket betyder: om temperaturen inte är lägre än –40 eller om temperaturen inte är över +40 grader kommer blocket att köras.

I detta enkla fall hade man kunnat konstruera samma sak genom att bara vända på < och >, men vitsen är att man kan bygga upp långa logiska kedjor av frågor och booleska ope-ratorer för att skapa väldigt komplexa samband.

not vänder, eller inverterar resultatet av ett uttryck.

A not A Sant Falskt

Falskt Sant Om A gäller, blir resultatet att A icke gäller.

8.10.4. Prioriteter Som alla operatorer har även de booleska operatorerna prioriteter. not har högst priori-tet, följt av and och or som har samma prioritet.

8.10.5. Prova på a) Skriv ett program som frågar användaren om täljaren och nämnaren i ett bråk. Under-sök så att inte nämnaren är noll. Operatorn not ska användas. Skriv ut bråket i bråkform och svaret i decimalform efter likhetstecknet.

b) Utöka programmet så att det dessutom bara accepterar nämnare inom intervallet –10 … 10.

c) Utöka programmet så att det bara accepterar täljare större än 17 eller mindre än –12.

Page 81: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 79

8.10.6. Lösningsförslag a)

# bråkfråga.py täljare = int(input('Ange täljare: ')) nämnare = int(input('Ange nämnare: ')) if not (nämnare < 0 or nämnare > 0): print('Nämnaren får inte vara noll!') else: print('{0:^4}'.format(täljare)) print('---- = {}'.format(täljare / nämnare)) print('{0:^4}'.format(nämnare))

Exempelkörning:

Ange täljare: 19 Ange nämnare: 24 19 ---- = 0.7916666666666666 24

b)

# bråkfråga.py täljare = int(input('Ange täljare: ')) nämnare = int(input('Ange nämnare: ')) if not (nämnare < 0 or nämnare > 0): print('Nämnaren får inte vara noll!') elif nämnare < -10 or nämnare > 10: print('Nämnaren måste vara mellan -10 ... 10') else: print('{0:^4}'.format(täljare)) print('---- = {}'.format(täljare / nämnare)) print('{0:^4}'.format(nämnare))

Exempelkörning:

Ange täljare: 123 Ange nämnare: 20 Nämnaren måste vara mellan -10 ... 10

c)

# bråkfråga.py täljare = int(input('Ange täljare: ')) nämnare = int(input('Ange nämnare: ')) if not (nämnare < 0 or nämnare > 0): print('Nämnaren får inte vara noll!') elif nämnare < -10 or nämnare > 10: print(' Nämnaren måste vara mellan -10 ... 10') elif not (täljare < -12 or täljare > 17): print('Täljaren måste vara utanför -12... 17') else:

Page 82: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 80

print('{0:^4}'.format(täljare)) print('---- = {}'.format(täljare / nämnare)) print('{0:^4}'.format(nämnare))

Exempelkörning:

Ange täljare: 5 Ange nämnare: 5 Täljaren måste vara utanför -12... 17

8.11. Logiska fel i frågesatser

Kanske går ditt program att köra, men fungerar inte som avsett. Det finns fel som Python inte kan hitta, nämligen de logiska tankevurpor som bara en människa kan åstadkomma.

Här har du ett litet program som avgör om klockan ska ställas efter sommartid eller vin-tertid. Sommartiden börjar den 25 mars och slutar den 28 oktober. Användaren börjar med att prova med Fettisdagen, som i exemplet inföll den 13 februari. Det är dag 44 och sommartiden börjar inte förrän dag 84. Den ska ju uppenbarligen vara vintertid, men pro-grammet säger ändå sommartid. Något är fel.

Välj Run > Debug current script (nicer) och tryck F7 tills avlusaren börjar analysera if-satsen på rad 6.

Det verkar ju logiskt. Om dagnumret man vill undersöka är större än dag 84 eller mindre än dag 301 anser programmet att det är sommartid. Dag 44 är klart mindre än 84.

Nästa tryck på F7 går vidare och avlusaren ställer den första frågan: Är dag 44 större än dag 84. Nej.

Page 83: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FRÅGESATSER

RÄKNA MED PYTHON 81

Resultatet blir ett blått False. Avlusaren frågar om 44 är mindre än 301. Det är det inte.

Resultatet blir blått True.

Svaret på hela if-satsen är False or True och om så gäller alltid True. Med operatorn or behöver bara en av sidorna vara True för att hela uttrycket ska anses vara True. Satsen efter if-satsen kommer alltid att köras och programmet kommer alltid att anse att det är sommartid.

Så hur ska programmet ändras?

Byt ut operatorn or mot and. Om and får välja i samma situation som ovan gäller alltid False, eftersom båda sidorna måste vara True för att hela uttrycket ska anses vara True. Då skulle programmet ha gjort rätt.

8.12. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 84: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 82

9. Listor

En lista är en behållare för flera variabler som samlats under samma namn, till exempel resultat från en tävling eller prisut-vecklingen på mjölkchoklad, där värdena behöver behandlas på olika sätt, visas, adderas, sorteras, läggas till, tas bort osv.

Det är betydligt bekvämare att räkna och hantera en lista med hundra befolkningstal, än att hantera etthundra variabler var för sig, och dessutom behöva hitta på unika namn åt dem. Om antalet värden kommer uppåt tusen, är listan den enda utvä-gen.

9.1. Listans uppbyggnad

En lista är en namngiven samling av värden av olika datatyper, som till exempel strängar eller konstanter.

namn = [värde1, värde2, värde3, …]

I likhet med variabler har listor namn och kan lagra värden. Skillnaden är att listor är en behållare med många fack som man kan lagra olika saker i. För att tilldela en lista ett innehåll, omger man värdena med ett par [ ] (hakparenteser). Man refererar de olika facken med hjälp av en siffra, ungefär som en adress, som kallas index. Första facket har adressen 0, sen kommer adress 1 osv.

Varje värde i listan kallas för en post eller listpost, exempelvis ”labrador”. Postens ord-ningsnummer i listan kallas index. Posterna indexeras från noll och uppåt, om man börjar vid listans början. För att få tag i listans första post måste man alltså referera till post noll, som hundraser[0].

Börjar man räkna från slutet av listan, numreras posterna från –1 och nedåt. Man kan till exempel referera till listans sista post som hundraser[–1] och det fina med det är att man inte behöver veta hur lång listan är, om man bara vill ha tag i sista posten.

För att ändra värdet på en post i listan, pekar du ut den och anger det nya värdet.

hundraser[0] = 'retriever'

Page 85: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 83

9.1.1. Prova på Skapa en lista i terminalvyn i Thonny, med hundraserna labrador, schäfer, tax och pudel och kalla den för ”hundraser”.

a) Visa listan. b) Visa listan post för post. c) Visa listan post för post i omvänd ordning. d) Ändra sista posten till ”kooiker” och visa listan.

9.1.2. Lösningsförslag Skapa listan så här

>>> hundraser = ['labrador', 'schäfer', 'tax', 'pudel']

a)

>>> hundraser ['labrador', 'schäfer', 'tax', 'pudel']

b)

>>> hundraser[0] 'labrador' >>> hundraser[1] 'schäfer' >>> hundraser[2] 'tax' >>> hundraser[3] 'pudel'

c)

>>> hundraser[-1] 'pudel' >>> hundraser[-2] 'tax' >>> hundraser[-3] 'schäfer' >>> hundraser[-4] 'labrador'

d)

>>> hundraser[3] = 'kooiker' >>> hundraser ['labrador', 'schäfer', 'tax', 'kooiker']

Notera att du lika gärna kunde ha ändrat index –1, eftersom du skulle ändra sista posten.

9.1.3. Snedsteg Vad händer om du provar hundraser[4]? Det var ju fyra hundraser.

>>> hundraser[4] Traceback (most recent call last): File "<pyshell>", line 1, in <module> IndexError: list index out of range

Page 86: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 84

Då signalerar Python att du försökt hämta en post utanför listan. Kom ihåg att listans index börjar med noll.

9.2. Lägga till och ta bort poster

Det finns fler hundraser än i vår första lista. Du kan lägga till en bulldog på slutet av lis-tan med funktionen append(). Den tar emot ett argument, nämligen ’bulldog’ och skar-var på det i slutet av listan.

>>> hundraser = ['labrador', 'schäfer', 'tax', 'pudel'] >>> hundraser.append('bulldog') >>> hundraser ['labrador', 'schäfer', 'tax', 'pudel', 'bulldog']

Antag att du istället vill ha in en särskild hundras på andra plats i listan, eller på någon annan utvald plats. Det gör du med funktionen insert() som tar emot ett index och pos-ten ’St. Bernhard’.

>>> hundraser.insert(2, 'St. Bernhard') >>> hundraser ['labrador', 'schäfer', 'St. Bernhard', 'tax', 'pudel', 'bulldog']

Det blev en hund för mycket. Du tar bort en hundras någonstans i listan med funktion remove() som tar emot namnet på hundrasen som en parameter och tar bort det. Finns det två likadana raser i listan, försvinner bara den första.

>>> hundraser.remove('tax') >>> hundraser ['labrador', 'schäfer', 'St. Bernhard', 'pudel', 'bulldog']

Det finns två sätt att ta bort en post i listan baserat på dess index. Den första metoden är del (delete) som bara tar bort posten med angivet index. del kan också ta bort en del-mängd poster, med argumenten [startindex:slutindex:steg]. Se vidare avsnittet om del-mängder av lista, på sidan 86.

>>> del hundraser[1] >>> hundraser ['labrador', 'St. Bernhard', 'pudel', 'bulldog']

Om del bara tar bort en post och slänger den, så kommer funktionen pop() att både ta bort den ur listan, och lämna över den till programmet så du kan spara den i en variabel och använda den till något nyttigt, till exempel skriva ut eller använda i någon annan del av programmet.

>>> min_hund = hundraser.pop(2) >>> min_hund 'pudel'

Om du skulle vilja tömma listan helt, oavsett längd, finns en särskild funktion även för detta. Den heter clear(), tar inga argument och används som hundraser.clear().

Page 87: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 85

9.2.1. Prova på a) Skapa en tom lista kallad ”hundnamn”. Lägg till följande namn, ett efter ett, med funktionerna insert() och append(): Fido, Snobben, Trofast, Båtsman, Bitzer, Karo och Lassie. Visa listan.

b) Ta bort delmängden som utgörs av de tre mittersta namnen, med del. Visa listan.

c) Töm slutligen listan på namn, ett efter ett, med funktionerna remove() och pop(). Visa att listan är tom.

9.2.2. Lösningsförslag a)

>>> hundnamn=[] >>> hundnamn.append('Fido') >>> hundnamn.append('Snobben') >>> hundnamn.append('Trofast') >>> hundnamn.append('Lassie') >>> hundnamn.insert(3,'Båtsman') >>> hundnamn.insert(4,'Bitzer') >>> hundnamn.insert(5,'Karo') >>> hundnamn ['Fido', 'Snobben', 'Trofast', 'Båtsman', 'Bitzer', 'Karo', 'Las-sie']

b)

>>> del hundnamn[2:5] >>> hundnamn ['Fido', 'Snobben', 'Karo', 'Lassie']

c)

>>> hundnamn.remove('Fido') >>> hundnamn.remove('Lassie') >>> hundnamn.pop(0) 'Snobben' >>> hundnamn.pop(0) 'Karo' >>> hundnamn []

Fundera på detta: Varför kunde man poppa index 0 två gånger och få olika resultat?

Page 88: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 86

9.3. Delmängd av lista

Labrador som kan bli en delmängd

Sättet att peka ut en delmängd av en lista är att använda operatorn : (kolon). Den gene-rella formen är

hundraser [startindex:slutindex:steg]

För att förenkla, kan man utesluta en eller flera av parametrarna i satsen ovan. Python använder då olika standardvärden.

Antag att du vill ha listans två första poster, alltså de två första hundraserna. Du hade kunna göra det övertydligt genom att ange hundraser[0:2:1], men det finns ett kortare sätt.

>>> hundraser[:2] ['labrador', 'schäfer']

Parametern [:2] tar ut de två första indexen, alltså [0] och [1]. Eftersom parametern startindex inte finns med, antas värdet 0. Parametern steg utelämnas också, vilket ger standardvärdet 1. Tvåan pekar ut alla poster fram till index [2] men inte index [2].

Du kan också vilja ha ut några poster mitt i listan, till exempel posterna 2 och 3 som har index [1] och [2].

>>> hundraser[1:3] ['schäfer', 'tax']

Parametern [1:3] ska tolkas som att man vill ha ut allt från och med posten med index [1] fram till index [3] men inte index [3]. Steglängden är fortfarande standardvärdet 1.

9.3.1. Prova på a) Ta ut varannan hundras ur listan, genom att använda parametern steg. Börja med index [0].

Page 89: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 87

b) Ta ut varannan hundras ur listan, genom att använda parametern steg. Börja med index [1].

c) Ta ut alla hundraser, från index [2] och till listans slut.

9.3.2. Lösningsförslag a)

>>> hundraser[::2] ['labrador', 'tax']

b)

>>> hundraser[1::2] ['schäfer', 'pudel']

c)

>>> hundraser[2:] ['tax', 'pudel']

9.4. Hela listan

Hela listan kan ses som en delmängd av listan. Vill du kopiera hela listan till en annan lista, måste du peka ut alla poster med operatorn [:].

brukshundar = hundraser[:]

Skulle du istället råka skriva

brukshundar = hundraser

så kopieras inte listan, utan brukshundar bara pekar ut listan. Allt du då gör med hundraser kommer att återges i brukshundar och tvärt om.

9.4.1. Prova på a) Kopiera listan hundraser till listan brukshundar. Byt ut tax och pudel mot husky respektive border collie i brukshundar. Skriv ut listorna.

b) Peka ut listan hundraser med listan brukshundar. Byt ut tax och pudel mot husky respektive border collie i brukshundar. Skriv ut listorna.

9.4.2. Lösningsförslag a)

>>> hundraser = ['labrador', 'schäfer', 'tax', 'pudel'] >>> brukshundar = hundraser[:] >>> brukshundar [2] = 'husky' >>> brukshundar [3] = 'border collie' >>> hundraser ['labrador', 'schäfer', 'tax', 'pudel'] >>> brukshundar ['labrador', 'schäfer', 'husky', 'border collie']

Allt du gör med kopian, sker bara med kopian.

Page 90: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 88

b)

>>> hundraser = ['labrador', 'schäfer', 'tax', 'pudel'] >>> brukshundar = hundraser >>> brukshundar [2] = 'husky' >>> brukshundar [3] = 'border collie' >>> hundraser ['labrador', 'schäfer', 'husky', 'border collie'] >>> brukshundar ['labrador', 'schäfer', 'husky', 'border collie']

Allt du gör med pekaren, sker med originalet.

9.5. Gör en lista av en sträng

Det kan vara bekvämt att låta användaren mata in flera saker åt gången, varefter ditt program kan dela upp dem eller visa dem på olika sätt. För att det ska fungera måste an-vändaren mata in de olika värdena separerade med komma, blanksteg eller annat av-gränsningstecken.

Värdet (exempelvis i form av olika ord) som tilldelas variabeln ord i den första satsen, är en enda lång sträng. För att göra enskilda listposter av orden, måste du dela strängen med funktionen split().

>>> ord = 'en fantastisk mening'.split(' ') >>> ord ['en', 'fantastisk', 'mening']

Argumentet till split() ska skrivas inom citationstecken. Ange det tecken du vill använda vid delningen, i detta fall blanksteg.

9.5.1. Prova på Dela upp en sträng med tre siffror som är separerade med komman.

9.5.2. Lösningsförslag >>> tal = '1,2,3'.split(',') >>> tal ['1', '2', '3']

9.5.3. Textlistor a) Skriv ett program lägger in namnen på tio av dina klasskamrater i variablerna namn1, namn2, namn3 osv.

Skriv sedan ut alla namnen.

b) Skriv om programmet så att det tar emot namnen i input-satser och tilldelar inmat-ningen till en och samma listvariabel.

Skriv ut namnen som förut.

c) Skriv ut det första och det sista namnet från både a- och b-uppgiften.

d) Skriv ut de tre första namnen från a- och b-uppgiften. Skriv därefter ut de tre första namnen från b-uppgiften.

e) Skriv ut varannat namn från a- och b-uppgiften.

Page 91: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 89

f) Kalle kommer inrusande från korridoren. Lägg till hans namn i den första variabeln (namn1) med en input-sats utan att tappa bort det namn som redan finns i första varia-beln. Lägg därefter till namnet först i listan, från första variabeln.

Skriv sedan ut alla namnen.

g) Kalle har tröttnat och går ut igen. Ta bort hans namn ur den första variabeln och åter-ställ variablerna som de var tidigare. Återställ även listan.

Skriv sedan ut alla namnen.

h) Sortera namnen i bokstavsordning i variablerna i a-uppgiften och listan i b-uppgiften.

Skriv sedan ut alla namnen.

9.6. Numerisk lista

Listor kan givetvis användas till konstanter och numeriska variabler också.

Du har råkat bli ägare till en låda med träskor och vill göra en del bokföring kring skorna, som hur många det är, vilka skonummer de har och vad de kostar. Börja med att göra lis-tor över storlekar och pris och tilldela dem till variablerna storlek respektive pris.

storlek = [36, 45, 44, 39, 42, 41, 44, 39, 37, 35] pris = [299, 599.99, 27.50, 443, 237.30, 110.25, 780, 880.88, 47.11, 250.50]

Hur många skor är det? Ta reda på det genom att räkna längden på listan med skonum-mer, så här

>>> len(storlek) 10

Men hur många skor av en särskild storlek är det? Du tar reda på hur många 44:or du har genom att skriva:

Page 92: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 90

>>> storlek.count(44) 2

För att ta reda på vad alla skorna kostar tillsammans kan du summera hela prislistan med funktionen sum(), så här

>>> sum(pris) 3675.53

I högen av alla skor måste något par vara det med minst skostorlek. Vilket?

>>> min(storlek) 35

På samma sätt måste finnas ett största par. Ta reda på vilket.

>>> max(storlek) 45

Bokföringsbyrån kräver en lista på skorna sorterade i skonummerordning inför inventer-ingen. Ta reda på det genom att sortera listan.

>>> storlek.sort() >>> storlek [35, 36, 37, 39, 39, 41, 42, 44, 44, 45]

Skatteverket å sin sida kräver en lista på skonumren sorterade i fallande ordning. Vänd alltså på den sorterade listan med funktionen reverse().

>>> storlek.reverse() >>> storlek [45, 44, 44, 42, 41, 39, 39, 37, 36, 35]

9.6.1. Förenklande funktioner Python har en hel mängd förenklande listfunktioner för både numeriska listor och listor med strängar.

Operation Vad den gör sort() Sorterar en lista på olika sätt

reverse() Vänder listan bakfram count() Räknar antalet objekt med ett visst värde sum() Summerar alla numeriska värden i en lista len() Returnerar antalet objekt i listan max() Returnerar största värdet i listan min() Returnerar minsta värdet i listan

En förteckning av alla förenklade funktioner finns i bilagorna på sidan 316.

9.6.2. Prova på a) Sortera en lista med katters namn, i stigande och fallande ordning. Använd följande namn: Maja, Selma, Doris, Smulan och Molly. Visa listorna.

b) Ställ Sveriges tio högsta bergstoppar ovanpå varandra. Hur högt blir det? Bergen har höjderna 2097, 2089, 2076, 2056, 2043, 2010, 2023, 2015, 2005, 2002 meter över havet.

Page 93: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 91

9.6.3. Lösningsförslag a)

>>> kattnamn=['Maja', 'Selma', 'Doris', 'Smulan', 'Molly'] >>> kattnamn.sort() >>> kattnamn ['Doris', 'Maja', 'Molly', 'Selma', 'Smulan']

Baklänges

>>> kattnamn.reverse() >>> kattnamn ['Smulan', 'Selma', 'Molly', 'Maja', 'Doris']

b) Det finns två sätt att lösa uppgiften. I det första fallet får funktionen sum() summera en lista med konstanter.

>>> sum([2097, 2089, 2076, 2056, 2043, 2010, 2023, 2015, 2005, 2002]) 20416

I det andra fallet skapar man först en lista med höjderna och låter sedan sum() ta emot listnamnet. I det fallet skrivs inget ut, utan summan tilldelas variabeln jätteberg, som kan skrivas ut.

>>> höjder=[2097, 2089, 2076, 2056, 2043, 2010, 2023, 2015, 2005, 2002] >>> jätteberg = sum(höjder) >>> jätteberg 20416

9.6.4. Numeriska listor Du spelar ett tärningsspel och gör följande kast:

356512563534351431212434

Kasten måste redovisas för spelledaren på olika sätt, annars får du inte dina säckar med guld, draktänder och sköldar.

a) Lägg in serien med tärningskast i en lista.

b) Tävlingsledaren vill veta antalet ettor.

c) Tävlingsledaren vill också se listan sorterad i fallande ordning.

d) Tävlingsledaren ska nu dela ut säckar med guld. Han kräver att få se summan av vart tredje element i listan, efter att listan sorterats i stigande ordning.

9.7. Statiska listor – tupler

En tuple är en statisk lista där man inte får ändra i ingående poster, eller lägga till och ta bort poster. Skillnaden mot en lista är att man använder parenteser istället för hakparen-teser för att skapa en tuple. I övrigt fungerar den som en lista.

Vad ska man med en lista till som inte får ändras? Om du skriver ett program som inne-håller en lista som inte tillåts ändras i framtiden, kan du hindra detta genom att använda tupler.

Page 94: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 92

>>> TracksLista = ('Kent', 'Madonna', 'Roxette', 'Pet Shop Boys', 'The Ark', 'Håkan Hellström', 'Mando Diao', 'Bryan Adams', 'Green Day', 'Depeche Mode')

Försöker man ändra historien och hävda att sångerskan Arja Saijonmaa låg på första plats får man ett fel.

>>> TracksLista[0] = 'Arja Saijonmaa' Traceback (most recent call last): File "<pyshell>", line 1, in <module> TypeError: 'tuple' object does not support item assignment

Det är omöjligt att ändra innehållet i en tuple under körning. Vill du rätta ändra en post får det ske vid programmeringstillfället, genom att du rättar i programkoden.

9.8. Listor av listor

En lista kan innehålla andra listor och blir då en tvådimensionell lista. Ett exempel på det kan vara om du vill lagra sportresultat, där du lagrar varje idrottare och dennes utmärkel-ser i en inre lista och sedan bygger på med nya inre listor med ytterligare idrottare. De inre listorna åtskiljs med komma.

landslag = [["Stina Nilsson", "Silver, sprint", "Guld, sprintstafett", "Guld, stafett"], ["Frida Karlsson", "Silver, 10 km", "Guld, stafett", "Brons, 30 km"]]

Du pekar ut ett element i listan av listor genom att först nämna det yttre, och därefter det inre indexet.

>>> landslag [0] [3] 'Guld, stafett'

Fundera på vilken ”Guld, stafett” som pekas ut!

Givetvis kan den andra nivån i listan också innehålla listor. Då har du fått en tredimen-sionell lista.

9.9. HFJXF RÅFWJ SQZWN LYAU

Julis Caesar hade problem ungefär år 50 före Kristus. Han hade arméer ute över hela Eu-ropa och behövde ibland få ut strategiska meddelanden till sina trupper. Ett problem var Gallien (Frankrike). Det var långt från Rom och budbärarna med meddelandena kunde bli överfallna på vägen och planerna röjda. Caesar var därför ivrig användare av krypterade texter.

Caesarchiffret är ett sk förskjutningschiffer eller substitutionschiffer där man förskjuter tecknen i klartexten ett antal steg utmed ett alfabet och väljer det tecken man stöter på. Antalet steg som den utgående chiffertexten förskjutits, kallas kryptonyckel. Principen för chiffrering är följande:

Page 95: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 93

Chiffrering innebär att klartexten förskjuts åt höger i listan, medan dechiffrering inne-bär att chiffertexten förskjuts lika långt åt vänster i listan, styrt av kryptonyckeln.

a) Skriv ett program som kan chiffrera och dechiffrera svensk text enligt Caesars metod. Det svenska alfabetet A–Ö ska lagras i en lista.

1. Programmet ska börja med att ta emot kryptonyckeln, ett tal mellan (–28) och +28.

2. Därefter ska det ta emot klartexten, konvertera den till versaler och skala bort alla blanktecken.

3. Därefter förskjuts varje tecken det antal tecken som kryptonyckeln anger utmed listan med alfabetet, tecknet som påträffas i listan matas ut som chiffer, versalt, i grupper om fem tecken med ett blanksteg emellan grupperna. Grupper om fem är praktiskt, för det är lätt att skriva ned.

Du kommer att stöta på ett problem. Om du till exempel anger nyckeln 5 och matar in klartexten ÅÄÖ kommer den att falla utanför högeränden på listan med alfabetet. De tecken som skjuter över listans Ö-ände måste slå runt och börja i A-änden igen. Ett tips är att använda modulus.

Prova programmet genom att börja med nyckeln noll. Då ska chiffret bli klartexten. Prova därefter med nyckeln 1 och skriv klartexten ABC. Chiffret bör bli BCD. Prova sedan med KONSTITUTIONSUTSKOTTETS ORDFÖRANDE med nyckeln 14. Vad blir chiffret?

b) Chiffrera ett antal meddelanden med samma kryptonyckel och skriv ned chiffren på en lapp. Smussla över lappen till en klasskamrat och be denne dechiffrera. Viska under hem-liga former kryptonyckeln i dennes öra.

c) Dechiffrering utan känd nyckel är svårare, men med ett enkelt chiffer som caesarchiff-ret kan brute-force-metoden användas. Till det behövs ett kodknäckarprogram. Skriv ett sådant. Brute-force-metoden går ut på att prova så många kryptonycklar som möjligt på så kort tid som möjligt.

1. Ditt program ska ta emot chiffret och skala bort eventuella blanksteg.

2. Därefter ska samma metod som i uppgift a) användas för dechiffrering, men pro-grammet ska själv prova med alla 57 nycklar från (–28) och +28 i en while-slinga. Pro-grammet ska stega igenom alla 57 nycklarna och visa resultatet dem för alla.

Ett av resultaten måste vara rätt. Du får själv avgöra vilket av de 57 resultaten som är det riktiga.

Page 96: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LISTOR

RÄKNA MED PYTHON 94

Så här bör en del av utskriften se ut.

... 11 KJGKLKJHIULKIUÄHTBLÄ 12 ÄÖKÖOKJLIUYGUIPUITUT 14 TRANSFORMATORSTATION 15 JHDRESXQWZSHBVSDESNR 16 AQWDXKMJTYRCTWEVJUQÖ ...

Be en kamrat om ett chiffer och låt programmet knäcka det. Knäck chiffret i rubriken till denna övning.

d) Caesarchiffret är för enkelt för att kunna används i verkliga situationer. Förändra pro-grammet från a) så att det istället för en lista i alfabetisk ordning, har en lista med alfabe-tet omkastat i slumpmässig ordning. Nu spelar förskjutningen utmed listan ingen roll. Kryptonyckeln är istället själva listan. Gör om uppgift a) enligt denna nya metod.

Att dessutom förskjuta klartexttecknen utmed listan, som i uppgift a) gör inte kod-knäckningen enligt uppgift b) svårare, så länge man har tillgång till listan som utgör nyckeln. Det blir fortfarande 57 möjliga resultat, varav bara ett är det rätta.

9.10. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 97: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 95

10. While-slingor

Slingor (loopar) är precis som frågesatserna ett sätt att ändra programflödet. En slinga är en metod som används i programmering för att upprepa ett programblock tills ett villkor är uppfyllt. Slingor kan utföras på olika sätt, med satserna for eller while. Det som i hu-vudsak skiljer de båda satserna åt är att

While-slingan har ett logiskt uttryck som avgör när slingan ska avslutas

For-slingan löper igenom en sekvens av poster i en lista och utför blocket på var och en av posterna. For-slingor tas upp i ett senare kapitel.

Efter båda typerna av slingor, fortsätter programmet med satserna som följer.

10.1. While-slingans uppbyggnad

while logiskt-uttryck: Block med programsatser

Satsen börjar med nyckelordet while (medan) följt av ett logiskt uttryck och slutar med ett kolon. Det logis-ka uttrycket byggs upp på samma sätt som i frågesat-ser med jämförelseoperatorer och logiska operatorer. Blocket konstrueras på samma sätt som efter en frå-

gesats genom att programsatserna dras in med fyra blanksteg åt höger från den nivå nyckelordet while befinner sig på. Blocket körs om och om tills while-villkoret inte längre gäller. Det är upp till programmeraren att låta blocket förändra en variabel, så att villko-ret till sist inte längre gäller.

Page 98: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 96

10.2. Enkel while-slinga

Personalen i gaten på en flygplats ska se till att rätt antal passagerare har stigit ombord, innan de meddelar piloten att denne kan flyga.

# passagerare.py passagerare = 0 while passagerare < 107: passagerare = passagerare + 1 print ("Passagerare", passagerare, "välkommen ombord") print ("Boarding completed!")

Variabeln passagerare som ska räknas upp i slingan, sätts till noll innan while-satsen börjar. Då är villkoret i while-slingan uppfyllt. Blocket börjar med att öka antalet om-bordstigna passagerare med ett, och fortsätter att öka allt eftersom fler och fler går om-bord. Till sist är planet fyllt med 107 passagerare och gate-personalen meddelar piloten detta.

10.2.1. Övning – ät bullar Det ligger 27 nybakta bullar på en plåt. Du äter upp dem allihop. Skriv ett program som visar numret på den bulle du äter och räknar ned allt eftersom bullarna går åt och till sist skriver ut att plåten är tom.

10.3. Oändliga slingor

Oändliga slingor är sådana som programmet inte kan ta sig ur. Vad händer i exemplet nedan med bockarna Bruse?

# oändlig.py bockar = 0 while bockar < 3: print(bockar, "bock trampar över trollets bro")

Slingan är syntaktiskt helt rätt och kan köras utan felmeddelanden, men programmera-ren har begått ett tankefel.

Programmeraren har glömt att räkna upp antalet bockar Bruse. Antalet kommer alltid att vara noll, alltså mindre än tre, och slingan tar aldrig slut.

0 bock trampar över trollets bro 0 bock trampar över trollets bro 0 bock trampar över trollets bro 0 bock trampar över trollets bro 0 bock trampar över trollets bro i evighet

Tryck på stoppknappen eller välj Run > Interrupt/Reset.

Ibland kan man vilja ha en oändlig slinga, till exempel om man skriver ett program där användaren måste avbryta körningen genom att mata in ett bestämt tecken, eller ett spel som aldrig ska ta slut. Se vidare avsnittet om continue och break, nedan.

Page 99: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 97

10.3.1. Åtgärda oändlig slinga Ingen tycker om oändliga slingor. Det finns inga noll bockar. Åtgärda programmet så att bara tre bockar Bruse trampar över bron, varefter progrmmet förklarar att trollet vann.

10.4. Continue och break

Slingorna fortsätter att gå runt tills ett villkor är uppfyllt eller listan med poster är slut, men de kan vid behov avbrytas på annat sätt.

De båda nyckelorden continue och break bryter slingor på var sitt sätt. Nyckelorden kan inte förekomma utanför slingor.

10.4.1. Break Skulle körningen stöta på nyckelordet break kommer slingan att avslutas ovillkorligt.

Slingan i följande program börjar med while True. Det verkar väl misstänkt? True kommer alltid att vara True, så slingan kommer aldrig att avslutas om inte programmet tvingar den att avslutas på annat sätt.

# meny.py while True: print("") print("Meny".center(20, "-")) print("Avsluta program med 'A'") val = input("Välj ") if val.upper() == 'A': break

I detta korta program får användaren valet att avsluta programmet, alltså slingan, genom att mata in bokstaven A. If-satsen undersöker om den versala va-rianten av det inmatade tecknet är lika med A och om så, stöter programmet på break och slingan avslutas. Så gör man för att både a och A ska vara giltiga, ef-tersom man inte vet vilken variant an-vändaren kommer att mata in.

Page 100: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 98

10.4.2. Prova på Skriv ett program som testar om ett tal är ett primtal. Ett primtal är ett naturligt tal som är större än 1 och kan bara delas jämnt med sig självt och talet 1.

10.4.3. Lösningsförslag # testa_primtal.py # Be användaren om ett tal angivet_tal = int(input("Mata in ett tal: ")) testtal = 2 # Flagga som markerar om talet är ett primtal primtal = True # Slingan löper mellan 2...angivet_tal-1 # (pga villkoret med mindre än) while testtal < angivet_tal: # Använd operatorn modulus för att testa om talet # är jämnt delbart if angivet_tal % testtal == 0: primtal = False break # Räkna upp testtalet testtal += 1 # Meddela användaren resultatet. if primtal: print("{0} är ett primtal".format(angivet_tal)) else: print("{0} är inte ett primtal".format(angivet_tal))

10.4.4. Continue Programmet har nu utökats med ytterligare ett menyalternativ, som frågar om vilken multiplikationstabell användaren vill bli förhörd på. Men tabellnumren får inte vara orim-liga. Det hanteras också i programmet.

# meny.py while True: print("") print("Meny".center(20, "-")) print("Vilken tabell vill du bli förhörd på (1-10)") print("Avsluta program med 'A'") val = input("Välj ") if val.upper() == 'A': break tabell = int(val) if tabell < 1 or tabell > 10: print("Den tabellen behöver vi inte öva på!") continue fråga = "Vad är " + str(tabell) + " gånger 7? " print(fråga)

Page 101: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 99

Om rimlighetskontrollen löser ut genom att användaren bett om att bli förhörd på en mul-tiplikationstabell mindre än 1 eller större än 10, stöter körningen på ett continue och slingan börjar om från början. Satsen tabell = int(val) finns med eftersom allt inmatat data alltid är en sträng, men om frågesatsen ska kunna fråga om det valda talet ligger mellan 1 och 10 behöver den en siffra. Då måste det in-matade valet omvandlas till ett tal med int(). Läs mer om input-satsen på sidan 57.

10.4.5. Prova på a) Mata in programmet ovan i Thonny och provkör genom att först välja ett A och se att det avslutas. Nollans tabell är alldeles för enkel. Mata in en nolla och se att du får utskrif-ten ”Den tabellen behöver vi inte öva på!”. Mata sedan in B och se vad som händer.

b) Åtgärda programmet för att ta hand om problemet man får om användaren matar in ett B eller någon annan bokstav. Lägg in en sats som testar om strängen innehåller en siffra och i så fall släpper körningen vidare, eller kör om slingan med ett continue.

10.4.6. Lösningsförslag a)

>>> %Run meny.py --------Meny-------- Vilken tabell vill du bli förhörd på (1-10) Avsluta program med 'A' Välj a >>> %Run meny.py --------Meny-------- Vilken tabell vill du bli förhörd på (1-10) Avsluta program med 'A' Välj 0 Den tabellen behöver vi inte öva på! --------Meny-------- Vilken tabell vill du bli förhörd på (1-10) Avsluta program med 'A' Välj b Traceback (most recent call last): File "/home/RmP/meny.py", line 11, in <module> tabell = int(val) ValueError: invalid literal for int() with base 10: 'b'

Page 102: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 100

b) Programmet kan korrigeras på följande sätt.

... if val.upper() == 'A': break if val.isnumeric() == False: print("Ogiltigt val") continue tabell = int(val) if tabell < 1 or tabell > 10: ...

Här visas bara programsatserna ikring det som ändrats. Resten har lämnats som förut.

Funktionen isnumeric() frågar om det inmatade tecknet är numeriskt, eller snarare om det inte är numeriskt, eftersom den påföljande frågesatsen förväntar sig ett numeriskt värde. Om isnumeric() ger ett falskt svar, skrivs felutskriften ”Ogiltigt val” ut och sling-an börjar om från början.

10.5. Slinga med lista

En lista är ett bra ställe att förvara olika värden. En while-slinga kan användas för att plocka ut det ena värdet efter det andra, för vidare behandling. Eftersom slingan styrs av en variabel som kan räknas upp eller ned tills den stöter på ett gränsvärde, är slingor ett utmärkt sätt att stega sig igenom listor. Listans poster pekas ut av ett numeriskt index och där kommer slingräknaren in väldigt behändigt. Det går lika bra att stega igenom listan framifrån som bakifrån, genom att öka respektive minska räknaren.

Page 103: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 101

Tänk dig till exempel en lista med solsystemets inre planeter.

# planet_utskrift.py planeterna = ["Merkurius", "Venus", "Jorden", "Mars"] i = 0 while i < len(planeterna): print("planeterna[", i, "] = ", planeterna[i]) i += 1

När du kör programmet ser det ut så här:

planeterna[ 0 ] = Merkurius planeterna[ 1 ] = Venus planeterna[ 2 ] = Jorden planeterna[ 3 ] = Mars

10.5.1. Behandla tal i en lista Gör följande tallista.

tal = [2019, 4711, 23, 42, -7, 256, 19.3, 0.01, 16, -32]

a) Summera alla tal i listan och presentera resultatet.

b) Subtrahera alla tal i listan från listans första post.

c) Multiplicera alla tal i listan.

d) Dividera alla tal i listan, med början med listans första post som täljare och andra post som nämnare och därefter resultatet av den första divisionen som täljare till nästa divi-sion.

10.5.2. Lappliselogik a) Du jobbar på kommunens trafikkontor och ska skriva ett program för att med hjälp av en meny registrera felparkerare på gator och torg. På kvällen kommer listorna från lappli-sorna in och då ska du registrera alla nya förseelser, med bilens registreringsnummer och den gata där den stod felaktigt uppställd, samt ett godtyckligt bötesbelopp (förslagsvis 600 kronor). Tips: skapa ett menyalternativ som automatiskt gör ett register med tio felparke-rare.

b) Programmet ska kunna skriva ut hela listan, snyggt formaterad. Se också till så att programmet hanterar felaktiga menyval.

c) Utöka programmet så att det kan ta hand om överklaganden. En felparkerare kan tycka att böterna är felaktiga och du måste då kunna ta bort dennes registreringsnummer ur listan. Du kan välja om överklagandet ska godkännas och då ta bort registreringen, eller avslå begäran. Då ska bötesbeloppet automatiskt fördubblas.

d) Utöka programmet så att du kan registrera när böterna är betalda. Det ska kunna skriva ut en lista med alla bilar där böterna är betalda, hur mycket som betalts, och sum-mera detta så att kommunens ekonomer kan räkna in det i kommunens budget.

10.5.3. Spellistor a) Du jobbar på radiostationen Dunkdunk Energy och har hand om spellistorna. Det är måndag och du har just fått en ny spellista som ser ut så här.

John Lundvik, Ed Sheeran, Luis Fonsi, Margaret, Kamferdrops, Chris Kläfford, Imagine Dragons, Icona Pop och Enrique Iglesias.

Page 104: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 102

Plötsligt kommer en svettig budbärare in i studion och berättar att det nya stjärnskottet, rappartisten Johann Sebastian Bach som dök upp på festivalen i Cannes har blivit oerhört populär på kontinenten och hans låtar bara måste in i listan, för folk skriker efter dem. Du blir tvungen att lägga in hans namn på varannan plats i listan.

b) Det har blivit tisdag morgon och du ska just skicka ut dagens spellista till diskjockisar-na. Du har legat orolig hela natten för det där meddelandet du fick på Skunkagram om att den där nya artisten J S Bach inte är så het längre. Du kan helt enkelt inte skämma ut Dunkdunk Energy genom att fortsätta spela hans dammiga tracks. Du beslutar att alla hans låtar ska bytas ut mot den ny-nya stjärnskottet Georg Friedrich Händel eftersom hans rockoperor nu är superheta. Han vann Golden Hammer vid House-festivalen i Glas-tonbury förra veckan.

c) Dunkdunk Energy har fått en ny sponsor: A-Försäkringar AB. För att ni ska få må-nadslön kräver de att artister som börjar på A måste in på varannan plats i spellistan, istället för det gamla dammiga som redan fanns där. Låt således rockoperastjärnan GF Händels alla låtar vara kvar men skapa en ny lista med artister som börjar på A och ersätt de övriga låtarna.

Lynn Anderson, ABBA, AC/DC, Tim Armstrong, The Avengers, Avici, Andrews Sisters, The Ark och A-ha.

10.6. Kapslade while-slingor

Man kan ha while-slingor inuti block som hör till while-slingor (nested loops) som i detta exempel med skidmedaljörer. Då kommer den yttre slingan att påbörjas och därefter läm-na över kontrollen tll den inre, som kommer att köras klart och därefter lämna tillbaka kontrollen till den yttre, osv, tills den yttre också är klar. Det är ett utmärkt sätt att arbe-ta sig igenom listor inuti listor.

Följande program visar hur man använder en slinga inuti en slinga för att skriva ut alla svenska medaljörer i Skid-VM 2019 på ett snyggt sätt, om medljörerna och deras medaljer lagras i en lista av listor.

Page 105: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 103

# skid-VM.py landslag = [["Stina Nilsson", "Silver, sprint", "Guld, sprintstafett", "Guld, stafett"], ["Frida Karlsson", "Silver, 10 km", "Guld, stafett", "Brons, 30 km"], ["Maja Dahlqvist", "Guld, sprintstafett"], ["Charlotte Kalla", "Guld, stafett"], ["Ebba Andersson", "Guld, stafett"] ] print ("Sveriges damlandslag tog medaljer i Skid-VM "\ "2019 i Seefeld") # Initiering i = 0 # Yttre while-slinga while i < len(landslag): print() print (landslag[i][0]) # initiering j = 1 # inre while-slinga while j < len(landslag[i]): print ("+", landslag[i][j]) j = j + 1 i = i + 1

Indexering av listor inuti listor tas upp i avsnitt 9.8.

Så här ser det ut när programmet körs.

>>> %Run skid-VM.py Sveriges damlandslag tog medaljer i Skid-VM 2019 i Seefeld Stina Nilsson + Silver, sprint + Guld, sprintstafett + Guld, stafett Frida Karlsson + Silver, 10 km + Guld, stafett + Brons, 30 km Maja Dahlqvist + Guld, sprintstafett Charlotte Kalla + Guld, stafett Ebba Andersson + Guld, stafett

Page 106: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

WHILE-SLINGOR

RÄKNA MED PYTHON 104

10.6.1. Mönster a) Skriv ett program som innehåller slingor som matar ut en kub av asterisker, så här.

*** *** ***

Du får inte fuska med tre enkla print-satser utan varje asterisk ska matas ut som ett steg i en while-slinga. Det finns en lurighet med detta. Det får inte finnas tomrader mellan ra-derna med asterisker! Snegla på avsnitt 7.3.

b) Skriv ett program som innehåller slingor som matar ut en triangel av asterisker, så här.

* ** *** **** *****

c) Skriv ett program som innehåller slingor som matar ut en pyramid av asterisker, så här.

* *** ***** ******* *********

d) På natten, när turisterna sover, vänder sig pyramiderna i Gizeh upp och ned. Skriv ett program som visar en sådan uppochnedvänd pyramid.

********* ******* ***** *** *

e) Som du vet finns det tre pyranmider i Gizeh. Avsluta med att göra ett program som skriver ut tre pyramider upp och ned.

10.7. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 107: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

DICTIONARIES

RÄKNA MED PYTHON 105

11. Dictionaries

Värden lagras sällan för sig själva. Databehandling syftar till att skapa sammanhang. Det är så data blir till information. I Python kopplar man ihop mindre delar av data till större sammanhang med hjälp av dictionaries. Ett dictionary kan ses som ett uppslags-verk, där sammanhanget kommer ur ett uppslagsord. Vet man uppslagsordet, kan man finna tillhörande information. Och vet man inte uppslagsordet kan man, precis som i ett uppslagsverk, söka fram det.

I dictionaries kan du lagra nästintill oändligt många värden. Du kan även lagra listor i ett dictionary, dictionaries i dictionaries och dictionaries i listor. Allt detta kommer vi att gå igenom i följande avsnitt.

11.1. Dictionaryts uppbyggnad

Dictionaryt liknar en lista på flera sätt. Det har ett namn, men dictionaryts innehåll om-ges av klamrar { } istället för listans hakparenteser [ ]. Istället för enskilda värden lagrar dictionaryt datapar. Dataparet består av en nyckel (ett uppslagsord) och ett värde.

dictionarynamn = {nyckel1 : värde1, nyckel2 : värde2}

Nyckeln kan vara en textsträng eller en numerisk konstant, följt av ett kolon och ett vär-de, som kan vara av olika datatyper, som en textsträng, en konstant, en lista osv. Datapa-ren åtskiljs med kommatecken.

Listans poster numreras med ett index, men i dictionaryt har indexet ersatts av nyckeln som kan vara ett namn, en siffra eller annat nyckelvärde.

11.2. Enkla dictionaries

>>> wonder_woman = {'namn':'Wonder Woman', 'speltid':141} >>> harry_potter = {'namn':'Harry Potter', 'speltid':130}

Satserna ovan består av två dictionaries med filmer, som beskriver filmernas namn och speltider.

Att hämta ett värde från ett dictionary är väldigt lätt. Du frågar helt enkelt efter det vär-de som hör till nyckeln genom att ange dictionaryts namn följt av nyckeln inom hakparan-tes.

>>> harry_potter['namn'] 'Harry Potter' >>> harry_potter['speltid'] 130

Vidare kan du ta reda på vilka nycklar du har i en post i dictionaryt genom att fråga efter dem med funktionen keys().

>>> harry_potter.keys() dict_keys(['namn', 'speltid'])

Du kan också visa postens värden, med funktionen values().

Page 108: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

DICTIONARIES

RÄKNA MED PYTHON 106

>>> harry_potter.values() dict_values(['Harry Potter', 130])

11.2.1. Prova på a) Skriv ett program som frågar användaren efter information om filmers namn och spel-tid och lagrar det i ett dictionary och visar den.

11.2.2. Lösningsförslag a)

# dictionary_filmnamn.py titel = input('Vad heter filmen? ') tid = int(input('Hur lång är filmen? ')) film = {'namn': titel, 'speltid': tid} print(film)

Körningen ser ut så här.

>>> %Run dictionary_filmnamn.py Vad heter filmen? star wars Hur lång är filmen? 152 {'namn': 'star wars', 'speltid': 152}

11.2.3. Favoritmat Anna vill registrera vilken favoritmat olika personer i klassen har. Klassen består av to-talt 6 personer som alla får svara på frågorna.

a) Skapa ett tomt dictonary som du fyller med namnet på personen som svarar och dennes favoritmat. Namnet ska vara nyckel och favoriträtten ska vara värde.

När alla svarat, ska programmet skriva ut namnen på personerna och deras favoritmat. Utskriften kanske inte blir i den ordning alla matade in sina namn, eftersom dictonaries inte har någon ordning.

b) Skriv ut en lista med enbart de svarandes namn, med funktionen keys().

c) Skriv ut en lista på alla maträtter med funktionen values().

Page 109: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

DICTIONARIES

RÄKNA MED PYTHON 107

11.3. Olika sätt att modifiera ett dictionary

Lägg till filmens regissör i filmposten. Det sker utan någon tilläggsfunktion.

>>> harry_potter['regissör'] = 'David Yates' >>> harry_potter {'namn': 'Harry Potter', 'speltid': 130, 'regissör': 'David Yates'}

Du tar bort ett värde som pekas ut av en nyckel med nyckelordet del.

>>> del harry_potter['regissör'] >>> harry_potter {'namn': 'Harry Potter', 'speltid': 130}

Så kom det en ny Harry Potter-film, nämligen ”Harry Potter och dödsrelikerna” och då måste filmtiteln uppdateras.

>>> harry_potter['namn'] = 'Harry Potter och dödsrelikerna' >>> harry_potter {'namn':'Harry Potter och dödsrelikerna','speltid': 130}

Det går även bra att skapa ett tomt dictionary och lägga till värden senare. Gör så här:

>>> star_wars = {}

11.3.1. Prova på a) Uppdatera ditt tidigare program så att det lägger in inmatade värden direkt i ett dic-tionary.

11.3.2. Lösningsförslag a)

# dictionary_filmnamn.py film = {} film['namn'] = input('Vad heter filmen? ') film['speltid'] = int(input('Hur lång är filmen? ')) print('Titel:', film ['namn'].capitalize()) print('Speltid:', film ['speltid'])

Först skapas det tomma dictionaryt film. Den första input-satsen ber om en filmtitel och strängen med titel hamnar direkt i nyckeln film['namn']. Därefter tillfrågas användaren om speltiden, och strängen görs om till ett heltal och läggs in i värdet speltid. Vid utskrif-ten ser man till att filmtiteln alltid börjar med versal, med funktionen capitalize().

>>> %Run dictionary_filmnamn.py Vad heter filmen? star wars Hur lång är filmen? 207 Titel: Star wars Speltid: 207

Page 110: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

DICTIONARIES

RÄKNA MED PYTHON 108

11.4. Dictionary som lista

Samuel Morse uppfann sitt berömda telegrafalfabet 1838 eftersom telegrafledningar hade börjat bli vanliga i USA vid den tiden. Telegrafi utförs för hand av en telegrafist med tele-grafnyckel och för att telegrafisten ska få en så enkel uppgift som möjligt, satte Morse samman alfabetet så att det vanligaste tecknet i engelska språket, ett E representerades av en kort teckendel ”dit”, medan det näst vanligaste, T representeras av en lång tecken-del ”da”. A är inte så vanligt och fick två teckendelar, ”dit da”. N kom därnäst och blev ”da dit” och så vidare. Du känner säkert igen dit-dit-dit da da da dit-dit-dit (SOS)? Bilden visar en enkel, men fullt fungerande telegrafnyckel som du själv kan bygga och använda för att sända morsetecken. Det får du göra i fortsättningsboken Digitalslöjd.

En översättare mellan bokstäverna i alfabetet och morsetecknen kan utföras med ett dic-tionary. I dictionaryt har teckendelen ”dit” bytts ut mot en punkt ( . ) och ”da” mot ett understrykningstecken ( _ ).

# morsekod.py text_till_morse = {'A':'. _','B':'_ . . .','C':'_ . _ .', 'D':'_ . .','E':'.','F':'. . _ .', 'G':'_ _ .','H':'. . . .','I':'. .', 'J':'. _ _ _','K':'_ . _','L':'. _ . .', 'M':'_ _','N':'_ .','O':'_ _ _', 'P':'. _ _ .','Q':'_ _ . _','R':'. _ .', 'S':'. . .','T':'_','U':'. . _', 'V':'. . . _','W':'. _ _','X':'_ . . _', 'Y':'_ . _ _','Z':'_ _ . .'} # Fråga användaren om tecken tecken = input ('Bokstav att konvertera? ').upper() print (tecken, 'översatt till morsekod blir', text_till_morse[tecken])

Programmet börjar med att definiera ett dictionary med alfabetiska tecken som nycklar, översatta till morsetecken som värden. Därefter frågas användaren om ett tecken att översätta, vilket görs om till versal och får bli till nyckel och peka ut en post i dictionaryt. Postens värde skrivs slutligen ut.

Page 111: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

DICTIONARIES

RÄKNA MED PYTHON 109

11.4.1. Multipla dictionaries

När Buzz Aldrin åkte till Månen med Apollo 11 år 1969 gick han omkring och plockade på sig ett antal stenar av olika vikt och färg. När han kom tillbaka till Jorden presenterade han sin reseräkning för NASA, men en regeringskommitté trodde inte på att han varit på Månen och ville inte betala ut reseräkningen. Inför kommittén tömde Aldrin fickorna på rymddräkten, men det övertygade inte kommitténs medlemmar. Istället ville de ha ste-narna presenterade i olika typer av listor.

Aldrins team på NASA skapade ett dictionary med alla stenar och deras egenskaper. Varje sten har en identitet i form av ett femsiffrigt tal, en vikt i gram, en färg och en bergart. Tabellen blev så här.

Identitet Vikt (gram) Färg Mineral 50023 19,9 grön olivin 50092 282 grå granit 50103 27,7 svart basalt 50003 10,3 grå granit 50095 348,2 röd järnmalm 50207 7,7 ljusgrå basalt 50072 123,7 svart titanmalm

a) Skapa ett dictionary som beskriver första raden i tabellen ovan, där kolumnrubrikerna ska vara nycklar för värdena.

b) Lägg in ditt ditionary i en lista, skapa övriga tabellrader som dicitonaryn och lägg dem i listan.

c) Skriv ut hela listan och visa för kommittén.

Det blev inte så vackert. Kommitténs medlemmar skakar på huvudena.

Page 112: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

DICTIONARIES

RÄKNA MED PYTHON 110

d) Skriv ett program som medger att kommittén själva kan välja sten i listan, genom att ange radnummer. Exempelkörning:

Ange sten du vill undersöka (0-6):

e) Det blev för svårt för kommittén. Utöka programmet så att du kan välja sten och däref-ter välja exakt vilken egenskap du vill se. Exempelkörning:

Ange sten du vill undersöka (0-6): 1 Ange vilken egenskap du vill se (identitet, färg, mineral eller vikt): mineral granit

f) Kommittén ber ändå att få se på månstenarna. En grånad kommittémedlem lyfter på en sten, slår i listan och skakar på huvudet. Han tror inte alls på det där så kallade bevi-set. Stenen är för tung. Houston, we have a problem!

Det går upp för Buzz Aldrin att han angivit stenarnas vikt på Månen, där gravitationen bara är en sjättedel av den på Jorden. Efter ett pressat möte på NASA, visar man reger-ingskommittén ett uppdaterat program. På grund av den hårda tidspressen hann NASA inte ändra i kolumnen vikt, utan gjorde en annan lösning där viktkolumnen multiplicera-des med 6 och lades in som ett nytt datapar med jordvikt som nyckel och den justerade vikten som värde.

Jordvikten ska beräknas separat, efter att dictionaryna skapats och lagts in listan.

Buzz Aldrin fick slutligen sin reseräkning utbetald.

11.5. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 113: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 111

12. For-slingor

For-slingor (for-loopar) kan användas för att löpa igenom och behandla posterna i olika typer av listor. Eftersom exempelvis ett dictionary inte har ett numeriskt index utan base-ras på nycklar, måste man ha ett sätt att räkna sig igenom nycklarna utan att känna till deras värden, ungefär som ”Jag bryr mig inte om vad den heter – ge mig bara nästa post”.

12.1. For-slingans uppbyggnad

for post in lista_med_poster: Block med programsatser

Satsen börjar med nyckelordet for (för alla följande) följt av en konstruktion som tar den första posten i lista_med_poster som pekas ut av in och lagrar i variabeln post. Sedan följer sedvanligt kolon och ett block med programsatser. När blocket med program-

satser har körts första gången, tilldelas variabeln post andra posten i listan med poster och så forstsätter slingan tills alla poster i listan har gåtts igenom. Listan kan vara både numerisk, strängar, dictionaries och tupler.

12.2. Enkel for-slinga

Tänk dig ett program som ska diska. Det kan se ut så här

# diskad.py for sak in ['djuptallrik', 'sked']: print("Droppa diskmedel på", sak) print("Skrubba", sak) print("Skölj", sak) print("Torka", sak, "\n") print("Jag är färdig")

Page 114: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 112

For-slingans argument anger att programmet ska diska två saker, en tallrik och en sked. For-slingan gör om diskningen tills listan med saker som ska diskas är genomlöpt. Är dis-ken inte färdig, droppas diskmedel på och saken skrubbas, sköljs och torkas. När pro-grammet diskat skeden är listan med disk slut. Slingan avslutas och programmet medde-lar att det diskat färdigt.

12.2.1. Prova på Funktionen isupper() undersöker om alla tecken i en sträng är versaler. Använd den till att söka igenom en sträng och undersöka om något av tecken är versalt.

12.2.2. Lösningsförslag >>> for tecken in "Diskmedel": if tecken.isupper() == True: print("Bokstaven ", tecken, " är versal") Bokstaven D är versal

12.2.3. Övning på enkel for-slinga For-slingor är ett bra sätt att ta sig igenom listor.

a) Utöka programmet i prova-på-uppgiften ovan så att det räknar alla versaler och geme-ner i varsin variabel och presentera svaret.

b) Allmänna Svenska Primtalsaktiebolaget AB skickade 25 primtal till en underleverantör i Kina för att få dem polerade, men de försvann på posten. Nu måste du skapa nya prim-tal. Gör ett program som skriver ut en lista med de första 25 primtalen. Ett primtal är ett naturligt tal som är större än 1 och kan bara delas jämnt med sig självt och talet 1.

c) Efter en brainstorming i ledningsgruppen på ASPA kom man fram till att företaget behövde nya proukter. Konstruktionskontoret fick i uppgift att konstruera ett nytt fakul-tetsverk. De första exemplaren fick ganska dålig ytfinish och fick skickas till Singapore för polering. Skriv ett program som räknr ut och skriver ut de 10 första fakulteterna.

Fakulteten är lika med produkten av alla heltal från 1 upp till och med talet självt. Fakul-teten av 3 kallas 3-fakultet, skrivs 3! och beräknas som: 1 * 2 * 3 = 6.

12.3. Skapa en lista med range

Ibland kan det vara praktiskt att automatiskt kunna skapa en tallista med heltal, som exempelvis går mellan 1 och 10. Det går att skriva för hand, men det är enklare att låta Python göra det med funktionen range() (område).

Därefter kan man låta en for-slinga arbeta sig igenom listan från 1 till 10 och använda talen i listan till något nyttigt.

range() finns i två varianter, range(slutvärde) och range(startvärde, slutvärde[, steg]). Om steg inte anges, blir standardvärdet 1.

range(10)

Om inget annat sägs, börjar listan med noll och går till ett steg innan slutvärdet. Satsen ovan skapar alltså en lista med alla tal från 0 till 9.

range(7, 17)

Page 115: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 113

Satsen skapar en lista med alla tal från 7 till 16.

range(10, 3, -1)

Negativa steg är tillåtna. Satsen skapar en lista med tal från 10 till 4.

12.3.1. Range i praktiken För en skoluppgift behöver du skapa 7:ans multiplikationstabell. Börja med att definiera en range() som skapar tallistan och låt därefter blocket som slingan kör, multiplicera talet med 7 och skriva ut tabellen.

# range.py faktorlista = range(1, 11) for faktor in faktorlista: produkt = 7 * faktor resultat = "Vad är {0} * {1:>2}? {2:>2}"\ .format(7, faktor, produkt) print(resultat)

Resultatet blir

>>> %Run range.py Vad är 7 * 1? 7 Vad är 7 * 2? 14 Vad är 7 * 3? 21 Vad är 7 * 4? 28 Vad är 7 * 5? 35 Vad är 7 * 6? 42 Vad är 7 * 7? 49 Vad är 7 * 8? 56 Vad är 7 * 9? 63 Vad är 7 * 10? 70

Läraren kommer med nya krav och vill istället att multiplikationstabellen ska skrivas ut baklänges. Det görs genom att man låter range() skapa en lista i fallande ordning. Det kräver att argumentlistan börjar med ett högre startvärde, slutar med ett lägre slutvärde och steget sätts till –1.

# range-baklänges.py faktorlista = range(10, 0, -1) for faktor in faktorlista: produkt = 7 * faktor resultat = "Vad är {0} * {1:>2}? {2:>2}"\ .format(7, faktor, produkt) print(resultat)

med följande resultat

>>> %Run 'range-baklänges.py' Vad är 7 * 10? 70 Vad är 7 * 9? 63 Vad är 7 * 8? 56 Vad är 7 * 7? 49 Vad är 7 * 6? 42 Vad är 7 * 5? 35 Vad är 7 * 4? 28

Page 116: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 114

Vad är 7 * 3? 21 Vad är 7 * 2? 14 Vad är 7 * 1? 7

12.3.2. Prova på a) Gör en lista med udda tal som börjar på 9 och slutar på 17. Visa listan.

b) Mata in programmet i avsnitt 12.3.1, kalla det för range.py och modifiera det så att det frågar användaren vilken multiplikationstabell som ska skrivas ut. Resultatet bör se ut så här.

Ange multiplikationstabell (1-10) 3 Vad är 3 * 1? 3 Vad är 3 * 2? 6 … Vad är 3 * 9? 27 Vad är 3 * 10? 30

12.3.3. Lösningsförslag a)

>>> udda_tal = list(range(9, 18, 2)) >>> udda_tal [9, 11, 13, 15, 17]

b)

# range.py tabell = int(input("Ange multiplikationstabell (1-10) ")) faktorlista = range(1, 11) for faktor in faktorlista: produkt = tabell * faktor resultat = "Vad är {0} * {1:>2}? {2:>2}"\ .format(tabell, faktor, produkt) print(resultat)

Det bakvända snedstrecket efter {2:>2}"\ har satts in för att få Python att acceptera rad-brytningen. Du behöver inte använda det om du skriver hela satsen på samma rad.

12.3.4. Övning på range() Du jobbar på kommunkontoret och ska producera ett nyhetsbrev om kommunalt vatten och avlopp och adressera det till alla villaägare på Villagatan. Men för att det ska vara lätt för kommunens överansträngda brevbärare, ska en av dem kunna gå längs trottoaren med jämna nummer, och en längs trottoaren med udda nummer och stoppa i brevlådorna.

Skriv ett program som skriver ut adressetiketter med adress Villagatan med jämna num-mer och därefter en ny sats etiketter med bara udda nummer. Villagatan är 27 hus lång.

Page 117: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 115

12.4. Kapslade slingor

Man kan ha slingor inuti block som hör till slingor (nested loops). Det är en utmärkt me-tod om man vill skriva ut den klassiska multiplikationstabellen. En multiplikationstabell sätts samman så här.

1 2 3 4 5 6 7 8 9 10 1 1*1 1*2 1*3 1*4 1*5 1*6 1*7 1*8 1*9 1*10 2 2*1 2*2 2*3 2*4 2*5 2*6 2*7 2*8 2*9 2*10 3 3*1 3*2 3*3 3*4 3*5 3*6 3*7 3*8 3*9 3*10 4 4*1 4*2 4*3 4*4 4*5 4*6 4*7 4*8 4*9 4*10 5 5*1 5*2 5*3 5*4 5*5 5*6 5*7 5*8 5*9 5*10 6 6*1 6*2 6*3 6*4 6*5 6*6 6*7 6*8 6*9 6*10 7 7*1 7*2 7*3 7*4 7*5 7*6 7*7 7*8 7*9 7*10 8 8*1 8*2 8*3 8*4 8*5 8*6 8*7 8*8 8*9 8*10 9 9*1 9*2 9*3 9*4 9*5 9*6 9*7 9*8 9*9 9*10

10 10*1 10*2 10*3 10*4 10*5 10*6 10*7 10*8 10*9 10*10

Man börjar med att skapa rad 1, där värdena sätts samman av faktorerna längs de båda axlar-na, nämligen rad 1 gånger ko-lumn 1, rad 1 gånger kolumn 2 osv och skriver ut första raden. Därefter stegar man till rad två och gör samma sak, denna gång med radnumret 2 (2*1, 2*2, 2*3 osv).

# multiplikationstabell.py # Skapa en range med värdena 1,2,3… 9,10 faktorlista = range(1, 11) # Slinga som ger raderna for radfaktor in faktorlista: # Inre slinga som ger kolumnerna for kolumnfaktor in faktorlista: # Gör beräkningen av produkten för en cell produkt = radfaktor * kolumnfaktor cell = "{0:>4}".format (produkt) print(cell, end = "") # Skapa en radbrytning print("")

Page 118: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 116

Resultatet blir

>>> %Run multiplikationstabell.py 1 2 3 4 5 6 7 8 9 10 2 4 6 8 10 12 14 16 18 20 3 6 9 12 15 18 21 24 27 30 4 8 12 16 20 24 28 32 36 40 5 10 15 20 25 30 35 40 45 50 6 12 18 24 30 36 42 48 54 60 7 14 21 28 35 42 49 56 63 70 8 16 24 32 40 48 56 64 72 80 9 18 27 36 45 54 63 72 81 90 10 20 30 40 50 60 70 80 90 100

Produkten, alltså värdet i tabellerna är produkten av värdena från de båda for-slingorna. Slingorna använder samma faktorlista att stega i, eftersom man vill ha alla multiplika-tionstabeller från 1 till 10 och alla faktorer från 1 till 10.

Det enda speciella med programmet är den långa print-satsen och dess formatering. Sat-sen görs om för varje varv i den inre slingan som kommer att producera värdena 1, 2, 3 … 9, 10, 2, 4, 6 … 18, 20, 3, 6 osv. Om inget annat sägs skulle dessa tal skrivas ut ett och ett på var sin rad, men argumentet end=”” eliminerar detta. end= förklaras närmare på sidan 53. Nästa gång print-satsen körs, fortsätter den på samma rad.

När tio tal är utskrivna tar den inre for-slingan slut och körningen fortsätter i den yttre slingan. Där står en kort print-sats, som bara har till uppgift att bryta raden, med ett print(""), alltså en tom utskrift.

Platshållaren {0:>4} kommer att ta det första och enda argumentet i format-satsen, näm-ligen faktor och skriva ut det på ett utrymme som är fyra tecken brett, och dessutom hö-gerställt i detta utrymme. Det är så man får snygga raka spalter med högerställda tal. Läs mer om format på sidan 54.

12.4.1. Continue och break i kapslade slingor Nyckelorden continue och break hör samman med den slinga de befinner sig i och kan bara bryta just denna slinga. Finns nyckelordet i en kapslad slinga, bryts bara den inre.

Om programmet skulle behöva bryta sig ut helt ur både den inre och yttre slingan blir du tvungen att antingen sätta en flagga i den inre slingan och testa denna i den yttre slingan och bryta med break på det sättet. Alternativt kan du göra sling-paketet till en funktion, där det alltid går att bryta sig ut med nyckelordet return. Mer om funktioner finns på sidan 122.

12.4.2. Prova på a) Fortsätt med att bygga ut menyprogrammet i stycke 10.4 så att det förhör användaren på hela den valda multiplikationstabellen, med hjälp av en inre for-slinga. Tips: Titta på avsnittet om range() på sidan 112.

Page 119: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 117

12.4.3. Lösningsförslag a)

# meny.py while True: print("") print("Meny".center(20, "-")) print("Vilken tabell vill du bli förhörd på (1-10)") print("Avsluta program med 'A'") val = input("Välj ") if val.upper() == 'A': break if val.isnumeric() == False: print("Ogiltigt val") continue tabell = int(val) if tabell < 1 or tabell > 10: print("Den tabellen behöver vi inte öva på!") continue faktorlista = range(1,11) for faktor in faktorlista: produkt = tabell * faktor fråga = "Vad är {0} * {1:>2}? " .format(tabell, faktor) svar = int(input(fråga)) if svar == produkt: print("rätt svar") else: print("fel svar")

12.4.4. Övning a) Kommer du ihåg övningen med stenar från Månen på sidan 109? Skriv ut listan med dictionaryn genom att stega igenom listan med en for-slinga och skriva ut varje nyckel-värde-par i varje dictionary på en egen rad.

b) Istället för att skriva ut varje nyckel-värde-par manuellt, använd en inre for-slinga och skriv ut alla nyckel-värde-par automatiskt. Formatera på ett snyggt sätt.

Page 120: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 118

12.5. Slingor med dictionaries

Denna diskussion är en fortsättning på uppgiften kring morsealfabetet i kapitel 11.4.

Listor och dictionaries används i stort sett på samma sätt i slingor. I följande program används en for-slinga för att stega igenom hela matrisen med morsealfabetet och skriva ut den.

# morsekod2.py text_till_morse = {'A':'. _','B':'_ . . .','C':'_ . _ .', 'D':'_ . .','E':'.','F':'. . _ .', 'G':'_ _ .','H':'. . . .','I':'. .', 'J':'. _ _ _','K':'_ . _','L':'. _ . .', 'M':'_ _','N':'_ .','O':'_ _ _', 'P':'. _ _ .','Q':'_ _ . _','R':'. _ .', 'S':'. . .','T':'_','U':'. . _', 'V':'. . . _','W':'. _ _','X':'_ . . _', 'Y':'_ . _ _', 'Z':'_ _ . .'} # Skriv ut hela alfabetet for tecken, morsetecken in text_till_morse.items(): print(tecken, '=', morsetecken)

For-slingan löper igenom dictionaryt och med hjälp av funktionen items() returneras var-je nyckel-värdepar som en tuple, som tilldelas variablerna tecken och morsetecken.

12.5.1. Språköversättning Har du funderat på hur översättningstjänster på Internet fungerar? Att översätta språk är inte lätt för en dator. Ord är flertydiga och betydelsen beror av sammanhanget. Alla språk har dessutom sin uppsättning dubbeltydigheter. Människan har ett sjätte sinne för att tolka dubbeltydigheter. Det har inte datorer. Därför blir maskinöversatt text ganska lustig ibland.

Skriv den enkla översättartjänsten Trams Translate, som fungerar med hjälp av slingor och dictionaries.

Skapa ett dictionary som innehåller en lista med engelska ord som nycklar och deras översättning till svenska som värden.

Skriv ett program som tar en engelsk text och gör den till svenska genom att välja engelskt nyckelord i dictionaryt.

Vissa nyckeord har många värden, medan andra har få. Värdena ska väljas ut slump-mässigt. Programmet ska själv förstå hur många värden varje nyckelord har och skapa lämpliga slumptal därefter.

Texten ska sättas samman på svenska och skrivas ut.

Alla skiljetecken ska bevaras.

Programmet ska göra tio omförsök.

Det blir extra svåra översättningsproblem när det handlar om känslor. Den engelska tex-ten handlar om en stackars elev som misslyckats på ett prov och känner att världen håller på att rasa samman.

He was moved, and completely broken. After this ordeal he did not want to take any more tests. He felt utterly finished.

Page 121: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 119

Här är beståndsdelarna i dictionaryt i form av nycklar med tillhörande värden. Det kom-mer att bli en väldigt stor definition, för bara denna enkla text. Då förstår du hur stor definition Google Translate har. Och den är inte särskilt bra. Förstår du vilken stor defi-nition du själv har i hjärnan?

after: akter-, aktra, aktre, bakom, efter, efter-, efter det att, efteråt, enligt, sedan, sedermera, senare

and: och, samt

any: valfri, några, någon, alla, något, varje, all, vilken som helst, något, över huvud taget, eventuell

broken: bruten, knäckt, trasig, sönder, sönderslagen, avbruten, söndrig, inriden

completely: helt, fullständigt, fullt, komplett, alldeles

did: anrättade, arrangerade, avtjänade, avverkade, bestyrde, besökte, framställde, företog, gjorde, gjorde i ordning, gjorde inbrott, hade hand om, klarade sig, lurade, löste, mådde, ordnade, räckte, satte på, skaffade, spelade, studerade, tillagade, tillhandahöll, uppförde, utförde, uträttade, var lagom

felt: kände, filt, upplevde, tyckte

finished: slut, dödad, avslutad, ytbehandlad, färdig, försedd med, fulländad, färdiggjord, arbetad

he: han

more: mer, mera, fler, flera, vidare, till, ännu

moved: avyttrad, bevekad, bytt, drog sig, dragen, flyttad, flyttade sig, föreslog, företog sig, förflyttad, för-mådd, gick, hemställd, jämkad, motionerad, ruckad, rullad, ryckt, rörd, sålde bra, transporterad, åtgärdad

not: icke, inte, ej

ordeal: prövning, gudsdom

take: ta, vidta, fatta, fordras, åka med, taga, gripa, antaga, anta, acceptera, forsla, stjäla, komma på, intaga, avdraga, erövra, kräva, köra, fordra, söka, ta till, vidtaga, hålla, ta på sig, övertaga, rymma, ha plats för, äta, dricka, hysa, förstå, följa, skjutsa, leda, föra, skaffa sig, prenumerera på, sampla in, ta in, vinna, få, ta åt sig, göra verkan, ha, förstås, lyda, tro, spela in, mäta upp, undervisa, gå igenom, stå med, fastna, ta eld, nappa, tagande, fångst, tagning, intäkt

tests: tester, prov, prövningar, provkörningar, avprovningar, förhör, prov, provningar, försök, förhör, kon-troll, experiment, övningar

this: denna, detta, den här, det här, det, denne, så här

to: an, att, efter, emot, enligt, för, för att, i, igen, till, intill, jämfört, med, mot, om, per, pro, på, till, vid, åt

utterly: ytterligt, slutligen, totalt, absolut

want: nöd, brist, avsaknad, saknad, behov, önskan, önskade, vilja, ville, önska, begära, söka, sakna, behöva, erfordra, fordra, lida nöd, fattas

was: var

Resultatet blev ganska roligt, eller hur? Google Translate gör det något bättre, genom att dessutom ha en förekomst-variabel på alla värden och välja det ord som är mest troligt. Det gör översättningen något bättre. Ännu bättre blir det om man har en sammanhangs-variabel på alla ord, som pekar till andra ord som brukar höra ihop med detta ord. Då är vi inne på artificiell intelligens.

12.6. Undersök slumptal med slinga

Python har ett bibliotek med funktioner för att skapa slumptal, som heter random. Den enkla slumptalsfunktionen random skapar en enklare typ av slumptal kallade pseudo-slumptal (pseudo random numbers) där man inte kan garantera att samma talserie inte återkommer.

Pseudo är ett ord som kommer från klassisk grekiska och betyder falsk, alltså falska slumptal. Orsaken till att man använder pseudoslumptal är att de är lätta att skapa, efter-som datorer har svårt för riktig slump. Det ligger inte i datorns natur att bete sig oförut-sägbart. Det finns många algoritmer i olika programspråk, bättre eller sämre, som skapar pseudoslumptal. Pythons random är baserad på en matematisk algoritm kallad Mersenne Twister.

Page 122: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 120

I affärstillämpningar har man behov av bättre slumptal. Behöver du sådana, bör du an-vända Pythons funktion secret. Men en helt programbaserad funktion kan aldrig bli per-fekt slumpmässig. Istället måste man använda sig av olika typer av maskinvara (till ex-empel klockan, trafikmönster från nätverkskortet, brus på olika ingångar etc) för att seri-en av slumptal ska bli garanterat olika varje gång man kör ett program som kräver sådana tal.

En slumptalsgenerator startas alltid med ett frö (seed) och väljer du ett nytt frö varje gång du startar om, blir slumptalsserierna olika. Väljer du samma frö, blir slumptalsserierna likadana.

12.6.1. Syntax för random() Syntaxen för att starta slumptalsfunktionen är följande:

random.seed(a = None, version = 2)

Med funktionsanropet random.seed(None, 2) anges fröet som systemklockans tid. Det är en bra metod, eftersom tiden, och därmed fröet ändras hela tiden. Parametern 2 är ver-sionsnumret på slumptalsgeneratorn.

Ändrar du None till en konstant, till exempel 1 anges istället att fröet ska vara 1 varenda gång.

Funktionen random.random() returnerar ett slumptal i intervallet 0,0-1,0 om inget an-nat sägs. Läs mer under rubriken Om funktionen random() på http://huvudrutin.se/index.php/lankar

12.6.2. Prova på Du kan bekanta dig med slumptal med hjälp av ett program. Undersök hur pseudoslump-talens egenskaper ändras med olika frön. Visa talföljden för slumptal med systemklockan som frö och med fröet 1. Slumpa fram 5 tal av varje typ.

12.6.3. Lösningsförslag # slumpkoll.py from random import random, seed # Skapa en lista för att lagra de fem slumptal mellan 0,0 # och 1,0 som genereras i while-slingan. slumptal = [] räknare = 0 seed(None, 2) while räknare < 5: slumptal.append(random()) räknare = räknare + 1 # I denna slinga återställs fröet till generatorn som # skapar serien av slumptal slumptal_med_återställning_av_frö = [] räknare = 0 seed(1, 2) while räknare < 5: slumptal_med_återställning_av_frö.append(random()) räknare = räknare + 1

Page 123: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FOR-SLINGOR

RÄKNA MED PYTHON 121

print("Slumptal: ", slumptal) print("Slumptal med återställning: ", slumptal_med_återställning_av_frö)

Den första satsen import() hämtar in en extern modul med slumptalsgeneratorn. Se vi-dare avsnitt 13.6.

Kör programmet flera gånger för att se vad som händer. Den första raden i utskriften vi-sar alltid en rad med slumpmässiga tal. Den andra raden uppvisar samma talserie om och om, eftersom fröet sattes till 1 och kommer att förbli 1 vid varje körning. Ändra gärna fröet i random.seed(1, 2) till 2 eller 19 eller 4711 och se vad som händer när du kör pro-grammet flera gånger.

Någon körning visas inte, eftersom talseriena kommer att bli olika mellan olika datorfab-rikat, tid på dagen etc.

12.6.4. Läs mer Du kan läsa mer om random- och secrets-funktionerna och om Mersenne-Twister på sidan 316.

12.7. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 124: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 122

13. Funktioner

Huvudrutinen är både programmets startpunkt och det huvudsakliga flödet, från programmets start till dess slut.

I program som du hittills har sett, börjar huvud-rutinen alltid på filens första rad och slutar på sista raden. Med funktioner i programmet ska huvudrutinen börja efter funktionerna. Det bety-der inte att funktionerna faktiskt körs först, de bara definieras först.

Olika funktionsanrop i huvudrutinen kan göra avsteg från det huvudsakliga flödet genom att tillfälligt hoppa till ett annat ställe, utföra sin uppgift och därefter återvända.

Egentligen har du stött på funktioner tidigare i denna lärobok, till exempel utskriftsfunktionen print() och inmatningsfunktionen input(). Båda tar emot det som ska skrivas ut som argument,

utför sin uppgift och lämnar tillbaka kontrollen till huvudrutinen. Print() skriver ut nå-got på skärmen, medan input() både skriver ut något på skärmen och lämnar tillbaka det användaren skrivit som ett svar till huvudrutinen. Exakt hur dessa båda funktioner utför sina uppgifter behöver man inte veta.

I detta kapitel får du lära dig att skriva egna funktioner, som gör att ditt program blir:

Mera läsbart.

Lättare att rätta fel på ett ställe än på flera. Risken för fel minskar.

Programmet blir enklare att prova.

Ett svårt problem kan delas upp i mindre, enklare delar.

13.1. Funktionens uppbyggnad

def funktionsnamn(): Block med programsatser # Anrop till funktionen funktionsnamn()

Programkoden som utgör funktionen kallas definition. Den inleds med nyckelordet def följt av funktionens namn och en tom parentes.

Kolonet och blocket med efterföljande programsatser känner du igen från avsnitten om frågesatser och sling-or.

Page 125: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 123

13.1.1. Ordningen är viktig Funktioner måste skrivas först i programkoden, även om de inte körs. Pythontolken bör-jar läsa filen uppifrån och ned och funktionerna måste vara definierade, alltså ha påträf-fats av Python, innan de kan användas av huvudrutinen. Det är bra om du alltid markerar huvudrutinens början med en kommentar om detta, för att tydliggöra det för dig själv.

13.1.2. Enkel funktion

Du jobbar på Rektangel AB och ska räk-na ut en mängd areor hela dagarna med hjälp av ett program.

När du kommer till jobbet på morgonen börjar ditt program med att hälsa väl-kommen med en mycket enkel funktion som skriver ut texten ”Välkommen till Rektangel AB”. Körningen börjar med huvudrutinen och det första som hän-der, är att funktionen välkommen() anropas. Anropet flyttar körningen till funktionen och när den är slut, åter-lämnas kontrollen till huvudrutinen.

# morgonrutin.py # Funktionsdefinition def välkommen(): print("Välkommen till Rektangel AB") # Huvudrutinen börjar här print("Huvudrutin före anropet") # Anropet till funktionen välkommen() # Huvudrutinen fortsätter här print("Huvudrutin efter anropet")

13.1.3. Prova på Undersök flödet i det enkla programmet morgonrutin.py med avlusaren i Thonny. No-tera själv programmets flöde under avlusningens gång.

13.1.4. Lösningsförslag 1. Visa radnumren med Tools > Options > Editor > Show line numbers.

2. Mata in programmet i programredigeraren.

3. Provkör programmet för att se att du skrivit rätt och inte får syntaxtfel.

4. Starta avlusaren med Run > Debug Current Script (faster) eller tryck Skift-F5. Anledningen till du kan använda metoden faster är att du i detta skede inte är intres-serad av att plocka sönder satserna i detaljer utan bara följa med flödet i körningen.

Page 126: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 124

Här är utgångsläget. Programmets viktiga delar är färgmärkta för att underlätta för dig att förstå. Definitionen av funktionen välkommen() är blå och alla texter som ska skrivs ut är gröna.

När du startar avlusingen fastnar avlusaren på tredje raden, nämligen funktionsdefintio-nen. Något mera händer inte utan funktionen är nu igenkänd. Avlusaren ignorerar alla grå kommentarsrader.

När du trycker F7 hoppar avlusaren vidare till nästa körbara rad, som är huvudriutinens första körbara sats. Satsen innebär att en textsträng ska skrivas ut.

När du trycker F7 går avlusaren vidare till nästa körbara sats, som är anropet till funk-tionen välkommen().

Efter nästa F7 öppnas en särskild dialogruta som visar funktionen välkommen(). Den är nu körbar och orsakar att en textrad skrivs ut.

Page 127: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 125

Ytterligare ett F7 gör att körningen går tillbaka till huvudrutinen och kör rad 13, som orsakar att den sista textraden till skrivs ut.

Alla utskrifter hamnar i terminalvyn. Efter sista F7 avslutas körningen och terkminalvyn visar ett avslutande >>>.

13.2. Funktion med inparametrar

Ofta vill man skicka med parametrar till en funktion, för att den ska ha något att arbeta med. Om du ofta gör en och samma beräkning på två tal och sedan skriver ut svaret, är det enklare att göra detta som en funktion än att skriva om samma block i huvudrutinen igen.

def funktionsnamn(inparameter): Block med programsatser def funktionsnamn(inparameter1, inparameter2): Block med programsatser

Funktionen kan ta emot ett godtyckligt antal parametrar, från ingen alls till väldigt många.

… funktionsnamn(argument) …

När man anropar funktionen, kallas inparametrarna för argument. I funktionsanropet ska argumenten anges i samma ordning som i funktionsdefinitionen. Inparametrar och argument ska vara av samma typ, till exempel numeriska- eller strängvärden.

I ditt arbete på Rektangel AB behöver du ett program som räknar ut rektanglars area. Skriv detta program.

# rektangelns area.py # b = bredd # h = höjd # == rektangel == # Area = b * h def rektangel_area(b, h): print("Rektangelns area", b * h, "kvadratcentimeter") # Huvudrutinen börjar här rektangel_area(2, 7) rektangel_area(22, 3) rektangel_area(19, 18) rektangel_area(4711, 17) rektangel_area(0, 3)

Page 128: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 126

Resultatet blir

>>> %Run 'rektangelns area.py' Rektangelns area 14 kvadratcentimeter Rektangelns area 66 kvadratcentimeter Rektangelns area 342 kvadratcentimeter Rektangelns area 80087 kvadratcentimeter Rektangelns area 0 kvadratcentimeter

Huvudrutinen anropar funktionen rektangel_area() och skickar med parametrarna för bredden och höjden. Funktionen gör beräkningen, presenterar svaret och lämnar tillbaka kontrollen till huvudrutinen, som fortsätter med att begära nästa beräkning osv.

13.2.1. Rät linje a) Funktioner kan användas för delberäknignar i större sammanhang. En matematisk funktion kan ”översättas” till en pythonfunktion. Du vet att räta linjens ekvation kan uttryckas som y=k*x+m. Skriv en funktion som returnerar y om den som inparameter får x. k ska alltid vara 2 och m ska vara 3.

>>> f(1) 5 >>> f(2) 7

b) Modifiera funktionen så att den blir mera generell och också kan ta in parametrar för k och m. Inparametrarna ska komma i ordningen x, k, m.

>>> f1(1, 2, 3) 5

c) EU-kommissionen i Bryssel har bestämt att standardvärdena för k och m ska vara 2 respektive 3, om inget annat sägs. Modifiera funktionen så att den får de förvalda stan-dardvärdena för k och m, som kan åsidosättas om dessa argument finns med i anropet.

>>> f2(1) 5 >>> f2(1, 3) 6 >>> f2(1, 4, 4) 8

d) Skriv ett program som anropar funktionen med x-värden från 1 till 10 och skriver ut motsvarande y-värde.

f(1) = 5 f(1) = 7 f(1) = 9 ... f(10) = 23

Page 129: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 127

13.2.2. Nyckelordsbaserade argument Det kan hända att du använder någon annans kod, och två månader senare har den upp-dateras och avsändaren har bytt ordning på parametrarna. Då räddas du av denna vatten-täta metod. Då kan du namnge dina argument, för att vara säker på att de passar mot rätt inparametrar i funktionen.

rektangel_area(h = 3, b = 2)

Med detta skrivsätt spelar det ingen roll om funktionen hade förväntat sig inparametrar-na i en annan ordning. Variabeln h i anropet kommer alltid att överföras till variabeln h i funktionen.

13.2.3. Prova på Prova att anropa funktionen rektangel_area() med ett nyckelordsbaserat anrop, i ord-ningen bredd gånger höjd och höjd gånger bredd.

13.2.4. Lösningsförslag rektangel_area(h = 19, b = 18) rektangel_area(b = 18, h = 19)

Resultatet ska bli detsamma i båda fallen.

Rektangelns area 342 kvadratcentimeter Rektangelns area 342 kvadratcentimeter

13.3. Funktion med returparametrar

Funktionen kan åstadkomma svar som måste lämnas tillbaka till programmet som anro-pade den. Det gör den med hjälp av en returparameter, som överlämnar svaret till huvud-rutinen.

def funktionsnamn(): Block med programsatser return(resultat) #Huvudrutin svar = funktionsnamn(resultat)

Modifiera den tidigare funktionen rektangel_area() så att den inte längre skriver ut arean utan bara räknar ut den och lämnar tillbaka arean till huvudrutinen.

# rektangelarealista.py # == rektangel == # Area = b * h def rektangel_area(b, h): return b * h # Huvudrutinen börjar här area = rektangel_area(2, 7) print(area)

Page 130: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 128

Skillnaden mot förra exemplet är att funk-tionen inte skriver ut något, utan returnerar resultatet av beräkningen med nyckelordet return. Det är nu upp till huvurutinen att skriva ut resultatet.

Det är på detta sätt man konstruerar de fles-ta funktioner. Funktionen får en uppsättning inparametrar, utför en standardmässig be-räkning på dem och återlämnar resultatet till den som anropade.

13.3.1. Prova på Chefen på Rektangel AB är inte nöjd med ditt enkla program, utan behöver en lista med areorna, som kan läggas in i försäljarnas kalkylprogram, som de ska använda när de säljer rektanglar. Skriv ett program som lägger till areor för fem populära rektanglar i en lista och skriver ut listan.

13.3.2. Lösningsförslag # rektangelarealista.py # == rektangel == # Area = b * h def rektangel_area(b, h): return b * h # Huvudrutinen börjar här # Skapa tom lista arealista = [] # Anropa areaberäkning med rektangel_area() och tilldela # svaret till variabeln area area = rektangel_area(2, 7) # Lägg in variabelns värde i listan arealista.append(area) # Använd returvärdet från rektangel_area # som argument till append arealista.append(rektangel_area(22, 3)) arealista.append(rektangel_area(19, 18)) arealista.append(rektangel_area(4711, 17)) arealista.append(rektangel_area(0, 3)) print(arealista)

Beräkningarna görs på två sätt. Huvudrutinen förser funktionen med ett antal argument och fångar upp retursvaret i variabeln area för att sedan lägga in det i listan arealista. I påföljande satser används istället retursvaret från rektangel_area() direkt som ett ar-gument till funktionen append(), som gör precis samma sak utan att gå via en mellanva-riabel som area och skarvar på svaret i slutet av arealista. Det är två metoder att göra samma sak. Körningen ser ut så här.

Page 131: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 129

>>> %Run rektangelarealista.py [14, 66, 342, 80087, 0]

Läs mer om listor och funktionen append() på sidan 84.

13.4. Funktionsanrop inifrån en funktion

Försäljningsorganisationen meddelar att kva-drater säljer bättre än rektanglar. Företagets nya policy är att varannan producerad produkt ska vara en kvadrat. Du får ändra i ditt pro-gram, för att motsvara de nya produktionskra-ven. Samtidigt inser du att en kvadrat är ett specialfall av rektangeln, men chefen kräver att du utökar programmet med en ny funktion.

# kvadratens_area.py # == rektangel == # Area = b * h def rektangel_area(b, h): return b * h # == kvadrat == # kvadratens area = b * b def kvadrat_area(b): return rektangel_area (b, b) # Huvudrutinen börjar här arealista = [] arealista.append(rektangel_area(22, 3)) arealista.append(kvadrat_area(19)) arealista.append(rektangel_area(4711, 17)) arealista.append(kvadrat_area(47.11)) print(arealista)

Anropet till kvadrat_area kommer i sin tur att resultera i ett anrop till rektang-el_area. Det är behändigt, om du i framtiden skulle behöva ändra metoden för beräkning av rektangelns area.

Vid personalmötet på Jamaica presenterar du din nya administrativa rutin.

>>> %Run kvadratens_area.py [66, 361, 80087, 2219.3521]

Man kan notera att den fungerar lika bra med heltal som med decimaltal.

Page 132: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 130

13.4.1. Lappliselogik II Skriv om programmet du gjorde i avsnittet om while-slingor på sidan 101, strukturerad med funktioner istället. Avsikten är att skapa en mera överskådlig och lättbegriplig hu-vudrutin.

13.5. Standardvärden för parametrar

Ibland går det inte att veta om din funktion får ett argument eller ej. Det ska inte spela någon roll, i ett korrekt utfört program. Du måste förse funktionen med ett standardvärde för inparametern, på samma sätt som den underförstådda parametern end sätts till ny-radstecken i print-satsen. Om inget annat sägs, gäller standardvärdet, men anges ett ar-gument, gäller det före standardvärdet.

Rektangel AB har nyligen förvärvat ett japanskt företag som gör extrastora sushi-cirklar för storkonsumenter. Standardradien på en sådan sushi-cirkel är 3 centimeter.

# cirklar.py from math import pi # == cirkel == # cirkelns area = pi * radie ** 2 def cirkel_area(r=3): return pi * r ** 2 # Huvudrutinen börjar här arealista = [] arealista.append(cirkel_area()) print(arealista)

Om inget annat sägs och parentesen är tom i anropet, antas att en sushi-cirkel har 3 cen-timeters radie (r=3). Anger du en särskild radie i parentesen, kommer den att gälla istäl-let. För att kunna använda talet π för cirkelns area, importerar programmet en modul, nämligen math, ur vilken man valt att enbart använda konstanten pi.

13.5.1. Prova på Anropa cirkel_area() med argumentet 1.

13.5.2. Lösningsförslag arealista.append(cirkel_area(1)) >>> %Run cirklar.py [3.141592653589793]

Page 133: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 131

13.6. Moduler

Efter ett tag har du skrivit en hel massa nyttiga funktioner, som du kan vilja återanvända i andra program.

Det smidigaste vid programmering är om du kan begränsa dig till att bara skriva en ny huvudrutin och låta denna återanvända de nödvändiga delarna av den gamla programko-den.

Dina gamla program är redan filer. Med några smärre ändringar kan du göra om dem till moduler som ditt nya program kan anropa funktionerna i. Nu har du två alternativ.

Antingen kan du ändra den gamla filen så att du tar bort huvudrutinen och bara be-håller funktionsdefinitionerna och sparar filen under nytt namn. Detta är det vackras-te sättet.

Eller också kan du ändra den gamla filen så att den kan ta reda på om den importerats och i så fall ”självmant” ignorerar sin egen huvudrutin. Det sköts med en frågesats i början av huvudrutinen som undersöker om programmet körs ”själv” eller som en im-porterad funktion. Mer om detta kommer på sidan 133.

Förfarandet påminner väldigt mycket om hur man hänvisar till funktioner som definie-rats i samma fil. Skillnaden är att du först måste berätta för ditt program vilken extern modul du vill använda, genom att peka ut den med satsen import. Du behöver inte åter-använda samtliga funktioner i modulen, utan kan välja ut bara de du faktiskt behöver, genom att förse import-satsen med en urvalsparameter.

from math import pi

Med denna sats har vi valt att importera enbart värdet på π från matematikmodulen math.

import math

Du kan importera en modul utan att explicit nämna några funktionsnamn alls. Då blir du tvungen att uttryckligen nämna modulnamnet i koden, så här

>>> math.pi 3.141592653589793

Detta förfarande är mera pedagogiskt, eftersom du då talar om exakt var funktionen pi har kommit ifrån.

from math import *

Du hade kunnat importera hela math genom att importera samtliga funktioner med ar-gumentet * (jokertecken), men då hade risken för kollisioner mellan variabelnamn ökat. Ta som regel att alltid bara importera just de funktioner du har användning av.

from math import gcd as största_gemensamma_nämnare

Det går att döpa om en importerad funktion om det ursprungliga namnet är för krångligt, eller om du vill ha ett bättre namn, kanske för att åskådliggöra funktionen bättre.

När modulen importeras, blir den definierad, alltså känd för programmet. Av den anled-ningen måste import-satsen stå först i huvudrutinen. Du bör ta som en regel att lägga alla

Page 134: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 132

import-satser först i programlistan för att dels samla dem på ett ställe, dels göra det över-skådligare för dig själv.

13.6.1. Moduler i praktiken Företaget Rektangel AB har skaffat en IT-avdelning som beslutat att utöka programpar-ken med en huvudrutin som anropar en modul med beräkningsrutiner för företagets pro-dukter: rektanglar, kvadrater, cirklar och trianglar.

# areor.py from math import pi # b = bredd # h = höjd # == rektangel == # Area = b * h def rektangel_area(b, h): return b * h # == kvadrat == # kvadratens area = b * b def kvadrat_area(b): return rektangel_area (b, b) # == cirkel == # cirkelns area = pi * radie ** 2 def cirkel_area(r=3): return pi * r ** 2 # == triangel == # trianglens area = b * h / 2 def triangel_area(b, h): return b * h / 2

Så här ser modulen areor.py ut. Den kan beräkna arean för ett antal geometriska figu-rer, bara man anropar rätt delfunktion. Den returnerar arean till det anropande pro-grammet.

# Rektangel AB huvudrutin import areor areor.rektangel_area(5, 10) arealista = [] arealista.append(areor.rektangel_area(22, 3)) arealista.append(areor.kvadrat_area(19)) arealista.append(areor.cirkel_area(19.2)) arealista.append(areor.triangel_area(47, 11)) print(arealista)

När säljavdelningen ska göra reklammaterial, startar de huvudrutinen som matar ut are-orna för ett antal populära produkter. Körningen ser ut så här.

>>> %Run rektangel_AB_huvudrutin.py [66, 361, 1158.1167158193414, 258.5]

Importera så få delfunktioner som möjligt från externa funktioner, för att undvika tvety-digheter. Om du själv har skrivit till exempel en funktion kallad rektangel_area() och

Page 135: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 133

skulle råka importera en extern funktion som också heter rektangel_area() kommer den funktion som definierades senast att användas. Det betyder att du kan bli av med den im-porterade funktionen utan att veta om det.

from areor import triangel_area

Här har bara delfunktionen triangel_area() hämtats in från modulen areor.py. Du bör välja detta sätt som standard.

13.6.2. Undersök om koden körs som huvudrutin Det är viktigt att automatiskt kunna koppla bort huvudrutinen i en importerad modul, eftersom huvudrutinen inte får köras av misstag.

Modulerna får sitt filnamn tilldelat till variabeln __name__ utom i det fall filen körs som huvudrutin. Då tilldelas __name__ namnet __main__. Det kan användas för att detektera om huvudrutinen i filen faktiskt körs som huvudrutin, eller är del i en importerad fil.

För att undersöka detta, sätter man in följande frågesats först i huvudrutinen.

if __name__ == "__main__": Block med programsatser som utgör huvudrutin

De långa strecken före och efter name skapas med två understrykningstecken (_ _). Skul-le filen vara importerad blir svaret på frågan False och alla påföljande satser, alltså hela programmet, kommer att hoppas över. Körningen fortsätter efter sista raden, vilket bety-der att filen återlämnar kontrollen till det anropande programmet, dvs inget körs.

13.6.3. Prova på Importera funktionen kvadrat_area() från modulen areor.py och beräkna bottenarean för Khufus pyramid i Egypten, vars sida är 230,34 meter. Använd en frågesats för att de-tektera om filen körs som huvudrutin eller ej. Om filen är importerad ska huvudrutinen hoppas över.

13.6.4. Lösningsförslag # khufus_pyramid.py if __name__ == "__main__": # Beräkna bottenarean av Khufus pyramid from areor import kvadrat_area area = kvadrat_area(230.34) print("Bottenarean av Khufus pyramid är", area, "kvadratmeter")

Kom ihåg att de långa strecken före och efter name skapas med två understrykningsteck-en (_ _). Körningen ger följande resultat.

>>> %Run khufus_pyramid.py Bottenarean av Khufus pyramid är 53056.5156 kvadratmeter

Page 136: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 134

13.7. Att smita ur en funktion för tidigt

En funktion är slut när dess sista programrad har körts, men om man vill lämna funktio-nen tidigare än så, för att något nytt villkor uppfylls eller för att något gick fel, går det att smita ut ur funktionen för tidigt med hjälp av satsen return.

Säljpersonalen på Rektangel AB har börjat sälja för små cirklar och tillverkningsavdelningen har svårt att tillverka cirklar med radien noll eller negativ radie. Därför vill chefen att du inför en funktion som undersöker om kunderna försöker beställa orimligt små cirklar.

# kontrollerade_cirklar.py from math import pi # == cirkel == # cirkelns area = pi * radie**2 def cirkel_area(r = 3): if r <= 0: return return pi * r ** 2 # Huvudrutinen börjar här area = cirkel_area(0) if area == None: print("Så små cirklar kan vi inte tillverka!") else: print(area)

Anropet lämnar över den beställda radien till funktionen som beräknar arean. Frågesat-sen kontrollerar att radien r inte är mindre än eller lika med noll. Skulle det vara så, av-slutas funktionen i förtid med ett enkelt return, som då returnerar värdet None, vilket är detsamma som inget värde alls.

I annat fall avslutas funktionen normalt och returnerar cirkelns area.

Efter anropet, testar huvudrutinen om funktionen returnerat None och lämnar i så fall ett felmeddelande. En körning med invärdet noll, som i programmet ovan, ser ut så här.

>>> %Run kontrollerade_cirklar.py Så små cirklar kan vi inte tillverka!

Page 137: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 135

13.8. Godtyckligt antal inparametrar

Ibland kan man ha behov av att kunna hantera hur många, eller hur få, inparametrar som helst i en funktion. Funktionen ska ändå kunna ta reda på hur många parametrar det är, och hantera dem alla korrekt.

Ett bra exempel på detta är funktionen print() som gladeligen skriver ut hur många in-parametrar som helst. För att undersöka hur print() gör det kan man prova en enklare funktion, som summerar ett antal termer, hur många eller hur få som helst, som presen-teras som argument.

# godtyckliga_termer.py # summera godtyckligt antal termer def summera(*termer): summa = 0 for term in termer: summa = summa + term return summa # Huvudrutin: anropa funktionen summera() print(summera(1,2,3)) print(summera(1,2,4,8,16,32,64,128))

Det som särskiljer denna funktion från andra är asterisken i inparameterlistan. Den bety-der ”Hur många som helst. Undersök själv”. Indata presenteras som en tuple, som pro-grammet kan gå igenom med en for-slinga, som tar listan post för post.

Körningen ser ut så här.

>>> %Run godtyckliga_termer.py 6 255

13.9. IX Rekursion

Rekursion uppstår när en funktion anropar sig själv om och om tills något villkor är upp-fyllt. Metoden hade kunnat skrivas som en slinga för att repetera samma beräkning, men villkoren skulle bli mera komplicerade och därmed mera svårbegripliga än om man skriver programmet som en rekursion. Ta exempelvis följande rekursiva funktion.

# rekursion.py def rekursion(tal): if tal < 0: return False else: print(tal, " ") tal -= 1 return rekursion(tal) # Huvudrutinen börjar här rekursion(10)

När funktionen rekursion(tal) anropas med parametern 10 kommer den först att under-söka om talet är mindre än noll. Det är det givetvis inte. Därför kommer man vidare till

Page 138: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 136

satsen else: där talet skrivs ut, sedan minskas med ett varefter funktionen startar om sig själv med det nya värdet på tal, som nu är nio. Funktionen kommer att skriva ut:

10 9 8 7 6 5 4 3 2 1 0

varefter tal har blivit (–1) och funktionen avslutas med return och det logiska värdet False returneras till det anropande programmet.

13.9.1. Prova på a) Den matematiska världen har mängder av exempel på rekursiva processer och den mest kända är fibonaccitalen. Talen är uppkallade efter italienaren Leonardo Pisano Fi-bonacci som på 1200-talet använde dem för att beskriva tillväxten hos kaniner.

Idén bakom Fibonaccis beräkningar är att kaninerna aldrig dör under tiden som under-sökningen pågår. Ett kaninpar producerar alltid två ungar per månad, som i sin tur, från månad två alltid producerar två ungar osv.

Antalet kaninungar som existerar per månad i populationen ökar alltså som 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 osv.

Funktionen F(n) beskrivs på följande sätt:

1

1

0

)2()1(

1

0

)(

n

n

n

nFnF

nF

Skriv ett program som räknar ut hur många kaninungar det är totalt efter 1, 5 och 12 månader.

Page 139: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 137

13.9.2. Lösningsförslag a)

# fibonacci.py def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: return(fibonacci(n-1) + fibonacci(n-2)) # Huvudrutinen börjar här # Anropa fibonaccifunktionen och skriv ut antalet kaniner print("Antal kaniner:", fibonacci(12))

En månad

print("Antal kaniner:", fibonacci(1)) >>> %Run fibonacci.py Antal kaniner: 1

Fem månader

print("Antal kaniner:", fibonacci(5)) >>> %Run fibonacci.py Antal kaniner: 5

Tolv månader

print("Antal kaniner:", fibonacci(12)) >>> %Run fibonacci.py Antal kaniner: 144

Läs gärna vidare om Fibonacci och hans tal i Wikipedia och se hur fibonaccitalen före-kommer naturligt i till exempel blommor.

13.9.3. Övning på rekursion a) Skriv en rekursiv funktion som räknar ned från inparametern till 0 genom att den an-ropar sig själv med inparameter–1 tills inparametern minskats till 0. Skriv ut värdena under programmets gång. Exempelkörning:

>>> rekursion(10) 10 9 8 7 6 5 4 3 2 1 0

b) Modifiera funktionen från a-uppgiften så att den räknar upp från noll till inparametern och skriver ut värdena under programmets gång.

>>> upprekursion(10) 0 1 2 3 4 5 6 7 8 9 10

c) Skriv en rekursiv funktion som räknar ut och returnerar fakulteten för det tal som lämnas som inparameter.

>>> n_fakultet(10) 3628800

Page 140: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FUNKTIONER

RÄKNA MED PYTHON 138

13.9.4. Skogsspelet Skriv ett litet spel och lägg in spelets olika huvuddelar i olika funktioner.

1. Börja med en funktion som beskriver inledningen.

2. Inledningstexten väljs slumpmässigt som ett av två scenarion och slutar alltid med valet om spelaren vill gå åt höger eller vänster.

3. I det trevliga scenariot sker enbart positiva saker och allting avslutas med att spelaren hittar en katt i en buske och spelaren promenerar vidare.

4. I det otrevliga scenariot är stämnigen mörk. Spelaren hör ett prassel i en buske. En utomjording hoppar fram och äter både katt och spelare.

5. Spelet är slut. Spelaren tillfrågas om denne vill spela igen.

Tekniska detaljer

Spelaren styrs av ledtexter som allihop ska lagras i en lista.

Följande funktioner ska finnas:

En funktion som visar inledningstexterna, med scenariot valt av ett slumptal.

En funktion som väljer ur listan med otrevliga scenarion. Internt avgör den också om spelaren blir uppäten.

En funktion som väljer ur listan med trevliga scenarion.

En funktion som gör en paus med sleep() så du kan ändra väntetiden senare, på ett enda ställe.

Huvudrutinen anropar funktionerna och står för frågan om höger och vänster och kon-trollen av att svaret är något av de två altermativen.

Huvudrutinen ser till att spelaren får välja om denne vill spela om spelet igen.

Förslag på lista med ledtexter.

Du är ute och går en promenad i skogen. Solen skiner och fåglarna kvittrar. Du är ute och stapplar fram i skogen. Åskan dundrar och regnet skvalar. Plötsligt står du vid ett vägskäl Vilken väg ska du ta? Det prasslar i en buske. En kattunge kommer fram och vill kela. En ekorre springer över vägen. Buzz Aldrin hoppar fram och frågar om du sett hans rymddräkt. En utomjording hoppar fram, grinar elakt och äter upp både dig och katten. En utomjording hoppar fram och säger ”Take me to your leader”. En utomjording kommer fram iklädd rymddräkt och frågar om du sett Buzz. Du fortsätter på vägen och kommer fram till ett nytt vägskäl. Vill du spela igen?

Fyll gärna på med fler ledtexter.

13.10. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 141: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 139

14. IX Matplotlib – grafik

Diagram är mycket bra för att visa olika statistiska samband och pythonbiblioteket matplotlib är redan fixt och färdigt för dig som vill låta ditt program rita snygga diagram. Innan du kan börja använda det tillsammans med Python måste biblio-teket installeras. Hur det går till, visas på sidan 297. Du kan anropa funktioner i matplotlib, förse dem med en matris med värden och be om punkt-, linje- och cirkeldiagram av olika typer. Du kan fritt bestämma färger, utseendet på axlar, text i diagrammet och så vidare.

Statistik, alltså praktisk användning av diagram, behandlas på sidan 267.

14.1. Diagramritning

För att rita snygga diagram med matplotlib används klassen pyplot. Pyplot görs tillgänglig för ditt program med satsen import och ges alias plt, helt enkelt för att det är enklare att skriva.

import matplotlib.pyplot as plt

Låt oss börja med ett enkelt linjediagram med fyra mätvärden. Diagrammet kan dekoreras på olika sätt.

I detta första exempel lämnas mycket över till standardvärden för olika funktioner, som skalornas delning, teckenstorlekar, med mera.

# enkel_linje.py # Använd pyplot från matplotlib import matplotlib.pyplot as plt

Page 142: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 140

# Skapar ett linjediagram plt.plot([1, 2, 3, 4], [1, 2, 3, 4], color = 'blue', linewidth = 3) # Beskriv de olika axlarna och sätt titel på diagrammet. plt.title("Linjediagram") plt.ylabel("Värde längs y-axeln") plt.xlabel("Mätpunkter längs x-axeln") # Visa diagrammet plt.show()

Funktionen plot() får fyra argument. Det första är listan med delstrecken 1,2,3,4 utefter x-axeln. Den andra listan innehåller mätvärdena 1,2,3,4 som ska placeras utefter y-axeln. Parametern color=’blue’ anger att linjen ska vara blå och linewidth = 3 att linjen ska vara 3 bildpunkter bred.

Funktionen title() används för att sätta en diagramrubrik och xlabel() och ylabel() an-vänds till att sätta rubriker på x- och y-axlarna. Det var inledande inställningar. Först i och med satsen plt.show() visas diagrammet.

14.1.1. Andra utvecklingsmiljöer Använder du en webbaserad utvecklingsmiljö fungerar grafisk utmatning annorlunda. Du måste först spara bilden som programmet skapat och sedan visa den med den metod som är specifik för just din miljö. Istället för

plt.show()

måste du kanske använda:

plt.savefig('grafik.png')

Miljön har en kataloglista, där den grafiska bilden kommer att visas som filnamnet gra-fik.png. Klicka på filnamnet, så visas grafiken i ett fönster.

Vill du spara flera bilder ger du dem andra filnamn, som linjediagram.png eller punkt-diagram.png.

Page 143: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 141

14.1.2. Linjediagram, temperaturer Linjediagram är lämpliga att använda om man vill visa hur ett värde förändras över tiden. Låtsas att du mätt utomhustemperaturen under en vecka. Veckan börjar med måndag och slutar med söndag och temperaturerna du mätte upp var –10, –2, –5, 0, 2, –4 och 0 grader. Gör ett diagram som visar en temperaturkurva, med dagnamnen utefter x-axeln och tem-peraturen utefter y-axeln.

Diagrammet ska ha rubriken ”Temperaturmätning”

Y-axeln ska ha rubriken ”Temperatur”.

Färgen på kurvan är valfri.

Diagrammet ska se ut så här.

Page 144: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 142

14.1.3. Linjediagram, puls Under idrotten i skolan ber läraren dig att mäta din puls före, under och efter en gymnas-tisk övning. Han vill sedan att du visar pulsen som en kurva i ett linjediagram. Det är rim-ligt att tro att du har en lägre vilopuls, som sedan stiger under övningen och sedan återgår till vilopuls efteråt.

Den hjärtfrekvens du registrerar är: 68, 93, 110, 125, 107, 84 och 69, och mätningarna görs med en minuts intervall.

Kurvans linje ska vara röd och 2 bildpunkter bred

Diagrammet ska ha rubriken ”Pulsdiagram”

Y-axeln ska ha rubriken ”Puls”.

X-axeln ska ha rubriken ”Minuter”.

Matplotlib ska själv avgöra intervallen på x-axeln.

Diagrammet ska se ut så här.

Page 145: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 143

14.1.4. Punktdiagram Nästa exempel visar ett punktdiagram där själva linjen har tagits bort genom att sättas till bredden noll och mätvärdena visas som punkter.

Detta program visar den andra och vanligare metoden att plotta ett diagram, nämligen att ha värden i externa listor och bara förse plot() med namnet på listorna (x, y).

# punktdiagram.py # Använd pyplot från matplotlib import matplotlib.pyplot as plt # Skapar listor med x- och y-par som bildar # punkterna i diagrammet x = [1, 2, 3, 4, 5] y = [1, 4, 7, 4, 1] # Skapar själva grafen plt.plot(x, y, color = 'green', linewidth = 0, marker = 'o', markersize = 20) # Beskriv diagrammet och de olika axlarna. plt.title("Punktdiagram") plt.ylabel("Värde längs y-axeln") plt.xlabel("Mätpunkter längs x-axeln") # Visa diagrammet plt.show()

Plot-funktionen får därefter specifikationer om x-placering, y-värden och mätpunktens utseende i plot(x, y, color='green', linewidth=0, marker='o', markersize=20). Pa-

Page 146: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 144

rametern linewidth=0 sätter linjen till bredden noll så att den försvinner. Parametern marker='o' används för att få en punkt som markering och markersize=20 anger att den ska vara 20 bildpunkter i diameter.

Parametern marker kan förses med olika specifikationer för att få olika utseende på markeringarna, som +, ^ och s (fyrkant).

Här är en annan, mera lättläst version.

# punktdiagram2.py # Använd pyplot från matplotlib import matplotlib.pyplot as plt # Skapar listor med X- och Y-par som bildar # punkterna i diagrammet x = [1, 2, 3, 4, 5] y = [1, 4, 7, 4, 1] # Skapar själva grafen graf = plt.plot(x, y) # Använd setp() för att justera egenskaperna på grafen plt.setp(graf[0], color = 'green') plt.setp(graf[0], linewidth = 0) plt.setp(graf[0], marker = 'o') plt.setp(graf[0], markersize = 20) # Beskriv diagrammet och de olika axlarna. plt.title("Punktdiagram") plt.ylabel("Värde längs y-axeln") plt.xlabel("Mätpunkter längs x-axeln") # Visa diagrammet plt.show()

För att inte få för långa argumentlistor till plot() kan olika parametrar specificeras i se-parata satser.

I så fall måste grafen förses med en referens, vilket sker med variabeltilldelningen graf=plt.plot(), som senare tilldelningar hänvisar till.

Färgen har satts i satsen plt.setp(), som är helt i linje med hur rubriker sätts med plt.title(). setp() används vidare till att sätta linjebredd, markeringstyp och diameter.

Page 147: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 145

14.1.5. Flera mätserier

Det går att visa många mätserier i samma diagram. Exemplet visar två mätserier, en med punkter och en med streckad linje.

# två_mätserier.py # Använd pyplot från matplotlib import matplotlib.pyplot as plt # Skapar två linjer i samma graf med gemensamma X-punkter x = [1, 2, 3, 4, 5] # Mätvärden y1 = [1, 4, 6, 8, 2] y2 = [0, 2, 5, 7, 0] graf = plt.plot(x, y1, x, y2) # Använd setp för att justera egenskaperna # för respektive linje i grafen plt.setp(graf[0], color = 'green') plt.setp(graf[0], linewidth = 0) plt.setp(graf[0], marker = 'o') plt.setp(graf[0], markersize = 20) # Det går även bra att ändra flera egenskaper # i ett och samma anrop till setp() plt.setp(graf[1], color = 'red', linewidth = 3, linestyle = '--')

Page 148: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 146

# Beskriv diagrammet och de olika axlarna. plt.title("Punkt och linjediagram") plt.ylabel("Värde längs y-axeln") plt.xlabel("Mätpunkter längs x-axeln") # Visa diagrammet plt.show()

De båda linjerna (även om den ena uttrycks som punkter) specificeras i listorna y1 och y2. De skapas sedan i anropet plt.plot(x, y1, x, y2) där första linjen anges som x,y1 och den andra som x,y2, vilket antyder att plottfunktionen egentligen kan ta emot och plotta många flera linjer. Samma x-tilldelningar används för båda värdemängderna. De båda linjerna refereras med listan graf, för att färger mm ska kunna sättas individuellt i efter-följande satser.

De första fyra setp-satserna specificerar utseendet på graf[0] som är punkterna och den streckade linjen specificeras som graf[1]. Egenskapen linestyle=’--’ åstadkommer den streckade linjen.

Alla de oändliga möjligheterna att snygga till dina diagram och linjer visas under rubriken Om formgivning av diagram och linjer på sidan http://huvudrutin.se/index.php/lankar

Page 149: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 147

14.2. Stapeldiagram

Stapeldiagram ska användas för att presentera värden som inte hänger samman och där-för inte kan presenteras i ett linjediagram.

Det första exemplet är ett grundläggande stapeldiagram, med namngivna, olikfärgade staplar utefter x-axeln, samt diagramrubrik.

# stapeldiagram # Använd pyplot från matplotlib import matplotlib.pyplot as plt # Skapar ett stapeldiagram # Går bra att använda text som x-värden för att # beskriva vad stapeln representerar x = ['röd', 'blå', 'svart', 'gul', 'grön'] # Mätvärden antal_cyklar = [1, 4, 6, 8, 2] # Skapa stapeldiagrammet staplar = plt.bar(x, antal_cyklar, width=0.7) # Ange färger plt.setp(staplar[0], color = 'red') plt.setp(staplar[1], color = 'blue') plt.setp(staplar[2], color = 'black') plt.setp(staplar[3], color = 'yellow') plt.setp(staplar[4], color = 'green')

Page 150: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 148

# Ãndra y-axelns område plt.ylim(-5, 20) # Rita in nollinjen plt.axhline(0, color='black') # Beskriv diagrammet och de olika axlarna. plt.title("Antal cyklar med olika färger") plt.ylabel("Antal cyklar") plt.xlabel("Färger") # Visa diagrammet plt.show()

Första satsen x= anger vad som ska finnas på x-axeln. Man är med andra ord inte begrän-sad till att använda siffror, utan kan ha valfri text.

Funktionen bar() fungerar som tidigare plot(), med den skillnaden att den skapar staplar (bar graph) i stället för linjer. Parametern width=0.7 anger att stapelns bredd ska bli 70 % av tillgängligt utrymme på x-axeln.

Denna gång är referensen till de individuella staplarna listan staplar. Setp-anropen fun-gerar på samma sätt som för linjediagram och de enskilda färgerna sätts med index i stap-lar som referens. Skulle du inte bry dig om färgen på staplarna kan dessa satser uteslutas. Då blir alla staplar blå.

Som du ser börjar staplarna vid noll, som är en bit upp i luften. Skulle det ha funnits ne-gativa cyklar hade de visats som nedåtgående staplar. Omfånget på y-axeln anges med satsen ylim(-5,20) som ersätter standardvärdena för y-axeln, som annars hade blivit 0–10. Nollinjen läggs till med satsen plt.axhline(0,color=’black’) vilket ska tolkas som ”add x horisontal line”.

14.2.1. Stapeldiagram, favoriträtter del 1 Du har fått i uppgift att kontrollera vilken favoritmat eleverna i klassen har. Det är 18 elever i klassen. 1/3 svarade pizza, 1/3 svarade pasta, 1/6 svarade hamburgare och 1/6 sva-rade att de inte hade någon favoriträtt.

Visa detta i ett stapeldiagram med stående staplar.

Börja för enkelhets skull att manuellt räkna ut hur många elever det var som tyckte om olika maträtter, eftersom det är antalet som ska presenteras som y-värde. Det går bra att använda Python föär att göra beräkningarna.

Favoriträtternas namn och ”Vet inte” ska lagras i en lista kallad favoriträtter[] och för att få rätt längd på x-axeln ska du använda funktionen len() för att ta reda på antalet möjliga rätter, inklusive ”Vet inte” och tilldela variabeln antal_favoriträtter detta vär-de.

Staplarnas bredd ska vara 0,5

Staplarna får ha valfri färg.

Page 151: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 149

Diagrammet ska se ut så här. Notera särskilt rubrikerna på axlarna.

14.2.2. Hängande staplar för havsdjup

I vissa fall kan det vara lämpligare att ha staplarna hänga ned från nollinjen, även om värdena i sig själva inte är negativa. Ett sådant fall är havsdjup.

# hängande_staplar.py # Använd pyplot från matplotlib import matplotlib.pyplot as plt # Skapar ett stapeldiagram namn = ['Marianer-\ngraven', 'Atacama-\ngraven', 'Java-\ngraven', 'Calypso-\ngraven', 'Landsorts-\ndjupet']

Page 152: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 150

# Mätvärden havsdjup = [10971, 8065, 7455, 5267, 456] # Skapa stapeldiagrammet staplar = plt.bar(namn, havsdjup) # Sätt färger plt.setp(staplar[0], color = 'aqua') plt.setp(staplar[1], color = 'powderblue') plt.setp(staplar[2], color = 'azure') plt.setp(staplar[3], color = 'blue') plt.setp(staplar[4], color = 'lightskyblue') # Ãndra y-axelns område plt.ylim(12000, 0) # Beskriv diagrammet och de olika axlarna. plt.title("Berömda havsdjup") plt.ylabel("Djup") plt.xlabel("Platser") # Visa diagrammet plt.show()

Det är bara en subtil skillnad mot förra exemplet, nämligen att satsen plt.ylim() har vär-dena är omkastade, vilket får y-axeln att börja nedifrån med ett högt värde och sluta upp-till med 0. Värdet på ylim() har valts för att den längsta stapeln ska få plats bekvämt.

Eftersom namnen på havsdjupen är för långa för att få plats under staplarna har man hjälpt till att bryta raden med styrtecknet \n. Glöm bara inte att sätta ut bindestreck!

14.2.3. Horisontella staplar

Page 153: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 151

Stapeldiagram kan ha horisontella staplar också, om det skulle passa sig bättre på till-gängligt utrymme. Istället för plt.bar() används då plt.barh(). Här visas sportresultat som lämpligen presenteras horisontellt, nämligen personbästa för längdhopp för damer utomhus.

# vänsterstaplar.py # Använd pyplot från matplotlib import matplotlib.pyplot as plt # Skapar ett stapeldiagram namn = ['Galina\nTjistjakova', 'Jackie\nJoyner-Kersee', 'Heike\nDrechsler'] # Mätvärden personbästa = [7.52, 7.49, 7.48] # Skapa stapeldiagrammet plt.barh(namn, personbästa) # Justera i x-led plt.xlim(7.45, 7.55) # Beskriv diagrammet och de olika axlarna. plt.title("Personbästa för damer i längdhopp") plt.ylabel("Namn") plt.xlabel("Längd") # Visa diagrammet plt.show()

Notera att det som var x-axeln i förra exemplet nu blivit y-axel och fått rubriken ”Namn” och den nya x-axeln visar värdena, med rubriken ”Längd i meter”. Staplarnas färg har inte specificerats, och antar då standardfärgen blågrön.

Problemet med sportresultat är att alla de bästa idrottskvinnorna hoppar ungefär lika långt, omkring 7,5 meter, vilket skulle göra diagrammet ointressant och svårtolkat. I och med att man med satsen xlim(7.45, 7.55) klipper bort de första 7,45 metrarna och bara låter diagrammet sträcka sig till hittills ouppnådda 7,55 meter blir skillnaderna lättare att se.

14.2.4. Stapeldiagram, favoriträtter del 2 Gör om samma sak som i övning 14.2.1, men med ett horisontellt stapeldiagram. Se bara till att använda plt.barh() istället för plt.bar().

Staplarnas bredd ska vara 0,5. Använd argumentet height= som inargument till barh().

Staplarna får ha valfria, men olika färger.

Page 154: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 152

Diagrammet ska se ut så här.

14.3. Cirkeldiagram

Ett cirkeldiagram lämpar sig att använda när man vill visa andelar av något helt, gärna i form av tårtbitar. Det kan till exempel vara antalet ledamöter i riksdagen, där antalet sto-lar alltid är 349 (eller 100 %) och de olika partierna får olika antal stolar efter röstsiffror-na (eller procentuella andelar).

Cirkeldiagram (pie chart) kan utföras på en mängd olika sätt, dekoreras på olika sätt, för-ses med mätvärden och ges perspektiv och skuggor mm för att de ska se smakliga och in-tressanta ut.

Page 155: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 153

Cirkeldiagrammet visar röstresultatet vid folkomröstningen 2014.

# cirkeldiagram.py # Använd pyplot från matplotlib import matplotlib.pyplot as plt # Valresultatets procentsatser valresultat = [31.01, 23.33, 12.86, 6.89, 6.11, 5.72, 5.42, 4.57, 4.09] # Beskrivning av värdena, vilket parti som fick vad parti = ['Socialdemokraterna', 'Moderaterna', 'Sverigedemokraterna', 'Miljöpartiet', 'Centerpartiet', 'Vänsterpartiet', 'Folkpartiet', 'Kristdemokraterna', 'Övriga'] # Skapa cirkeldiagram plt.pie(valresultat, labels = parti, autopct = '%1.2f%%') # Justera proportionerna till cirkelform plt.axis('equal') # Beskriv diagrammet och de olika axlarna. plt.title("Valresultatet riksdagsvalet 2014") # Visa diagrammet plt.show()

Satsen plt.pie() skapar ett cirkeldiagram där värdena från listan valresultat blir till tårtbitarnas storlek, medan strängarna i listan parti sätts ut som etiketter på tårtbitarna. Om inget annat sägs, läggs värdena på valresultat ut moturs och börjar vid x-axelns po-sitiva ände, alltså klockan 3.

Det finns en mängd tillsatsparameter till satsen plt.pie() men i detta första exempel är de flesta av dem uteslutna. Om inget annat sägs, väljer Pyplot själv lämpliga standardvärden, som till exempel färgerna i detta fall.

Eftersom satsen plt.axis() använts med argumentet ’equal’ blir diagrammet cirkelrunt. Skulle axis-satsen uteslutas får diagrammet lite perspektiv och blir äggformat.

Parametern autopct räknar om indatavärdena så att de blir procentsatser av 100 %, vil-ket passar bra eftersom valresultatet redovisas i procent. Formatsträngen '%1.2f%%' an-ger hur procentsatsen ska visas. Det första procenttecknet anger att det rör sig om en formatsträng. 1.2 anger att det ska vara minst en siffra före decimalpunkten och exakt två siffror efter. %% anger ett explicit procenttecken. Om inget annat sägs, sätts procentsat-sen i mitten av varje tårtbit.

14.3.1. Övning – 2018 års valresultat Slå upp valresultatet för 2018 års riksdagsval på Valmyndighetens webbsida genom att markera huvudmenyn Valresultat och sätta in siffrorna i det förra programmet och plotta ett nytt cirkeldiagram.

Page 156: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 154

14.3.2. Cirkeldiagram med utsmyckning Diagrammet kan förses med en mängd utsmyckningar som gör det trevligare att se på. Det kan ges skuggor (shadow) och olika tårtbitar kan dras ut (explode) om man önskar betona något.

Nu blir det lite snyggare och mera övertygande och dessutom har anmärkningsvärda de-taljer framhävts.

# cirkel_utbruten.py # Använd pyplot från matplotlib import matplotlib.pyplot as plt # Valresultatets procentsatser valresultat = [31.01, 23.33, 12.86, 6.89, 6.11, 5.72, 5.42, 4.57, 4.09] # Beskrivning värdena - vilket parti som fick vad parti = ['Socialdemokraterna', 'Moderaterna', 'Sverigedemokraterna', 'Miljöpartiet', 'Centerpartiet', 'Vänsterpartiet', 'Folkpartiet', 'Kristdemokraterna', 'Övriga'] # Skjut ut de partier som bildade regering och stödparti markerad_del = [0.2, 0, 0, 0.2, 0, 0.1,

Page 157: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 155

0, 0, 0] # Färger till respektive tårtbit färger = ['olivedrab', 'chartreuse', 'palegreen', 'darkgreen', 'green', 'yellowgreen', 'lime', 'lightgreen', 'aqua'] # Skapa cirkeldiagram plt.pie(valresultat, labels = parti, autopct = '%1.2f%%', shadow = True, startangle = 90, explode = markerad_del, colors = färger) # Justera proportionerna plt.axis('equal') # Beskriv diagrammet och de olika axlarna. plt.title("Valresultatet riksdagsvalet 2014") # Visa diagrammet plt.show()

plt.pie() kan ta emot en hel massa parametrar. Här är några:

Tack vare skuggningen tycks diagrammet sväva en bit ovanför sidan. Det åstadkommer man med parametern shadow=True.

Normalt skulle den första tårtbiten börja vid klockan 3, men parametern startangle=90 vrider starten till klockan 12. Bitarna läggs fortfarande ut moturs. Skulle du lagt in para-metern counterclock = False kommer tårtbitarna istället att läggas ut medurs.

Själva explosionen styrs av parametern explode=markerad_del, där listan marke-rad_del har värdena (0.2, 0, 0, 0) osv. Det betyder att tårtbit nummer ett kommer att skjutas ut 0,2 gånger diagrammets radie. Du kan ange olika avstånd för alla tårtbitar som (0, 0.1, 0.3, 0.2) osv.

Parametern colors=färger lägger ut färgerna moturs runt diagrammet. Färgerna be-stäms av färgnamnen i listan färger, i detta fall olika gröna nyanser, som olivedrab, char-treuse etc.

14.3.3. Cirkeldiagram, andelar Rita ett cirkeldiagram med följande tårtbitar: 1/4-del gul, 1/6-del röd, 1/8-del grön och sis-ta tårtbiten blå. Räkna först fram den sista bitens procentuella andel och ta sedan fram den procentuella andelen för återstående bitar. Rita sedan upp det i ett cirkeldiagram.

Första tårtbiten ska börja vid klockan 12.

Sätt ut procentandelen inne i tårtbitarna och bråktalet som etiketter utanför varje tårtbit.

Skjut ut den sista biten.

Page 158: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 156

Diagrammet ska se ut så här, med dessa färger, skuggning och utskjuten tårtbit.

14.4. Kurvor av matematiska funktioner

En av de vanligaste matematiska funktionerna är sinuskurvan. Den är baserad på förhål-landet y=sin(x). Sinuskurvor visas allt som oftast på oscilloskop när man arbetar med växelspänning.

Page 159: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 157

För att rita sinuskurvor behöver man ett riktigt värde på π. Det får man lättast genom att importera funktionen pi ur biblioteket numpy. Då π används i geometrin förstås att si-nus- och cosinusvärden uttrycks i radianer. Sinuskurvan som visas utgör värdet av sin(x) när x genomlöps från noll till 2π, eller om man så vill, går ett varv runt enhetscirkeln.

# sinusvåg.se # Använd pyplot från matplotlib import matplotlib.pyplot as plt # Använd arange, pi och sin från numpy from numpy import arange, pi, sin # Skapar ett linjediagram med genererad data # Skapa en lista med värden mellan 0 och 2 * pi # med steglängd om 0.01 x = arange(0, 2 * pi, 0.01) # Beräkna y = sin(x) L1 = sin(x) # Skapa kurva faser = plt.plot(x, L1) # Färga linjen och ange en etikett plt.setp(faser[0], color = 'red', label = 'L1') # Visa en förklaring plt.legend(handles = faser) # Slå på stödraster plt.grid(True) # Beskriv diagrammet och de olika axlarna. plt.title("sinuskurva") plt.ylabel("y = sin(x)") plt.xlabel("Vinkel x") # Visa diagrammet plt.show()

Eter initieringen skapar satsen arange() en lista med flyttalsvärden mellan 0 och 2π i steg om 0,01 decimalt, varefter x tilldelas denna lista. I satsen L1=sin(x) tilldelas varia-beln L1 en lista med sinus av alla värden för x. Det är ett elegant sätt att lösa beräkning-en och tilldelningen utan att behöva använda en for-slinga.

Variabeln faser används som referens till den plottade kurvan, för att kunna tilldela kur-van egenskaper senare, nämligen färgen röd och etiketten ”L1”.

I satsen plt.legend() skapas en ruta med en förklaring som meddelar att kurvan kallas för ”L1”.

Stödrastret i bakgrunden skapas med plt.grid().

Page 160: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 158

14.4.1. Linjer a) Skriv en funktion f(x) som beräknar räta linjens ekvation enligt formeln y=k*x+m. Som du minns sedan tidigare har EU bestämt att k och m är 2 respektive 3. Plotta ett linjediagram som visar y för alla x från 0–19.

b) Modifiera din funktion så att den istället uttrycker y=k*x2+m. Plotta ett linjediagram som visar y för alla x från –10 ... 10.

c) Modifiera din funktion så att den istället uttrycker y=k*x3+m. Plotta ett linjediagram som visar y för alla x från –10 ... 10.

d) Modifiera din funktion så att den istället uttrycker y= k*x3–50*k*x+m. Plotta ett linjediagram som visar y för alla x från –10 ... 10.

14.4.2. Lappliselogik III Denna övning bygger på övningarna Lappliselogik på sidan 101 och Lappliselogik II på sidan 130.

Lapplisorna börjar bli väldigt trötta på alla felparkerare. De beslutar sig för att göra ett linjediagram och visa för kommunledningen i en overheadpresentation, i hopp om att led-ningen ska ge dem mera pengar till taggtråd. Under en vecka registrerar de antalet fel-parkerade bilar i ditt program, som du modifierat till att också ta emot registreringsda-tum.

Efteråt slår programmet samman alla dagens registreringar och plottar ett totalt värde per dag. Använd den diagramtyp du finner lämplig. Varje mätvärde ska rubriceras med dagens datum och antalet registreringar ska visas som en etikett.

Page 161: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 159

14.5. Interaktiva diagramfönster

Antag att du visar ett översiktligt diagram och vill låta användaren klicka på exempelvis en stapel, för att därefter använda exempelvis x-värdet till att plotta ett nytt diagram med en ny aspekt av denna stapel, eller sortera om diagrammet med avseende på stapeln, kan du låta diagramfönstret registrera var användaren klickade och returnera detta värde till programmet.

Använder du en webbaserad miljö som bara matar ut grafik som en grafikfil, kan du inte göra interaktiv grafik på grund av miljöns begränsningar. Använd helst en lokalt installe-rad utvecklingsmiljö.

Diagrammet består av olika delar, som vi hittills inte beskrivit separat. Det kan indelas i axlar, titlar, den uppritade grafen (line) och rityta (canvas), som slås ihop till en figur (fi-gure). På ritytan kan systemet registrera musklick och lämna tillbaka koordinaten i en x- och en y-variabel.

Följande program är en detaljrikare version av programmet i avsnitt 14.1.

# en_interaktiv_linje.py import matplotlib.pyplot as plt # fig är huvudobjektet som byggs upp av alla delobjekten fig = plt.figure() # Anger hur stort koordinatsystemet ska vara ax = fig.add_subplot(111) # Anger diagramrubriken ax.set_title('En rubrik') ax.set_ylabel ('Y-etikett') ax.set_xlabel ('X-etikett') ax.set_ylim(-10, 10) ax.set_xlim(-10, 10) # Skapar rutnät ax.grid(True) ax.plot([-10,2,10], [3,5,-2], linewidth = 3) plt.show()

Page 162: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 160

Det ritar upp följande diagram.

14.5.1. Gör diagrammet interaktivt För att göra diagrammet interaktivt måste du skapa en funktion som hanterar de koordi-nater där användaren klickat med musen (klickhanterare). Dessutom måste du ”aktive-ra” diagrammet fig genom att ansluta till det med funktionen mpl_connect() som tar hand om musklicken.

# en_interaktiv_linje.py import matplotlib.pyplot as plt def klickhanterare(händelse): print(händelse.xdata, händelse.ydata) # fig är huvudobjektet som byggs upp av alla delobjekten fig = plt.figure() fig.canvas.mpl_connect('button_press_event', klickhanterare) # Anger hur stort koordinatsystemet ska vara ax = fig.add_subplot(111) # Anger diagramrubriken ax.set_title('En rubrik') ax.set_ylabel('Y-etikett') ax.set_xlabel('X-etikett') ax.set_ylim(-10, 10) ax.set_xlim(-10, 10) # Skapar rutnät ax.grid(True) ax.plot([-10,2,10], [3,5,-2], linewidth = 3) plt.show()

Resultatet som mpl_connect() fångar upp, överlämnas till klickhanterare() som i detta enkla exempel skriver ut det som ett talpar.

Page 163: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 161

-2.75 1.8073593073593077 4.745967741935486 -0.41125541125541076 1.5967741935483861 4.350649350649352 ...

Det är nu upp till dig att få funktionen klickhanterare() att göra något bättre av koor-dinaten än att bara skriva ut den, som att till exempel starta uppritningen av ett nytt, specialiserat diagram.

14.5.2. Identifiera grafer i diagrammet Nästa steg är att rita upp ett diagram med två linjer och låta programmet ta reda på vil-ken av linjerna användaren klickade på, och var.

# två_interaktiva_linjer.py import matplotlib.pyplot as plt def klickhanterare(händelse): # Hämta linjens etikett utvald_linje = händelse.artist print(utvald_linje.get_label()) # Hämta x- och y-data från den linje som klickats # xdata och ydata är listor med linjens alla # koordinater xdata = utvald_linje.get_xdata() ydata = utvald_linje.get_ydata() # Närmaste koordinat anges av event.ind utvalt_index = händelse.ind print('Närmsta punkt:', xdata[utvalt_index], ydata[utvalt_index]) # fig är huvudobjektet som byggs upp av alla delobjekten fig = plt.figure() fig.canvas.mpl_connect('pick_event', klickhanterare) # Anger hur stort koordinatsystemet ska vara ax = fig.add_subplot(111) # Anger diagramrubriken ax.set_title('En rubrik') ax.set_ylabel('Y-etikett') ax.set_xlabel('X-etikett') ax.set_ylim(-10, 10) ax.set_xlim(-10, 10) # Skapar rutnät ax.grid(True) ax.plot([-10, 2, 10], [3, 5, -2], linewidth = 3, label = 'blå-linje', color = 'blue', picker = 5) ax.plot([7, -9, 9], [-3, -8, 4], linewidth = 3, label = 'grön-linje', color = 'green', picker = 5) plt.show()

Programmet visar nu två linjer, definierade med två plot-satser.

Page 164: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 162

Klickar du i närheten av en linje, där ”närheten” anges i argumentet picker=5 som ska-par ett aktivt närområde kring grafen, anropas klickhanteraen. Den tar reda på linjens etikett (namn) så som det angivits i plot-satsen och skriver ut detta. Härnäst hamnar alla linjens koordinatpunkter i listorna xdata och ydata. Den närmaste koordinaten, alltså den man förhoppningsvis har klickat på, väljs ut genom att händelse.ind innehåller det index som pekar ut närmaste koordinat i listorna i xdata och ydata.

blå-linje Närmsta punkt: [-10] [3] grön-linje Närmsta punkt: [-9] [-8] blå-linje Närmsta punkt: [2] [5]

Utöver att bara registrera musklick ('button_press_event', ’pick_event’) finns det ytterli-gare händelser som tangenttryck, att figuren storleksförändras, att objektet markeras osv, som programmet kan reagera på.

Page 165: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX MATPLOTLIB – grafik

RÄKNA MED PYTHON 163

14.5.3. IV Flera dataserier Förändra programmet från sidan 156 så att det kan rita ut flera dataserier samtidigt. Re-sultatet ska se ut så här.

De tre dataserierna ska kallas L1, L2 och L3. Den elektriskt bevandrade känner igen namnen som de tre faserna i ett trefassystem. L2 ligger 2/3π radianer förskjuten mot L1 och L3 ligger 4/3π radianer förskjuten. Totalt är enhetscirkeln 6/3π eller 2π, men för att resultatet ska bli lättförståeligt ska programmet stega ända till 4π.

Det var en hel del. Dokumentationen till matplotlib.pyplot finns att hämta under ru-briken Om Matplotlib på http://huvudrutin.se/index.php/lankar

14.6. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 166: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 164

15. IX SymPy – symbolisk matematik

Pythons variabler är en behållare som kan tilldelas ett värde, men i algebra vill man kunna definiera en symbol som man kan räkna med, och fylla med ett värde senare. Följande kan du till exempel inte göra med Pythons vanliga variabler:

x + 2x + 1 = 3x + 1

Som tur är finns kodbiblioteket SymPy som är avsett att lösa symboliska matematiska problem. SymPy är helt och hållet skrivet i Python.

Det är ingen hejd på vad SymPy kan hjälpa till med inom matematiken: trigonometri, po-lynom, integraler, diffekvationer och ekvationssystem, permutationer, talteori (exempel: primtal), matriser, geometri, fysik, statistik, kryptografi och, som sagt, grafisk utmatning.

SymPy använder delvis rutinbiblioteket matplotlib för att mata ut diagram. Här visas tre typer av kurvor som svar på olika ekvationer: en sinuskurva med övertoner, en andra-gradsekvation och en tredimensionell yta baserad på en sinusvåg.

Algebra, alltså praktisk användning av Sympy, behandlas på sidan 249.

15.1. Definiera symboler

>>> from sympy import Symbol >>> x = Symbol('x')

På första raden importeras klassen Symbol från modulen Sympy och används på andra raden för att definiera symbolen x för att den ska kunna användas i symboliska uttryck. x:et till vänster om likhetstecknet är en helt vanlig pythonvariabel av klassen symbol.

Börja med att mata in uttrycket i avsnittets inledning i Thonny och se resultatet.

>>> x + 2 * x + 1

Vid körning visas:

3*x + 1

Det går att definiera hur många symboliska variabler som helst, som:

>>> y = Symbol('y') >>> z = Symbol('z')

Page 167: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 165

15.2. Snygga utskrifter med Pretty Print

Potenser skrivs i ”vanliga” Python som ** och precis detsamma gäller vid symbolisk han-tering. Prova ett enkelt potensuttryck.

>>> (x + y)**2

Vid körning visas:

(x + y)**2

och det ser inte särskilt spännande ut. Det finns en funktion kallad Pretty Print som kan skriva ut uttrycket mera som du är van vid att skriva för hand från matematiklektioner-na. Pretty Print är en funktion som måste importeras från Sympy.

>>> from sympy import pprint >>> pprint((x + y)**2)

Vid körning visas:

2 (x + y)

Mycket snyggare!

15.3. Konvertera textsträngar till ett symboliskt uttryck

Sympify är ett tillbehör till Sympy som kan ta emot ett uttryck som en textsträng från användaren och göra om den till ett symboliskt uttryck, som Sympy därefter kan behandla den som ett sådant och göra flera saker med den. På så sätt kan du få Python att lösa och plotta ekvationer utan att användaren behöver förstå något alls om Sympy eller symbolisk matematik i Python.

>>> ekv = sympify('3 * b + 2 * h')

Resultatet blir

>>> ekv 2*b + 2*h

15.4. Substitution

För att få veta det verkliga värdet av en ekvation, måste symbolerna ersättas (substitue-ras) med numeriska värden.

Börja med att tilldela den symboliska ekvationen till en variabel.

>>> ekv = (x + y)**2

Fortsätt med att ge x värdet 3 och y värdet 5. För att få Sympy att beräkna det, används funktionen subs(), som byter ut symbolerna mot värden i form av tupler i en lista. subs() behöver inte importeras.

>>> ekv.subs([(x, 3), (y, 5)]) 64

Page 168: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 166

Utöver att ersätta symboler med numeriska värden, kan subs() ersätta en symbol med ett uttryck. x skulle kunna ersättas med y+1 och då kommer ekvationen att förändras på motsvarande sätt.

>>> ekv.subs([(x, y + 1)]) (2*y + 1)**2

15.5. Förenkling

Sympy har en hel mängd olika funktioner för förenkling eller omskrivning av uttryck.

Simplify() är en generell funktion för förenkling av symboliska uttryck som på olika sätt försöker skapa den enklaste formen av ett uttryck. När den provat alla tillgängliga meto-der försöker den avgöra vilket svar som blev enklast, men en dator förstår egentligen inte begreppet ”enkel” så svaret kanske inte blir det allra enklaste. Det kan ta lång tid. Därför kan du själv prova andra metoder och se om det går att få ett enklare svar.

Prova följande i Thonny, men kom ihåg att du måste importera Simplify från Sympy.

>>> from sympy import simplify >>> simplify(x**2 + 2 * x + x) x*(x + 3)

Resultatet blir att simplify() bryter ut x. Det är åtminstone lite artificiell intelligens.

En av de förenklingsmetoder som du själv kan prova, kallas expand(). Den är en av de metoder som simplify() provar. Den utvecklar polynomiska uttryck.

>>> from sympy import expand >>> expand((x + 2) * (x - 4)) x**2 - 2*x – 8 >>> pprint(expand((x + 2) * (x - 4))) 2 x - 2*x - 8

Expand låter ju inte direkt som en förenkling, utan skulle kunna göra uttrycken större, men ibland händer det att olika termer tar ut varandra, vilket ändå gör uttrycket enklare. För att se om den kan förenkla på ett bättre sätt kan du prova med följande exempel.

>>> expand((x + 2) * (x - 4) – x**2) -2*x - 8

Nu blev det resultat!

Factor är en annan förenklingsmetod, som tar ett polynom och faktoriserar det till fakto-rer som inte kan reduceras vidare. factor() är motsatsen till expand(). Prova med ett komplext uttryck. För att förenkla för läsaren har resultatet av faktoriseringen tilldelats variabeln resultat och utskriften görs med pprint.

>>> from sympy import factor >>> resultat = factor(x**4 – x**3 + 3 * x**2) >>> pprint(resultat) 2 / 2 \ x *\x - x + 3/

Page 169: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 167

Med funktionen collect() samlas alla likadana potenser i ett uttryck ihop till enklare former. collect() vill veta vilken symbol som ska brytas ut. I första försöket har vi valt x.

>>> from sympy import collect >>> resultat = collect(x**2 * y + 2 * x**2 + 3 * y, x) >>> pprint(resultat) 2 x *(y + 2) + 3*y

Men det går bra att prova med symbolen y också.

>>> resultat = collect(x**2 * y + 2 * x**2 + 3 * y, y) >>> pprint(resultat) 2 / 2 \ 2*x + y*\x + 3/

Det finns ytterligare ett tiotal funktioner som gör ungefär samma sak. Dem kan du själv läsa mera om under rubriken Om Sympy på http://huvudrutin.se/index.php/lankar

Oavsett hur ekvationen förenklats kommer det numeriska resultatet som beräknas med subs() givetvis alltid att bli detsamma.

15.6. Lösning av ekvationer

Tidigare har vi låtit Sympy lösa ekvationer symboliskt, men ska man ha någon nytta av ekvationen måste den lösas numeriskt. Den måste bli lika med ett numeriskt värde.

Det enklaste fallet är att hitta ett nollställe, alltså där den linje som beskrivs av ekvatio-nen, skär x-axeln. Vad är x när följande gäller?

3x+1=0

Python löser det så här med funktionen solveset():

>>> from sympy import solveset >>> solveset(3 * x + 1) {-1/3}

Om man inte anger ett argument för högerledet till solveset() antas noll.

Vill du lösa ekvationen för ett värde, som till exempel 4, måste du tillgripa klassen Eq() som tar emot två parametrar, nämligen ekvationen och högerledet.

>>> from sympy import Eq >>> solveset(Eq(3 * x + 1, 4)) {1}

En andragradsekvation har två nollställen. Det visar solveset() så här.

>>> solveset(Eq(3 * x ** 2 + 1, 4)) {-1, 1}

Page 170: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 168

15.7. Derivata och integraler

Några av de tyngsta ämnena inom matematiken kan med funktionen diff() hjälp förenk-las till en enkel knapptryckning. Derivatan anger förändringshastighet hos en funktion. Derivatan av en funktion kan deriveras en gång till, andraderivatan och anger då accele-rationen, och så vidare. Med Sympy blir det enkelt.

f(x) = x2 och f '(x) = 2x

>>> from sympy import diff >>> diff(x ** 2) 2*x

För att styra deriveringen kan du tala om för diff() vilken variabel du vill derivera, samt vilken derivata du vill ha, första-, andra- eller tredjederivatan.

>>> diff(x ** 2, x, 2) 2

Första parametern till diff() är alltid uttrycket, medan de påföljande är frivilliga. Andra parametern är den variabel du avser derivera, medan tredje parametern anger graden av derivata.

Integraler löses med funktionen integrate(). Integralen beskriver arean under en kurva som skapats av ett matematiskt uttryck, som en sinusvåg, eller energin som utlöses under ett elektriskt förlopp.

Integralen av cosinus är sinus. Det kan man enkelt bevisa genom att låta funktionen in-tegrate() arbeta med saken och utvärdera uttrycket symboliskt.

)cos(x dx

>>> from sympy import integrate >>> from sympy import sin, cos >>> integrate(cos(x)) sin(x)

Även integraler kan skrivas ut med Pretty Print. Kom bara ihåg att berätta för pprint() att det rör sig om en integral, samt att importera funktionen med samma namn. Interval-let anges som argument till klassen integral().

1

0

)cos(x dx

>>> from sympy import Integral >>> pprint(Integral(cos(x), (x, 0, 1))) 1 / | | cos(x) dx | / 0

Page 171: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 169

Arean under en kurva som beskrivs av ett matematiskt uttryck, kan fås genom att integ-rera kurvan mellan ett start- och ett slutvärde. Så här går det till att integrera en linjär, lutande kurva som beskrivs av funktionen f(x)=2x+2, där x går från 0 till 4.

Den numeriska lösningen på arean under kurvan beräknas så här.

4

0

22x dx

>>> integrate(2 * x + 2, (x, 0, 4)) 24

15.8. Gränsvärden

Ett gränsvärde för en funktion beskriver funktionens värde när dess argument kommer tillräckligt nära en viss punkt eller växer sig oändligt (eller tillräckligt) stora.

Gränsvärdena kan anta oändliga värden. Värdet för funktionen x

1 blir odefinierat när x

går mot noll. För att undersöka extrempunkterna används funktionen Limit() och x ste-gas mot extrempukterna från den positiva och negativa sidan. När man stegar från mi-nussidan kommer resultatet att gå mot minus ∞, men går man från den positiva sidan går värdet mot plus ∞. Vid värdet noll kan man inte veta om värdet är positivt eller nagtivt. Då är det odefinierat.

Mata in programmet nedan och spara det som limes.py. Funktionen oo kan verka mys-tisk, men det är en klass som hjälper Python att hantera oändligheten (∞). Funktionsnm-net oo skrivs som två gemena o.

# limes.py from sympy.plotting import plot from sympy import Symbol, Limit, oo, pprint x = Symbol('x') # Limit skapar en oberäknad (unevaluated) sats. # Vill man skapa en utvärderad sats så kan man använda # limit (med litet l). x_går_mot_0_från_negativ_sida = Limit(1/x, x, 0, '-') # Visa uttrycket pprint(x_går_mot_0_från_negativ_sida) print() # Beräkna värdet när vi går... # doit() är funktionen som gör själva utvärderingen. print(x_går_mot_0_från_negativ_sida.doit()) # Låt X gå mot noll från positiva sidan x_går_mot_0_från_positiv_sida = Limit(1/x, x, 0, '+') # Visa uttrycket pprint(x_går_mot_0_från_positiv_sida) print()

Page 172: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 170

# Beräkna värdet när vi går print(x_går_mot_0_från_positiv_sida.doit()) p = plot(1 / x, ylim = (-15, 15), xlim = (-15, 15)) p.show()

Körningen ger två resultat. Det första visas med Pretty Print.

>>> %Run limes.py 1 lim - x->0-x -oo 1 lim - x->0+x oo

Dessutom får du ett diagram som visar hur kurvan närmar sig plus och minus oändlighe-ten.

Page 173: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 171

15.9. Plotta funktioner

Hittills har vi bara visat ekvationer och funktioner som symboliska uttryck. För att öka förståelsen, visa nollställen och så vidare, kan de plottas grafiskt med Sympy.

Låt oss återanvända de ekvationer som nämnts tidigare. För att plotta med Sympy, måste du importera plottfunktionen plot().

>>> from sympy.plotting import plot >>> plot(cos(x))

Vid körning visas följande

Om programmet inte verkar vilja ta slut i Thonny beror det på att du inte stängt fönstret med den plottade kurvan.

Om inget annat sägs, löper x från -10 till 10.

Vill du ange specifika värden för intervallet, kurvans egenskaper, axlarnas längd etc, gäll-er samma metoder som i matplotlib, se vidare sidan 139.

Den linjära ekvationen 3*x + 1 plottas så här.

>>> plot(3 * x + 1)

Page 174: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 172

Om du anstränger dig kan du se nollstället vid 31 .

Den kvadratiska ekvationen 3 * x**2 + 1 ska lösas med högerledet lika med 4. Då måste den skrivas om som (3 * x**2 + 1)–4, för att få högerledet lika med noll.

>>> plot((3 * x**2 + 1)-4, ylim = (-4,2), xlim = (-2,2))

En kvadratisk ekvation har två nollställen, i det här fallet +/–1 och för att de ska synas ordentligt har diagrammet skalerats om med parametrarna ylim och xlim.

15.9.1. Övning – Förenklingar och diagram Skriv ett menyprogram som tar emot en text, som givetvis ska vara ett korrekt uttryck, och konverterar den till ett uttryck med sympify() och, beroende på menyval:

a) genomför en förenkling med funktionen simplify() och skriver ut den med Pretty print.

b) plottar uttrycket med funktionen plot() från Sympy.

c) genomför en numerisk lösning med funktionen solveset() och löser ut exempelvis va-riabeln x.

Page 175: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SYMPY – SYMBOLISK MATEMATIK

RÄKNA MED PYTHON 173

15.10. Plotta i tre dimensioner

Vissa ekvationer har egenskaper som gör det lämpligt att visa dem som ytor. Det skulle kunna röra sig om statistiska datamängder med värdetripplar (x,y,z), som folkmängd mot medellivslängd mot yrke eller förekomsten av uran på ett särskilt markområde.

En mycket vanlig, men högst teoretisk sådan funktion är att visa en sinusfunktion som kan vridas i tre dimensioner.

>>> from sympy.plotting import plot3d >>> plot3d(sin(x ** 2 + y ** 2), (x, -3, 3), (y, -3, 3))

Vid körning

I Thonny kan du ta tag i kurvan och vrida den i höjd- och sidled.

15.11. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 176: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LÄSA CSV-FILER

RÄKNA MED PYTHON 174

16. IX Läsa CSV-filer

Det finns mängder av statistiskt data fritt tillgängligt ute i vida världen. Du måste bara kunna få in det i dina program. Det kan du göra genom att välja ut lämpliga data på leve-rantörens webbplats och be om att få hämta det. Data levereras som en fil i något (relativt känt) filformat. De två vanligaste filformaten är CSV-filer och SQL-databaser.

Statistiska myndigheter, som Statistiska Centralbyrån (SCB) brukar visa upp sitt siffer-material på Internet. Därifrån kan det hämtas i en mängd olika filformat, där det vanli-gaste är CSV. Data från många svenska myndigheter är öppet och kan användas fritt av var och en.

Ett annat ställe där det finns mycket intressant, helt öppet data är Hans Roslings stati-stikwebbplats Gapminder.

16.1. CSV-filer i praktiken

Som tur är, är världen (nästan) överens om hur ett av de vanligaste filformaten ska vara sammansatt. Förkortningen CSV betyder Comma Separated Values, eller kommasepare-rade värden.

I en typisk statistiktabell har varje kolumn en kolumnrubrik och varje datarad har en radrubrik. En kommaseparerad textfil innehåller rubriker och data i en eller flera kolum-ner. Formatet är enklast möjliga. Filen är en helt vanlig textfil utan dolda koder och varje rad avslutas med ett nyradstecken.

Kolumnerna i varje datapost, alltså dataraden i filen, separeras av ett komma. Sifferupp-gifter åtgärdas inte särskilt, medan textsträngar och olika styrtecken omges av dubbla citationstecken. Decimaltal får inte ha decimalkomma, utan måste ha decimalpunkt.

Page 177: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LÄSA CSV-FILER

RÄKNA MED PYTHON 175

16.1.1. Hämta data från Statistiska Centralbyrån SCB har statistik över hushållens inköp av olika varugrupper, som bakverk, frukt och konfektyr. Det ska vi titta närmare på, för att få reda på om svenskarna är hälsosamma och om så, hur konsumtionen av hälsosamma varor har förändrats med åren. Börja med att besöka SCB på Internet, på adressen http://www.statistikdatabasen.scb.se.

Längst ned på förra sidan ser du menyalternativet Handel med varor och tjänster. Klicka på det, så vecklas en undermeny ut.

Välj Livsmedelsförsäljning fördelad på varugrupper och därpå ...livsmedel och drycker...

Då visas en urvalssida där du får ange exakta tabellrader.

Page 178: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LÄSA CSV-FILER

RÄKNA MED PYTHON 176

Behåll fliken Välj variabel öppen

1. Välj Tabellinnehåll > Löpande priser.

2. Välj därefter Varugrupp > COICOP 5-siffernivå. Då visas en utökad lista med va-rugrupper.

3. Håll ned Ctrl, bläddra i listan och markera följande rader: 01.1.1.4 Bakverk 01.1.6.1-7 frukt (färsk, kyld eller fryst) 01.1.8.3-6 konfektyr, choklad och glass

4. Fortsätt hålla Ctrl nedtryckt och välj 2011-2016 i listan År.

5. Avsluta med att välja tabellayout (eller bara låta bli att ändra) Tabell – Layout 1.

6. Klicka på knappen Fortsätt. Då visas tabellen på webbsidan.

Nu vet du vad du har att vänta dig. Backa tillbaka till sidan med variabelval och ändra tabellayouten längst ned till Kommaavgränsad utan rubrik och klicka på knappen Fortsätt. SCBs webbserver kommer nu att börja överföra filen till din dator. Windows reagerar genom att visa en Öppna-ruta med texten ”Du har valt att öppna HA0103A1.csv” och bekräftar att det är en fil av typen Comma Separated Values.

Som standard vill Windows öppna sådana filer i Excel, men du ska välja Öppna med > Annat program och i listan Välj hjälpprogram och välja en enkel textredigerare, ex-empelvis Anteckningar. Klicka OK två gånger varpå CSV-filen visas i textredigeraren Anteckningar.

Page 179: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LÄSA CSV-FILER

RÄKNA MED PYTHON 177

Studera texten, jämför med webbvisningen och spara därefter filen i den katalog där du har dina pythonprogram.

16.1.2. Titta närmare på en CSV-fil Råfilen ser ut så här. Det konstiga tecknet behandlas längre fram.

"varugrupp","2011","2012","2013","2014","2015","2016" "01.1.1.4 bakverk",4439,4627,4889,5186,6022,6319 "01.1.6.1-7 frukt (f█rsk, kyld eller fryst)", 10704,11269,11934,13120,17756,15647 "01.1.8.3-6 konfektyr, choklad och glass", 20606,21183,22225,23236,25201,27036

Första dataraden innehåller kolumnrubrikerna (årtalen), medan alla påföljande data-rader har radrubriken (varugruppen) först. SCB har som standard att alltid uttrycka kolumnrubriker som text. Därför visas årtalen som text, omgivna av citationstecken. Ob-servera att den första kolumnen har kolumnrubriken ”varugrupp”, vilket lämpligen an-vänds till rubrik på x-axeln vid grafisk visning. Den kolumnrubriken syns inte i webbvis-ningen i förra bilden.

Råfilen har inga snygga kolumner, utan du får till att börja med tänka dig kommatecknen som kolumnavgränsare.

De mystiska värdena ”01.1.1.4” med flera i radrubrikerna är en klassificering som kallas COICOP som tagits fram av FN för att ange olika kundgruppers konsumtion, som du inte behöver bry dig om. Du kan ha den kvar eller sudda bort den.

Eventuellt får du se konstiga bokstäver, eftersom vi svenskar har skaffat oss ett problem med våra ”specialtecken” ÅÄÖ. Tabeller från SCB har tecknen kodade enligt standarden ISO-8859-1 (som i Windows kallas för Windows Västerländsk) medan Python använder sig av UTF-8 (som i Windows kallas för Unicode). Data på ISO-8859-1-format kommer att bli fel när de visas i program som förväntar sig UTF-8, som är det format som används för exempelvis textredigering och e-post i Windows. Det är samma fenomen som får e-post från andra system att innehålla konstiga tecken istället för ÅÄÖ. Det är emellertid lätt att åtgärda. Se programkoden.

16.2. Inläsning av CSV-filer i Python

Python har färdiga moduler för att läsa data från CSV-filer och lägga värdena i listor. I det kommande programexemplet placeras innehållet i en lista (statistik[]) av listor (varu-grupp[]). Varje datarad blir en lista, som i sin tur ligger i en yttre lista, alltså en tvådi-mensionell datamatris.

Page 180: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LÄSA CSV-FILER

RÄKNA MED PYTHON 178

Flödesschemat för funktionen läs_csv ser ut så här. Jämför med programmet på nästa sida.

CSV-filen hämtas in i Python med funktionen open(). Man säger att man öppnar filen. Inparametrarna ska vara filnamnet och sökvägen till filen och dessa kommer till funktionen som ett argument i anropet. Eftersom du bör ha sparat filen i samma katalog som pythonfilen, behövs ingen sökväg. Fil-namnet HA0103A1.csv anges i hu-vudrutinen som börjar längst ned.

Tolkningen av filen sker med den im-porterade funktionen csv.reader() och överföringen till listorna görs med påföljande for-slingor.

csv.reader börjar med att överföra filens innehåll till ett objekt kallat csv_läsare, som är rad- och kolumn-indelat. I övrigt behöver du inte veta hur objektet är konstruerat.

Det första som händer är att satsen statistik.append (next (csv_läsare)) överför objektets första rad, som är rubrikraden, till första listan i matrisen statistik (bygg ru-brikraden). Den första for-slingan ste-gar sig därefter igenom objektets åter-

stående tre rader och den andra for-slingan fyller på en ny varugrupps-lista med poster-na i varje rad i csv_läsare. Textposter flyttas över som de är, medan numeriska poster görs om till heltal.

När läsningen är klar, stänger du filen med close() eftersom det tillhör praxis att städa upp efter sig i datorn och stänga filer som inte längre används.

# läs_csv.py import csv import os.path import matplotlib.pyplot as plt # Läser in CSV-fil def läs_csv(filnamn): statistik = [] # Testa att filen finns if os.path.exists(filnamn) == False: # Finns den inte så returnera en tom lista. return statistik # Öppna filen fil = open(filnamn, encoding = "ISO-8859-1")

Page 181: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LÄSA CSV-FILER

RÄKNA MED PYTHON 179

# Läs in filen csv_läsare = csv.reader(fil) # Skapa första listan som består av rubriker # som beskriver data som följer på kommande rader. statistik.append(next(csv_läsare)) # Läs in rad för rad for rad in csv_läsare: varugrupp = [] # Hämta ut varje i raden for post in rad: # Är det numeriskt värde konvertera if (post.isnumeric()): varugrupp.append(int(post)) else: # Annars, lägg in textrepresentationen varugrupp.append(post) # Lägg till raden i statistik statistik.append(varugrupp) # Stäng filen fil.close() # Skicka tillbaka listan med statistik return statistik # Huvudrutin stat = läs_csv("HA0103A1.csv") print (stat)

ÅÄÖ-problemet åtgärdas med encoding-argumentet i satsen som öppnar filen: fil = open(filnamn, encoding="ISO-8859-1").

Vid körningen visas listan med listor så här.

[['varugrupp', '2011', '2012', '2013', '2014', '2015', '2016'], ['01.1.1.4 bakverk', 4439, 4627, 4889, 5186, 6022, 6319], ['01.1.6.1-7 frukt (färsk, kyld eller fryst)', 10704, 11269, 11934, 13120, 17756, 15647], ['01.1.8.3-6 konfektyr, choklad och glass', 20606, 21183, 22225, 23236, 25201, 27036]]

Notera de yttre [ ] i början och slutet av utskriften, som anger att det är en yttre lista som innehåller 4 inre listor. Det här är lika läsovänligt som själva CSV-filen, men data har nu fått ett format som kan vidareförädlas i Python.

16.2.1. Allt blir bättre med ett diagram Som sann statistiker vill du se data representerat i ett diagram. Då lägger du till plottru-tinen nedan, och förändrar huvudrutinen så som visas.

# Visa datat som en linjegraf. def visa_graf(statistik): # Är listan tom? if not statistik: return

Page 182: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LÄSA CSV-FILER

RÄKNA MED PYTHON 180

# Från rubrikerna, hämta ut de rubriker # som beskriver resp. datakolumn. Låt vara X axel x = statistik[0][1:] linjer = [] # Använd en slinga och sök igenom samtliga rader från # rad 1 och till slutet av listan for y in statistik[1:]: # Lägg in kurvan i variabeln linje och # listan linjer linje, = plt.plot(x, y[1:], label=y[0], linewidth=5) linjer.append(linje) # Visa förklaringen plt.legend(handles=linjer, bbox_to_anchor=(1, 0)) # Visa grafen plt.show() # Huvudrutin stat = läs_csv("scb_HA0103A1.csv") visa_graf(stat)

Vid körning produceras följande diagram.

Nu ser du klart och tydligt att svenskarna har blivit mindre hälsosamma med åren. För-brukningen av godis är betydligt större än förbrukningen av frukt. Förbrukningen av frukt går dessutom ned, medan förbrukningen av godis går upp. Vi har blivit en nation av gottegrisar.

Page 183: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LÄSA CSV-FILER

RÄKNA MED PYTHON 181

16.3. Övningar på CSV-filer

Hämta en annan CSV-fil från Statistikdatabasen hos SCB och plotta flera diagram, exem-pelvis rörande befolkningens utbildning från olika årtal. Plotta kurvor för nationell bak-grund, ut- och invandrare med mera. Stäm eventuellt av med din SO-lärare om denne har ytterligare intressanta uppslag.

Se vidare övningar i övningsavsnittet klasser, på sidan 227.

16.3.1. Stöd och hjälp Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 184: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 182

17. IX Arbeta med SQL-databaser

Datorns huvuduppgift har sedan tidernas begynnelse varit att ta emot data, bearbeta den och ordna den på ett sätt som gör att man lättare kan leta, hitta och sammanställa ett resultat som förhoppningsvis har ökat värdet i någon mening, antingen kunskapsmässigt, pedagogiskt eller ekonomiskt. Det är att omvandla data till information.

17.1. Introduktion till databaser

En databas är en samling information som är strukturerad och samlad på en plats. Infor-mationen kan manipuleras på olika sätt. Man kan hämta, ändra, sudda och lägga till in-formation.

Informationen i en databas hanteras på olika sätt med SQL-kommandon. Structured Que-ry Language (SQL) är ett standardiserat frågespråk som utvecklades av IBM redan i bör-jan av 1970-talet och numera förekommer i flera olika varianter från olika tillverkare.

Databasfilen som sådan kan inte användas ”rått” utan måste tillhandahållas av en data-basmotor (database engine).

Det finns två typer av databaser, nämligen filbaserade, som till exempel SQLite och ser-verbaserade som PostgreSQL och MariaDB. De filbaserade är intressantast för skolbruk eftersom de lagras och hanteras lokalt på din egen dator, medan de serverbaserade är in-tressantare för företagsbruk. I och med att gränssnittet är standardiserat kan en pro-grammerare med kunskap om SQL använda alla databaser på marknaden.

Page 185: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 183

17.1.1. Översikt Avsnittet visar principen för alla de operationer du kan utföra med en databas, som att ansluta till den, plocka data ur den, sätta in nytt data och avsluta jobbet genom att stänga förbindelsen.

Det allra viktigaste är den lilla krokiga pilen i bilden ovan, som kallas relation. En data-bas består av en eller flera tabeller uppbyggda av rader och kolumner med innehåll som har ett samband. Det kan till exempel vara en tabell med personer och en med deras adresser och telefonnummer.

I hela detta kapitel kommer vi att arbeta med databsen katter-som-jagar.db som är en liten databas som håller reda på Nationella Råttinsatsgruppens telefonnummer. Råttjäga-re behöver flera telefoner, både stationära och mobila som kan tas med på utryckningar.

Nästa bild visar tabellerna i databasen i detalj. Du ser att båda tabellerna har den nöd-vändiga ID-kolumnen och hur flera poster i Telefonnummer hör samman med en post i Person.

Relationen är en enkel siffra i en tabell som kan användas för att peka ut en rad i en an-nan tabell. Så gör man för att det ska vara lätt att koppla en person till två eller flera adresser och ett antal telefonnummer (hemtelefon, jobbtelefon, mobil etc). När personen byter telefonnummer, eller skaffar sju telefoner till, är det allra enklast att bara uppdate-ra tabellen med telefonnummer och inte hela databasen. Relationen förblir densamma!

En databas som hanteras på detta sätt kallas för relationsdatabas.

Page 186: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 184

17.1.2. Primärnyckel Det enklaste sättet att unikt identifiera en rad (post) är att använda sig av tabellens pri-märnyckel eller ID. En primärnyckel är en speciell kolumn i en tabell som är avsedd att på ett unikt sätt identifiera en rad i tabellen. Denna kolumn kan också kallas ID-kolumn.

Primärnyckeln skulle till exempel kunna vara radnumret i tabellen, eller personnumret i en tabell med personer, eller varför inte namnet, om detta är unikt. Rent teoretiskt skulle primärnyckeln kunna vara det löpande radnumret, men det fungerar inte om man exem-pelvis tar bort första raden. Då kommer alla kvarvarande rader att få sin nyckel förskju-ten med ett och alla relationer till andra tabeller att bli fel. Därför är nyckeln en siffra i en separat kolumn, som följer med när man tar bort eller lägger till rader.

En primärnyckels huvudegenskaper är:

Den måste innehålla ett unikt värde för varje datarad.

Den kan inte innehålla värdet null.

17.2. Praktiska exempel med SQLite3-tolken

I denna bok används databasmotorn SQLite som är mycket lättanvänd. Hela databasen lagras som en enda fil på hårddisken. SQLite används i många applikationer för intern datalagring.

Alla kommandon som visas, fungerar i princip med alla andra databasmotorer också efter-som boken följer grundläggande syntax som standardiserats i ANSI SQL. Används någon annan databas på din skola, så fungerar SQL-satserna ändå likadant.

I detta kapitel kommer vi att arbeta både ”rått” med SQLite-tolken och med Python, dels för att du ska förstå skillnaderna och likheterna, och för att du ska förstå hur SQL kan tillämpas i ett program.

Hur du hämtar hem tolken, installerar och startar den, beskrivs i kapitel 28.4.1.

I början ska du bara skapa en liten databas. Bara några hundra byte, men databaser kan bli hur stora som helst. Fundera på hur många gigabyte databasen över hela den svenska befolkningen med namn, adresser, ålder, födelseort med mera, kan bli.

Starta tolken. När den gått igång öppnas ett terminalfönster med svart bakgrund. Här visas dock texten som vanligt med gul bakgrund.

SQLite version 3.26.0 2018-12-01 12:34:55 Enter ".help" for usage hints. Connected to a transient in-memory database. Use ".open FILENAME" to reopen on a persistent database. sqlite>

Rad 1, 2 och 4 är information som du inte behöver bry dig om. På rad 3 står det att det rör sig om en ”transient” databas. Den är tillfällig och finns bara i datorns primärminne och inte på hårddisken. Vad det innebär ska du få lära dig längre fram.

På femte raden står sqlite>. Det är prompten som betyder: Varsågod att skriva kom-mandon!

Börja med att skapa en databas med kommandot .open. och kalla databasen katter-som-jagar.db,

sqlite> .open katter-som-jagar.db

Page 187: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 185

Tolken accepterar detta och skapar en tom databas och svarar bara med en ny prompt.

Kommandona har hittills varit styrkommandon till tolken. De börjar med punkt och av-slutas inte med semikolon. I fortsättningen visas SQL-kommandon, som ska avslutas med semikolon.

17.2.1. CREATE

Skapa nu den första tabellen i databasen. Den ska heta Person. Katter har personlighet. Alltså är de personer.

sqlite> CREATE TABLE Person ( ...> id INTEGER PRIMARY KEY AUTOINCREMENT, ...> namn VARCHAR(128) ...> );

Tabellen ska innehålla två kolumner, nämligen id och namn.

id ska vara heltal (INTEGER), ska anses vara primärnyckel (PRIMARY KEY) och för var-je tillägg du gör i databasen ska id räknas upp med ett (AUTOINCREMENT). id kommer i detta fall att fungera som radnummer, men ta det inte för givet i fortsättningen.

namn ska vara text (VARCHAR) och får maximalt bli 128 tecken lång.

...> är ett fortsättningstecken som tolken matar ut, eftersom den har förstått att kom-mandot inte är slut än. Det betyder att du får fortsätta att skriva kommandot på nästa rad. Tolken kommer att skarva ihop alla fortsättningsrader tills du avslutar med en rad med högerparentes och semikolon. Du hade kunnat skriva allt på en enda lång rad, men det blir snyggare och överskådligare att dela upp kommandot på flera rader.

17.2.2. Undersök schemat med .schema För att vara säker på att tabellen blev korrekt, kan du verifiera det med kommandot .schema.

sqlite> .schema CREATE TABLE Person ( id INTEGER PRIMARY KEY AUTOINCREMENT, namn VARCHAR(128) ); CREATE TABLE sqlite_sequence(name,seq);

Jodå. Du ser klart och tydligt att databasen har en tabell som heter Person, med de två kolumnerna id och namn och deras variabeltyper. Du ser också att id kommer att inkre-menteras automatiskt. Du lyckades!

Du ser dessutom att databsen innehåller tabellen sqlite_sequence. Den är avsedd för systemets interna hushållning och kan inte användas av dig.

Denna metod kan du alltid använda om du vill verifiera att en databas är korrekt, eller om du fått en databas av någon, som du inte vet schemat för.

Page 188: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 186

17.2.3. INSERT Nu har det blivit dags att fylla på tabellen Person med de tre jägarkatternas namn.

sqlite> INSERT INTO Person (namn) VALUES ('Nova'); sqlite> INSERT INTO Person (namn) VALUES ('Oliver'); sqlite> INSERT INTO Person (namn) VALUES ('Gaston');

På första raden i kolumnen namn i den tomma tabellen Person stoppar vi in (INSERT INTO) värdet Nova. Vid nästa INSERT kommer autoincrement att peka ut rad 2 där namnet Oliver hamnar. Gaston hamnar på samma sätt på rad 3. Du behöver inte ange värdet på ID eftersom det ökas automatiskt.

Det går bra att backa till förra kommandot genom att trycka pil upp och sedan redigera raden och trycka Enter, snarare än att skriva om hela kommandot igen.

Du får bara en ny prompt efteråt, som anger att allt gick bra. Men hur bra?

17.2.4. SELECT Låt oss titta på innehållet i tabellen. Det är bekvämt att låta tolken skriva ut alla kolumn-rubriker vid varje svar för att du lättare ska förstå vilka kolumner som visas.

sqlite> .headers on

SELECT-kommandot visar tabellen.

sqlite> SELECT * FROM Person; id|namn 1|Nova 2|Oliver 3|Gaston

SELECT * anger att alla kolumner i tabellen väljs ut för utskrift. SELECT betyder ”välj ut” och * är jokertecken (wild card) som betyder ”alla”.

Eftersom du tidigare angav .headers on, skrivs kolumnrubrikerna id|namn ut först.

Utskriften har här justerats så att värdekolumnerna är lika breda som kolumnrubrikerna. Så ser det inte ut på din skärm, utan det har bara gjorts i denna text för att öka överskåd-ligheten.

17.2.5. Fyll på telefonnummer

Nu över till tabellen med jägarkatternas telefonnummer.

Skapa tabellen Telefonnummer i databasen.

Page 189: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 187

sqlite> CREATE TABLE Telefonnummer ( ...> id INTEGER PRIMARY KEY AUTOINCREMENT, ...> person_id INTEGER, ...> nummer VARCHAR(128), ...> plats VARCHAR(128) ...> );

Alla tabeller måste ha en id-kolumn, så även denna. Den har samma funktion som tidiga-re, och heter också id.

Kolumnen person-id är något helt annat, nämligen ett värde programmeraren själv sät-ter. Det är identitetsnumret på telefonnumret, om en och samma person har fler än en telefon.

Så är det dags att fylla på tabellen med telefonnummer. Skriv antingen hela rader utan egna radbrytningar, eller låt SQLite göra radbrytningarna åt dig, på samma sätt som vi-sades vid CREATE på förra sidan.

sqlite> INSERT INTO Telefonnummer ...> (person_id, nummer, plats) ...> VALUES ('1', '018 61026', 'På landet'); sqlite> INSERT INTO Telefonnummer ...> (person_id, nummer, plats) ...> VALUES ('1', '070 61026', 'Mobil råttjakt'); sqlite> INSERT INTO Telefonnummer ...> (person_id, nummer, plats) ...> VALUES ('2', '070 61027', 'Mobil råttjakt'); sqlite> INSERT INTO Telefonnummer ...> (person_id, nummer, plats) ...> VALUES ('3', '070 61028', 'Mobil råttjakt');

INSERT-kommandot börjar med namnet på de kolumner du avser att fylla på, nämligen person_id, nummer och plats i den ordningen. Efter VALUES kommer de värden som ska sättas in i kolumnerna, exempelvis '1', '018 61026' och 'På landet'. Allt betraktas i detta fall som textsträngar.

Inmatningen verkar också ha gått bra, för tolken svarar med en ny prompt. Men som vi är försiktiga generaler vill vi se med egna ögon att allt blev rätt. Återigen får SELECT-kommandot arbeta.

sqlite> SELECT * FROM Telefonnummer; id|person_id|nummer |plats 1| 1|018 61026|På landet 2| 1|070 61026|Mobil råttjakt 3| 2|070 61027|Mobil råttjakt 4| 3|070 61028|Mobil råttjakt

Här ser du att personen med person-id 1 har två telefonnummer, ett som används i stu-gan på landet och ett som används vid operativ råttjakt.

Page 190: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 188

17.2.6. Kolumner i önskad ordning SELECT * matar bara ut kolumnerna i den ordning de finns i databasen. Men det går att mata ut kolumnerna i valfri ordning, till exempel den som anges i nästa SELECT-kommando.

sqlite> SELECT person_id, plats, nummer ...> FROM Telefonnummer ; person_id|plats |nummer 1|På landet |018 61026 1|Mobil råttjakt|070 61026 2|Mobil råttjakt|070 61027 3|Mobil råttjakt|070 61028

Som du ser har vi inte tagit med ID i utskriften. Det är inget krav att ID-kolumnen måste visas.

17.2.7. Hämta data från flera tabeller: relationer med WHERE

Så till relationen mellan de båda tabellerna Person och Telefonnummer. Du ska nu göra din första samkörning. Avsikten är att låta databasmotorn koppla ihop namnet på en person i den första tabellen med dennes telefonnummer i den andra tabellen, styrt av ett id. Eftersom det nu rör sig om två tabeller samtidigt, måste tabellnamnet kopplas ihop med kolumnnamnet i kommandot, som exempelvis person.namn.

sqlite> SELECT person.namn, telefonnummer.nummer, ...> telefonnummer.plats ...> FROM Person, Telefonnummer ...> WHERE Person.id == Telefonnummer.person_id ; namn |nummer |plats Nova |018 61026|På landet Nova |070 61026|Mobil råttjakt Oliver|070 61027|Mobil råttjakt Gaston|070 61028|Mobil råttjakt

Vi bryr oss inte om att mata ut några id längre, utan håller oss till de viktiga variablerna som är av intresse för den som vill ringa Nationella Råttinsatsgruppen: namn, telefon-nummer och plats.

SELECT utför relationskopplingen och pekar återigen ut vilka kolumner vi vill arbeta med, FROM anger från vilka tabeller data ska hämtas och WHERE är den viktiga relatio-nen som kopplar samman de båda identitetsbegreppen id och person_id.

Person.id == Telefonnummer.person_id

Page 191: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 189

Databasmotorn kommer alltså att passa ihop de datarader i de båda tabellerna som har samma identitetsbegrepp (inte radnummer).

Det är det som är samkörning. I gamla filmer gjordes det med rader av snurrande mag-netbandsrullar. Numera gör du det med ett enkelt kommando på tangentbordet. På Skat-teverket gör man precis samma sak när man ska koppla ihop personer i folkbokföringen med databaser med arbetsgivare, årsinkomster, inbetald preliminärskatt och så vidare för att kunna skriva ut deklarationsblanketter. Skatteverkets kommando blir något längre, men principen är densamma.

17.2.8. Korrekt avslutning Du slipper inte undan utan att städa upp efter dig. Databasen finns för närvarande bara i datorns primärminne. Den måste sparas på disken och därefter stängas. Annars försvin-ner den när du stänger av datorn.

sqlite> .exit

Det gör du genom att avsluta tolken med .exit-kommandot. .exit skriver ut databasen från minnet till hårddisken i den katalog där sqlite3.exe finns, vilket bör vara din Thon-ny-katalog.

Nu kan du titta efter med Utforskaren. Databasen finns i samma katalog som sqli-te3.exe. Databasen är inte särskilt stor. Bara 12 kilobyte.

17.2.9. Byta namn Vill du byta namn på din databas kan du göra det med .save-kommandot inna du gör .exit.

sqlite> .save katter-som-hoppar.db

17.2.10. Att se upp med Det finns programverktyg som automatgenererar programkod för databasåtkomst men dessa brukar inte göra ett bra jobb, åtminstone inte för skolbruk eftersom man får en samling SQL-satser som man inte riktigt vet hur de fungerar. Den kod som genereras, fungerar bara mot den unika version av SQL som leverantören av kodgeneratorn föredrar. Leverantörer av databasprogram lägger ofta till egna kommandon som ligger utanför standarden, för att kunna särskilja sina produkter.

Page 192: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 190

17.3. Arbeta med SQLite i Python

Låt oss fortsätta med jägarkatterna, men denna gång i Python.

Pythons standardbibliotek innehåller en modul kallad sqlite3 som är avsedd för arbete med SQL-databaser. Eftersom sqlite3 är en extern funktion måste programmet börja med att importera den.

import sqlite3

Följande lilla program använder sig av databasfilen katter-som-jagar.db som skapades manuellt i avsnitt 17.2.

17.3.1. Ansluta till en databas med connect() För att kunna använda en befintlig databas måste du ansluta till den genom databasmo-torn. Följande python-satser definierar databasfilens namn och skapar sedan en anslut-ning till den med funktionen connect(filnamn). Dess platshållare i ditt program läggs i variabeln anslutning.

Se till att databasfilen finns i den katalog där du förvarar pythonfiler. Mata in följande i Thonny och kör programmet.

# enkel_katthantering.py import sqlite3 # Anslut till databasfilen db_fil = 'katter-som-jagar.db' anslutning = sqlite3.connect(db_fil) # Skapa pekare in i databasen pekare = anslutning.cursor() # Kör ett SQL-kommando som hämtar personer pekare.execute("SELECT * FROM Person"); resultat = pekare.fetchall() for rad in resultat: print(rad)

Resultatet blir följande.

(1, 'Nova') (2, 'Oliver') (3, 'Gaston')

17.3.2. Cursor() För att Python ska kunna utföra något i databasen behöver du en pekare in i den. Peka-ren skapas med satsen pekare=anslutning.cursor().

Metoden execute() utför SQL-kommandon och hämtar i detta exempel rader i databasta-bellen Person och lägger dem i den tvådimensionell matrisen resultat.

Du ser att Python använder samma syntax som SQLite-tolken i SELECT-satsen för att välja kolumner från tabellen. SQLite-satserna ska omges av citationstecken eftersom de

Page 193: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 191

betraktas som strängar av Python, som bara skickar dem vidare hela och hållna till SQLi-te.

Jämför hela tiden med värdena i variabelvyn för att få se hur alla pekare och filnamn re-presenteras. Som du ser är de flesta variabler pekare, utan fasta värden.

17.3.3. Byt tabell Nu behöver vi veta katternas telefonnummer också. Numren lagras i en annan tabell i databasen, som heter Telefonnummer. Skarva på följande program efter det förra och kör.

# Hämta telefonnummer pekare.execute("SELECT * FROM Telefonnummer"); resultat = pekare.fetchall() for rad in resultat: print(rad)

Programet väljer ut alla kolumner i Telefonnummer och skriver ut alla rader.

(1, 1, '018 61026', 'På landet') (2, 1, '070 61026', 'Mobil råttjakt') (3, 2, '070 61027', 'Mobil råttjakt') (4, 3, '070 61028', 'Mobil råttjakt')

Här kan du notera att katt nummer 1 (inte rad nummer 1) har två telefonnummer.

17.3.4. Relationer med WHERE Ännu finns ingen relation mellan en katt och dennes telefonnummer. Genom att samköra de båda tabellerna med hjälp av en relation kan du koppla katten till dennes telefon(-er). Skarva på följande program efter det förra och kör.

# Hämta kombinerat resultat frågesats = "SELECT Person.namn, Telefonnummer.plats, "\ " Telefonnummer.nummer"\ " FROM Person, Telefonnummer "\ " WHERE Person.id == Telefonnummer.person_id" pekare.execute(frågesats) resultat = pekare.fetchall() for rad in resultat: print(rad)

Här ser du hur resultatet av relationsfrågan (WHERE) mellan kolumnerna Person.id och Telefonnummer.person_id hamnar i variabeln frågesats.

Frågesatsen blev ganska lång. Till skillnad från SQLite-tolken som automatskarvar ra-derna i SELECT-satsen, måste du här skarva med \-tecknet för att tala om för Python att raden fortsätter. Som sagt betraktar Python SQLite-satserna som strängar och måste skarva ihop delsträngarna i satsen till en hel sträng innan den kan skickas vidare till SQLite.

execute() utför själva frågan mot databasens platshållare pekare och resultatet av den kombinerade frågan hamnar i resultat.

Page 194: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 192

('Nova', 'På landet', '018 61026') ('Nova', 'Mobil råttjakt', '070 61026') ('Oliver', 'Mobil råttjakt', '070 61027') ('Gaston', 'Mobil råttjakt', '070 61028')

17.3.5. Plocka sönder raderna med index Nu gäller det att snygga till resultatet så det blir mera överskådligt, och förse varje rad med radrubrik.

Mata in följande program i en ny, tom programredigerare. Nu hämtar programmet både data med hjälp av en relation (WHERE) och väljer ut enskilda kolumner ur resultatet och skriver ut dem. Eftersom rad är en tuple, väljer man ur den med hjälp av index: rad[0], rad[1] etc.

# kattredovisning.py import sqlite3 db_fil = 'katter-som-jagar.db' anslutning = sqlite3.connect(db_fil) pekare = anslutning.cursor() # Hämta kombinerat resultat frågesats = "SELECT Person.namn, Telefonnummer.plats, "\ " Telefonnummer.nummer"\ " FROM Person, Telefonnummer "\ " WHERE Person.id == Telefonnummer.person_id" pekare.execute(frågesats) resultat = pekare.fetchall() for rad in resultat: # Rad är en tuple och du får själv hitta på index # för att välja ut rätt kolumn. print("Person.namn: ", rad[0]) print("Telefonnummer.plats: ", rad[1]) print("Telefonnummer.nummer: ", rad[2]) print()

Återigen tar programmet slut när for-slingan inte har flera rader att läsa ur resultat.

Person.namn: Nova Telefonnummer.plats: På landet Telefonnummer.nummer: 018 61026 Person.namn: Nova Telefonnummer.plats: Mobil råttjakt Telefonnummer.nummer: 070 61026 Person.namn: Oliver Telefonnummer.plats: Mobil råttjakt Telefonnummer.nummer: 070 61027 Person.namn: Gaston Telefonnummer.plats: Mobil råttjakt Telefonnummer.nummer: 070 61028

Att välja ut kolumner med indexsiffror kan vara lite ”rått” och inte så överskådligt. Det går att göra koden tydligare genom att byta till en annan urvalsmetod (row_factory).

Page 195: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 193

17.3.6. Ännu bättre index Allt handlar om att göra programkoden vackrare och mera läsbar.

Skarva på följande programrader efter de förra och kör programmet igen. SELECT-satsen i början kommer att köras om igen och gälla även för programdel 2, men innan urvalet görs med pekare.execute() ställer man om indexeringsmetoden (row_factory) för pe-kare till sqlite3.row. Det får till resultat att du kan välja ut en kolumn genom att an-vända kolumnens namn rad['namn'] istället för dess index, rad[0] så som sker i utskrif-ten nedan.

print(" ---- ny indexeringsmetod --- ") # Om du vill göra koden tydligare byter du till en # utförligare indexeringsmetod (row_factory) pekare.row_factory = sqlite3.Row pekare.execute(frågesats) resultat = pekare.fetchall() for rad in resultat: # Rad är en tuple och man får själv välja ett index # som passar den SQL-fråga man ställde print("Person.namn: ", rad['namn']) print("Telefonnummer.plats: ", rad['plats']) print("Telefonnummer.nummer: ", rad['nummer']) print()

Utskriften blir exakt densamma i båda fallen. Det enda som har hänt är att du själv kom-mer att ha mycket lättare att förstå koden när du tittar på den tre månader senare.

17.3.7. Skapa en tabell med CREATE TABLE i Python Du har redan skapat tabeller i en databas för hand med SQLite-tolken, men det går givet-vis att göra i Python också.

I följande sats skapas en tabell kallad Person i databasen. Om tabellen redan skulle exi-stera uppstår en konflikt, som undviks genom att du kontrollerar att tabellen inte redan är skapad, genom att lägga till IF NOT EXISTS.

Det här är ett exempel. Det är inte meningen att du ska utföra det, bara förstå det.

pekare.execute("CREATE TABLE IF NOT EXISTS Person"\ "(ID INTEGER PRIMARY KEY AUTOINCREMENT,"\ " Namn VARCHAR (128))")

Samma regler för primärnyckel, autoinkrementering och variabeltyper gäller här, som när tabellen skapas i tolken (se avsnitt 17.2.1).

17.3.8. Ta bort data med DELETE Denna funktion tar bort en specifik datarad, exempelvis en person, genom att agera utef-ter ett villkor för ID som gäller för personen som ska tas bort.

pekare.execute("DELETE FROM Person WHERE ID = 2")

Kommandot används så att man först anger DELETE FROM och namnet på den tabell du vill ta bort en rad ur, följt av villkorsoperatorn WHERE. I detta fall önskar man ta bort personen som har ID=2.

Page 196: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 194

Kör inte detta exempel. Det räcker om du förstår det.

17.3.9. Spara och stäng databasen Metoden .commit() talar om för databashanteraren att du vill spara alla ändringar som gjorts under programkörningen. Om du avslutar programmet utan att ha gjort commit kommer alla ändringar att försvinna!

anslutning.commit()

Metoden .close() avslutar körningen genom att stänga anslutningen till databasen, alltså tvärt emot öppningssatsen .connect(). Kom ihåg att spara dina förändringar innan du stänger databasen.

anslutning.close()

Page 197: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 195

17.4. Prova på ett fullständigt databasprogram

Låt oss nu anta att du är IT-ansvarig hos SOS Råttalarm och ska arbeta med telefonka-talogen som används för att larma ut Nationella Råttinsatsgruppen.

Du måste se till att katalogen ständigt är aktuell. Katter går i pension, nya katter anställs och katter byter telefonnummer. Därför måste uppgifterna kunna redigeras. Allt detta hanteras med en meny, som anropar olika funktioner, som i sin tur ställer upp olika typer av urval och relationer.

17.4.1. Prova på – riktig databashantering Detta avsnitt visar hur ett fullfjädrat (nåja) program för databashantering byggs upp i nio delsteg. Dela därför in klassen i nio grupper, där varje grupp får redovisa var sitt delsteg.

a) Visa att ditt delsteg fungerar, genom att köra det.

b) Rita och redovisa ett noggrant flödesschema för delsteget.

c) Förklara källkoden i sin helhet i detalj. Varje källkodsrad och funktion ska beskrivas.

Här följer och förklaras nio fullständiga program, som alla arbetar mot en lokal kopia av katter-som-jagar.db som du skapade i tidigare avsnitt. Varje delsteg består av två filer: huvudrutin.py och katt_func.py. Filerna i varje delsteg har för enkelhets skull samma namn. För att inte få namnkrockar, skapar du en ny katalog med nio underkataloger i din Thonny-katalog, som efteråt ska se ut så här i filträdet.

I var och en av dem kopierar du in databasen. Därefter börjar du mata in delprogramm-men, vart och ett i lämplig katalog, med angivna filnamn. Filen katt_func är per defini-tion en modul eftersom den innehåller flera funktioner och saknar huvudrutin.

Det är viktigt att du läser igenom och förstår alla delsteg, även om du bara får i uppdrag att redovisa ett av dem. Fullständiga förklaringar och kommentarer i källkoden visas bara en gång för att hålla nere längden på texten, men gäller ändå för alla följande steg.

Kom ihåg att funktionerna i det förra delsteget i katt_func.py alltid ingår i nästa. När du ska mata in ett nytt delsteg tar du alltså det förra steget och matar in den nya rutinen på

Page 198: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 196

slutet. Observera också att om en funktion förändras, så som händer med visa_alla_katter() är det den nya skrivningen som gäller och funktionsnamnet bibehålls. I huvudrutin.py ändras detaljer här och var i samma källkod, men när koden inte ändrat sig till nästa steg, visas den inte på nytt. Då återanvänder du koden från förra steget. Un-dersök noga vad som skiljer sig!

17.4.2. Delrutin 1: visa_alla Det första delsteget är ett litet program som bara visar innehållet i databasen. Menyn har bara ett alternativ som utför något, nämligen A.

== MENY == A: Visa alla katter Q: Avsluta programmet Välj: a Namn Plats Telefonnummer Nova På landet 018 61026 Nova Mobil råttjakt 070 61026 Oliver Mobil råttjakt 070 61027 Gaston Mobil råttjakt 070 61028

17.4.3. Lösningsförslag Huvudrutinen huvudrutin.py börjar som vanligt med att databasens namn definieras och en pekare in i databasen skapas. Därefter visar huvudrutinen en meny och anropar funktioner enligt menyvalen.

# huvudrutin.py import sqlite3 import katt_func as kf # == Huvudrutin == anslutning = sqlite3.connect('katter-som-jagar.db') pekare = anslutning.cursor() # Detta program använder namngivna kolumnindex istället # för numeriska index. Därför väljs indexeringsmetoden # sqlite3.row. Se vidare avsnitt 17.3.6. pekare.row_factory = sqlite3.Row while True: print() print("== MENY ==") print("A: Visa alla katter") print("Q: Avsluta programmet") val = input("Välj: ").lower() if (val == 'q'): break elif (val == 'a'): kf.visa_alla_katter(pekare) anslutning.close()

Page 199: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 197

Huvudmenyn avslutas genom att användaren trycker q eller Q. Ingen funktion anropas för detta utan satsen break ser till att while-slingan avslutas. Huvudrutinen släpper där-efter anslutningen till databasen med .close() efter avslutad körning.

När användaren väljer A utförs anropet kf.visa_alla_katter() som är lite speciellt. Pro-grammet huvudrutin.py pekar ut en funktion i en annan fil, nämligen den importerade modulen katt_func.py som visas nedan.

I början av huvudrutinen skapas pekaren som pekar in i databasen. Den skickas sedan med som argument i alla anrop.

Modulen katt_func.py innehåller alla funktioner som faktiskt utför något mot databa-sen, medan huvudrutinen bara anropar dem.

# katt_func.py # Funktion som söker efter alla katter i databasen import sqlite3 # Bygger SQL-fråga som visar samtliga katter. def visa_alla_katter(pekare): # Se avsnitt 17.2.7 och 17.3.4 för fler detaljer frågesats = "SELECT person.namn, "\ " telefonnummer.plats, telefonnummer.nummer"\ " FROM Person, Telefonnummer "\ " WHERE Person.id == Telefonnummer.person_id" pekare.execute(frågesats) resultat = pekare.fetchall() # Utskriftsformatering finns i avsnitt 7.2.2 print("{0:<10} {1:<20} {2:>10}"\ .format("Namn", "Plats", "Telefonnummer")) for rad in resultat: print("{0:<10} {1:<20} {2:>10}"\ .format(rad['namn'], rad['plats'], rad['nummer']))

Funktionen visa_alla_katter() bygger ihop en SQL-fråga som gör en kombinerad sök-ning i de båda tabellerna Person och Telefonnummer. Alla passande rader hämtas ur databasen med fetchall() och for-slingan for rad... stegar igenom alla rader och matar de namngivna kolumnerna på rätt plats på raden.

17.4.4. Delrutin 2: sök_katt Menyalternativet S har tillkommit. Det ger möjlighet till fritextsökning på kattnamn. Så här ser det ut när man provar det.

== MENY == A: Visa alla katter S: Sök katt Q: Avsluta programmet Välj: s

Page 200: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 198

Mata in del av kattnamn: s Namn Plats Telefonnummer Gaston Mobil råttjakt 070 61028

17.4.5. Lösningsförslag Huvudrutinen huvudrutin.py. Orange rader visar nytillkommen källkod.

import sqlite3 import katt_func as kf # == Huvudrutin == anslutning = sqlite3.connect('katter-som-jagar.db') pekare = anslutning.cursor() # Programmet använder namngivna kolumnindex pekare.row_factory = sqlite3.Row while True: print() print("== MENY ==") print("A: Visa alla katter") print("S: Sök katt") print("Q: Avsluta programmet") val = input("Välj: ").lower() if (val == 'q'): break elif (val == 'a'): kf.visa_alla_katter(pekare) elif (val == 's'): kf.sök_katt(pekare) anslutning.close()

Modulen katt_func.py har byggts på med en funktion för fritextsökning.

# Sök efter alla katter i databasen import sqlite3 # Frågar användaren efter en del i ett kattnamn. # Bygger SQL-fråga def sök_katt(pekare): print() sökterm = input("Mata in del av kattnamn: ") # För att kunna söka efter en delsträng använder man # nyckelordet LIKE och % som jokertecken. frågesats = "SELECT person.namn, "\ " telefonnummer.plats, telefonnummer.nummer"\ " FROM Person, Telefonnummer "\ " WHERE person.namn LIKE '%{0}%' AND "\ " Person.id == Telefonnummer.person_id"\ .format(sökterm) pekare.execute(frågesats)

Page 201: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 199

resultat = pekare.fetchall() # utskriftsformatering finns i avsnitt 7.2.2 print("{0:<10} {1:<20} {2:>10}"\ .format("Namn", "Plats", "Telefonnummer")) for rad in resultat: print("{0:<10} {1:<20} {2:>10}"\ .format(rad['namn'], rad['plats'], rad['nummer']))

Funktionen sök_katt() söker i databasen genom att sätta samman en SQL-fråga bestå-ende av en godtycklig del av kattnamnet och relationen för att få fram telefonnumret eller -numren, och stoppar in det i frågesats. Frågesatsen körs, alla relevanta rader hämtas och resultatet matas ut på bildskärmen.

WHERE person.namn LIKE '%{0}%' är ett exempel på fritextsökning där %-tecknen fungerar som jokertecken och motsvarar noll eller flera tecken, vilka som helst.

LIKE-argumentet (såsom-förslagsvis-ungefär) medger att du kan skriva no eller ov eller va som söksträng och ändå få svaret Nova. Du kan också skriva v som söksträng och få svaren Nova och Oliver men inte Gaston.

WHERE-satsen har två delar, fritextsökningen med LIKE och relationen. De båda villko-ren måste vara uppfyllda för att raden ska hamna i resultat.

17.4.6. Delrutin 3: slå_ihop_sök Som du ser har funktionerna visa_alla_katter() och sök_katt() flera likadana delar. Lyft ut dessa delar till en ny funktion som heter visa_resultat() och anropa den när det behövs. Det är elegantare än att varje funktion ska ha egna utskriftsrutiner.

17.4.7. Lösningsförslag Modulen katt_func.py utökats med den gemensamma visningsfunktionen visa_resultat(), eftersom den förra koden inte blev så effektiv. Man ska alltid försöka förenkla källkod så mycket som möjligt eftersom det gör den mera lättförståelig i slutän-den.

# Sök efter alla katter i databasen import sqlite3 # == Funktioner för att visa och söka efter katter == # Hjälpfunktion som tar in en SQL-fråga som efterfrågar # kombinerat resultat från tabellerna Person och # Telefonnummer. Visar resultatet i tabellform. def visa_resultat(pekare, frågesats): pekare.execute(frågesats) resultat = pekare.fetchall() # utskriftsformatering finns i kapitel 7.2.2 print("{0:<10} {1:<20} {2:>10}"\ .format("Namn", "Plats", "Telefonnummer")) for rad in resultat:

Page 202: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 200

print("{0:<10} {1:<20} {2:>10}"\ .format(rad['namn'], rad['plats'], rad['nummer'])) # Bygger SQL-fråga som visar samtliga katter. def visa_alla_katter(pekare): # Se avsnitten 17.2.7 och 17.3.4 för flera detaljer frågesats = "SELECT person.namn, "\ " telefonnummer.plats, telefonnummer.nummer"\ " FROM Person, Telefonnummer "\ " WHERE Person.id == Telefonnummer.person_id" visa_resultat(pekare, frågesats) # Frågar användaren efter en del i ett kattnamn. # Bygger SQL-fråga def sök_katt(pekare): print() sökterm = input("Mata in del av kattnamn: ") # Sök efter delsträng med nyckelordet LIKE. frågesats = "SELECT person.namn, "\ " telefonnummer.plats, telefonnummer.nummer"\ " FROM Person, Telefonnummer "\ " WHERE person.namn LIKE '%{}%' AND "\ " Person.id == Telefonnummer.person_id"\ .format(sökterm) visa_resultat(pekare, frågesats)

De nya, förenklade funktionerna visa_alla_katter() och sök_katt() bygger frågesatsen som skickas med till visa_resultat(). Funktionen visa_resultat(pekare, frågesats) tar emot pekaren och frågesatsen, utför frågan mot databasen och skriver ut resultatet.

17.4.8. Delrutin 4: ny_katt Menyalternativet N har tillkommit. Det används för att skapa en ny katt i databasen. Så här ser det ut när man provar det. Dessutom ska det databas-ID den nya katten fick, skri-vas ut.

== MENY == A: Visa alla katter S: Sök katt N: Ny katt Q: Avsluta programmet Välj: n Namnge den nya katten: Oswald Kattens databas-ID: 5

Page 203: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 201

17.4.9. Lösningsförslag Huvudrutinen huvudrutin.py har utökats med menyalternativet N och en hanterare för att lägga till en ny katt.

import sqlite3 import katt_func as kf # == Huvudrutin == anslutning = sqlite3.connect('katter-som-jagar.db') pekare = anslutning.cursor() # Programmet använder namngivna kolumnindex pekare.row_factory = sqlite3.Row while True: print() print("== MENY ==") print("A: Visa alla katter") print("S: Sök katt") print("N: Ny katt") print("Q: Avsluta programmet") val = input("Välj: ").lower() if (val == 'q'): break elif (val == 'a'): kf.visa_alla_katter(pekare) elif (val == 's'): kf.sök_katt(pekare) elif (val == 'n'): db_id = kf.ny_katt(pekare) print("Kattens databas-ID: ", db_id) # Katter som skapas utan telefonnummer # kommer inte synas med menyalternativ A och S # om de inte har fått ett telefonnummer tilldelat # Spara ändringen i databasen anslutning.commit() anslutning.close()

Funktionen ny_katt() returnerar kattens databas-ID, vilket skrivs ut.

Men det nya namnet kommer inte att sparas på disken om du inte avslutar rutinen med .commit(). Annars försvinner ändringen när du stänger av datorn.

När en ny katt anställs måste namnet läggas i in i Person-tabellen. Modulen katt_func.py har utökats med en funktion för att lägga till en ny katt i databasen.

# == Funktioner för att lägga till en ny katt == # returnerar databas-ID:t för den nya katten def ny_katt(pekare): print() kattnamn = input("Namnge den nya katten: ")

Page 204: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 202

print() print() # Bygg SQL-frågan frågesats = "INSERT INTO Person (namn) "\ " VALUES ('{}')"\ .format(kattnamn) pekare.execute(frågesats) # Leta rätt på databas-ID för den nya katten. # OBS: SQLite-unik metod! frågesats = "SELECT seq FROM sqlite_sequence "\ " WHERE name='Person'" pekare.execute(frågesats) db_id = pekare.fetchall() return db_id[0]['seq']

SQL-satsen INSERT INTO lägger till en ny tabellrad sist i tabellen Person men anger inte id. Redan när tabellen skapades med

id INTEGER PRIMARY KEY AUTOINCREMENT

bestämdes att tabellens id skulle inkrementeras automatiskt, så den nya raden kommer att få nästa id-nummer.

För att hämta kattens databas-ID, alltså det ID den har i tabellen Person, används den dimhöljda tabellen sqlite_sequence som nämndes i avsnitt 17.2.2. Den har ID för den sökta tabellen i sin kolumn name och radens sekvensnummer kolumnen seq. Det hela utförs av den nya frågesatsen som börjar SELECT seq FROM sqlite_sequence... och rutinen returnerar db_id som tas om hand av huvudrutinen.

Ännu så länge har den nya katten inte fått någon plats eller telefonnummer.

17.4.10. Delrutin 5: lägg_till_telefonnummer Nu är det är dags att ge den nya katten ett telefonnummer också. Det ordnas genom att funktionen lägg_till_telefonnummer() nu anropas vid menyalternativet N.

== MENY == A: Visa alla katter S: Sök katt N: Ny katt Q: Avsluta programmet Välj: n Namnge den nya katten: Pippi Telefonnummer: 07856677889 Plats: Villa Villekulla == MENY == A: Visa alla katter S: Sök katt N: Ny katt Q: Avsluta programmet Välj: a

Page 205: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 203

Namn Plats Telefonnummer Nova På landet 018 61026 Nova Mobil råttjakt 070 61026 Oliver Mobil råttjakt 070 61027 Gaston Mobil råttjakt 070 61028 Pippi Villa Villekulla 07856677889

En del av texten i utskriften kommer från den nya funktionen.

17.4.11. Lösningsförslag Huvudrutinen huvudrutin.py har fått ett minimalt tillägg.

import sqlite3 import katt_func as kf # == Huvudrutin == anslutning = sqlite3.connect('katter-som-jagar.db') pekare = anslutning.cursor() # Programmet använder namngivna kolumnindex pekare.row_factory = sqlite3.Row while True: print() print("== MENY ==") print("A: Visa alla katter") print("S: Sök katt") print("N: Ny katt") print("Q: Avsluta programmet") val = input("Välj: ").lower() if (val == 'q'): break elif (val == 'a'): kf.visa_alla_katter(pekare) elif (val == 's'): kf.sök_katt(pekare) elif (val == 'n'): db_id = kf.ny_katt(pekare) # Katter som skapas utan telefonnummer # kommer inte synas med menyalternativ A och S # om de inte har fått ett telefonnummer tilldelat kf.lägg_till_telefonnummer(pekare, db_id) # Spara ändringen i databasen anslutning.commit()

Väljer man N i huvudmenyn visas inte längre något databas-ID från tabellen Person. Det bara sparas internt. Satsen print("Kattens databas-ID: ", db_id) har tagits bort. Istäl-let anropar huvudmenyn funktionen lägg_till_telefonnummer() och skickar med sagda ID.

Även den nya ändringen av tabellen Telefonnummer måste sparas på disken. Se till så att .commit() hamnar efter lägg_till_telefonnummer().

Page 206: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 204

Modulen katt_func.py har utökats med en rutin som efterfrågar och därefter lägger in telefonnummer och plats i tabellen Telefonnummer.

# === Lägg till telefonnummer # Fråga användaren efter information om telefonnummer och # plats för att skapa rader i telefonnummer-tabellen. def lägg_till_telefonnummer(pekare, katt_db_id): # Fråga användaren efter information telefonnummer = input("Telefonnummer: ") plats = input("Plats: ") # Bygg SQL-frågesatsen frågesats = "INSERT INTO Telefonnummer "\ " (person_id, nummer, plats) "\ " VALUES "\ " ('{0}', '{1}', '{2}')"\ .format(katt_db_id, telefonnummer, plats) pekare.execute(frågesats)

Det nya är funktionen lägg_till_telefonnummer(pekare, katt_db_id) som får in ett databas-ID som är detsamma som det db_id som returnerades av funktionen ny_katt() i huvudrutinen. Detta ID blir identifierare (inte primärnyckel) i kolumnen person_ID i tabellen Telefonnummer, för att man ska kunna koppla ihop alla telefonnummer med en specifik katt i tabellen Person.

Jägarkatten ska få ett telefonnummer och en plats där telefonen finns. Numret och plat-sen sätts in på en ny rad i tabellen Telefonnummer med INSERT INTO-satsen.

17.4.12. Delrutin 6: hitta_katt_att_redigera I denna uppgift ska du hitta en katt att redigera. Uppgiften går ut på att bevisa om en katt finns eller inte i databasen.

== MENY == A: Visa alla katter S: Sök katt N: Ny katt R: Redigera befintlig katt Q: Avsluta programmet Välj: r ==== Katter att välja bland ==== id | Namn ------------------------- 1 | Nova 2 | Oliver 3 | Gaston 4 | Oswald 5 | Sune Mata in id för den katt som du vill redigera: 2 Katten finns! ... Mata in id för den katt som du vill redigera: 7

Page 207: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 205

Felaktigt inmatat ID ( 7 ), katten finns inte

Väljer du en katt som redan finns, får du svaret att den finns. Försöker du med en obefint-lig katt får du ett felmeddelande.

17.4.13. Lösningsförslag Här kommer en rimlighetskontroll. Huvudrutinen huvudrutin.py har utökats med al-ternativet R som i detta skede visar en lista med befintliga katter och ber användaren välja en av dem genom att mata in dess databas-ID. ID undersöks för att se om det är nu-meriskt och giltigt. I annat fall visas ett felmeddelande. Inget kan ännu redigeras.

import sqlite3 import katt_func as kf # == Huvudrutin == anslutning = sqlite3.connect('katter-som-jagar.db') pekare = anslutning.cursor() # Programmet använder namngivna kolumnindex med sqlite3.row. pekare.row_factory = sqlite3.Row while True: print() print("== MENY ==") print("A: Visa alla katter") print("S: Sök katt") print("N: Ny katt") print("R: Redigera befintlig katt") print("Q: Avsluta programmet") val = input("Välj: ").lower() if (val == 'q'): break elif (val == 'a'): kf.visa_alla_katter(pekare) elif (val == 's'): kf.sök_katt(pekare) elif (val == 'n'): db_id = kf.ny_katt(pekare) # Katter utan telefonnummer visas inte kf.lägg_till_telefonnummer(pekare, db_id) # Spara ändringen i databasen anslutning.commit() elif (val == 'r'): print() print("==== Katter att välja bland ====") dbid_katter_lista = kf.hämta_tabell_med_katter(pekare) kf.visa_tabell_med_katter(dbid_katter_lista) # Fråga användaren om katten som ska redigeras vald_katt = input("Mata in id för katten som "\

Page 208: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 206

"du vill redigera: ") # Kontrollera användarens svar if vald_katt.isnumeric() == False: # Om det inte är numeriskt svar så är det fel print("Felaktig inmatning") continue # Användaren matade in ett ID katt_db_id = int(vald_katt) if kf.finns_katt(dbid_katter_lista, katt_db_id) == False: print("Felaktigt inmatat ID (", vald_katt, "), katten finns inte") continue print("Katten finns!") anslutning.close()

Modulen katt_func.py har utökats med funktioner för att hitta en katt att redigera.

# == Funktioner för att redigera en befintlig katt == # Funktion som hämtar ut vilka katter som finns, med ID def hämta_tabell_med_katter(pekare): frågesats = "SELECT id, namn FROM Person" pekare.execute(frågesats) kattnamn = pekare.fetchall() # Skicka tillbaka svaret till anropande return kattnamn # Funktionen förväntar sig svaret från en databasfråga # som hämtar kolumnerna 'id' och 'namn' def visa_tabell_med_katter(kattnamn): # Formge tabell med id | namn print("{0:<5}| {1:<20}".format("id", "Namn")) print("".center(25, '-')) for namn in kattnamn: print("{0:<5}| {1:<20}"\ .format(namn['id'], namn['namn'])) print() # Hjälpfunktion för att kontrollera om användaren angav # ett giltigt katt-ID def finns_katt(katter, vald_katt_id): # Kontrollera att ID finns i listan med katter for katt in katter: if katt['id'] == vald_katt_id: return True # Om slingan gick igenom samtliga katter utan # att hitta databas-ID:t så matade användaren in fel

Page 209: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 207

return False

Funktionen finns_katt() undersöker om den angivna kattens ID finns med i listan kat-ter genom att stega sig igenom hela katter i en slinga. Om ID upptäcks någonstans, slu-tar funktionen med ett True. Annars blir det False.

17.4.14. Delrutin 7: redigera-meny Nu ska det gå att redigera på riktigt.

== MENY == A: Visa alla katter S: Sök katt N: Ny katt R: Redigera befintlig katt Q: Avsluta programmet Välj: r ==== Katter att välja bland ==== id | Namn ------------------------- 1 | Nova 2 | Oliver 3 | Gaston Mata in id för den katt som du vill redigera: 3 == MENY == L: Lägg till telefonnummer Q: Avsluta meny Välj: l Telefonnummer: 08123456990010 Plats: På soffan == MENY == L: Lägg till telefonnummer Q: Avsluta meny Välj: q == MENY == A: Visa alla katter S: Sök katt N: Ny katt R: Redigera befintlig katt Q: Avsluta programmet Välj: a Namn Plats Telefonnummer Nova På landet 018 61026 Nova Mobil råttjakt 070 61026 Oliver Mobil råttjakt 070 61027 Gaston Mobil råttjakt 070 61028 Oliver I norr 0908 Gaston Bevakningskontor 45678900000000 Gaston Hemma 27836428736428736428

Page 210: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 208

Gaston På soffan 08123456990010

17.4.15. Lösningsförslag Modulen katt_func.py har inte ändrats alls och visas inte igen. Huvudrutinen huvudru-tin.py har däremot ändrats rejält. En undermeny för redigering av katternas data har tillkommit i form av funktionen redigera_meny(). Nu går det att redigera.

import sqlite3 import katt_func as kf def redigera_meny(pekare, katt_db_id): while True: # Visa meny med redigeringsalternativ print("== MENY ==") print("L: Lägg till telefonnummer") print("Q: Avsluta meny") print() val = input("Välj: ").lower() if (val == 'q'): break elif (val == 'l'): kf.lägg_till_telefonnummer(pekare, katt_db_id) # == Slut på funktionen redigera_meny == # == Huvudrutin == anslutning = sqlite3.connect('katter-som-jagar.db') pekare = anslutning.cursor() # Programmet använder namngivna kolumnindex pekare.row_factory = sqlite3.Row while True: print() print("== MENY ==") print("A: Visa alla katter") print("S: Sök katt") print("N: Ny katt") print("R: Redigera befintlig katt") print("Q: Avsluta programmet") print() val = input("Välj: ").lower() if (val == 'q'): break elif (val == 'a'): kf.visa_alla_katter(pekare) elif (val == 's'): kf.sök_katt(pekare) elif (val == 'n'): db_id = kf.ny_katt(pekare)

Page 211: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 209

# Katter utan telefonnummer visas inte kf.lägg_till_telefonnummer(pekare, db_id) # Spara ändringen i databasen anslutning.commit() elif (val == 'r'): print() print("==== Katter att välja bland ====") dbid_katter_lista = kf.hämta_tabell_med_katter(pekare) kf.visa_tabell_med_katter(dbid_katter_lista) # Fråga användaren efter vilken katt som ska # redigeras vald_katt = input("Mata in id för katt som du "\ "vill redigera: ") # Kontrollera användarens svar if vald_katt.isnumeric() == False: # Om det inte är numeriskt så är det fel print("Felaktig inmatning") continue # Användaren matade in ett ID katt_db_id = int(vald_katt) if kf.finns_katt(dbid_katter_lista, katt_db_id) == False: print("Felaktigt inmatat ID (", vald_katt, "), katten finns inte") continue redigera_meny(pekare, katt_db_id) # Spara ändringen i databasen anslutning.commit() anslutning.close()

Huvudmenyn behåller alternativet R för att redigera data om en katt, men istället för att som i förra versionen bara konstatera att print("Katten finns!") anropas nu funktionen redigera_meny().

I den nya redigera-menyn kan du lägga till ett telefonnummer till en befintlig katt. Åter-igen får funktionen lägg_till_telefonnummer() arbeta och lägga till ett telefonnummer till en befintlig katt.

Page 212: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 210

17.4.16. Delrutin 8: pensionera_katt Till sist tröttnar även den vigaste katt på att jaga råttor och vill hellre ligga i soffan. Där-för har det tillkommit en funktion för att pensionera befintliga katter.

== MENY == A: Visa alla katter S: Sök katt N: Ny katt R: Redigera befintlig katt Q: Avsluta programmet Välj: r ==== Katter att välja bland ==== id | Namn ------------------------- 2 | Oliver 3 | Gaston Mata in id för den katt som du vill redigera: 3 == MENY == L: Lägg till telefonnummer P: Pensionera katt Q: Avsluta meny Välj: p Säker på att pensionera katt? (J/N) j == MENY == A: Visa alla katter S: Sök katt N: Ny katt R: Redigera befintlig katt Q: Avsluta programmet Välj: a Namn Plats Telefonnummer Oliver Mobil råttjakt 070 61027

Bara en katt kvar! Det är uppenbart att arbetsstyrkan har minskat för mycket på grund av pensionsavgångar. Råttstammen växer! Dags att nyrekrytera.

17.4.17. Lösningsförslag Redigera-menyn i huvudrutinen huvudrutin.py har utökats med alternativet P för att pensionera. Alternativet anropar en pensions-funktion.

import sqlite3 import katt_func as kf def redigera_meny(pekare, katt_db_id): while True: # Visa meny med redigeringsalternativ print("== MENY ==") print("L: Lägg till telefonnummer")

Page 213: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 211

print("P: Pensionera katt") print("Q: Avsluta meny") print() val = input("Välj: ").lower() if (val == 'q'): break elif (val == 'l'): kf.lägg_till_telefonnummer(pekare, katt_db_id) elif (val == 'p'): res = kf.pensionera_katt(pekare, katt_db_id) # Res innehåller antingen # True = Katten pensionerades # False = Katten pensionerades inte if res == True: # Pensionerades katten måste menyn # avslutas return # == Slut på funktionen redigera_meny ==

I detta steg är den del av huvudrutinen som visar startmenyn med alternativen A-S-N-R-Q identisk med rutinen i steg 7. Därför visas den inte längre.

Om redigera-menyn upptäckter att katten faktiskt pensionerats (if res == True) finns det inget mer att redigera och undermenyn avbryter sig själv med return. Då är man till-baka i huvudmenyn. Först efter återgång till huvudrutinen, sparas ändringen i databasen.

Modulen katt_func.py har utökats med en pensions-funktion som innehåller ytterligare en rimlighetskontroll. Nu handlar det om att radera saker ur databasen. Då måste man till en början vara försiktig och fråga om användaren faktiskt är säker. Svarar denne nå-got annat än J eller j avslutas funktionen med ett False. Det är bäst att vara bergsäker.

# Pensionerar man en katt så tas katten bort från # telefondatabasen def pensionera_katt(pekare, katt_db_id): val = input("Säker på att pensionera katt? (J/N) ") .lower() if val != 'j': return False # Ta bort kattens nummerrader från Telefonnummer ta_bort_telefonnummer_sats = " DELETE FROM Telefonnummer "\ " WHERE person_id='{}'"\ .format(katt_db_id) pekare.execute(ta_bort_telefonnummer_sats) # Ta bort katten från Person ta_bort_katt_sats = "DELETE FROM Person "\ " WHERE id='{}'"\ .format(katt_db_id) pekare.execute(ta_bort_katt_sats) return True

Page 214: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 212

Funktionen pensionera_katt() bygger en SQL-sats med DELETE FROM som tar bort den utpekade kattens telefonnummer från tabellen Telefonnummer och kör denna mot databasen.

Därefter byggs en ny SQL-sats som tar bort själva kattens namn ur tabellen Person och kör denna.

Efter att katten pensionerats, avslutas funktionen genom att returnera True till under-menyn för kattredigering, som reagerar därefter.

17.4.18. Grande finale 9: ta_bort_telefonnummer Katter är som människor. De tappar sina telefoner i kloaker, får frontglaset krossat av ett vildsvin när de är ute på råttjakt eller får telefonen uppäten av en björn. Inget konstigt. Då måste det gamla telefonnumret tas bort. Därför behövs denna sista delrutin.

Här är en körning där den sista möjligheten visas. Om kattens sista telefonnummer tas bort kan denne inte längre nås per telefon och ska inte visas i utskriften av databasen. Det enda sättet att åter få se katten i utskriften är att ge denne ett nytt telefonnummer.

== MENY == A: Visa alla katter S: Sök katt N: Ny katt R: Redigera befintlig katt Q: Avsluta programmet Välj: a Namn Plats Telefonnummer Oliver Mobil råttjakt 070 61027 Gaston Mobil råttjakt 070 61028 == MENY == A: Visa alla katter S: Sök katt N: Ny katt R: Redigera befintlig katt Q: Avsluta programmet Välj: r ==== Katter att välja bland ==== id | Namn ------------------------- 1 | Nova 2 | Oliver 3 | Gaston Mata in id för den katt som du vill redigera: 2 == MENY == L: Lägg till telefonnummer P: Pensionera katt T: Ta bort telefonnummer Q: Avsluta meny Välj: t

Page 215: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 213

id | Nummer | Plats 3 | 070 61027 | Mobil råttjakt Välj: 3 Numret borttaget!

17.4.19. Lösningsförslag Det enda som har ändrats i huvudrutinen huvudrutin.py är att alternativet T tillkom-mit, tillsammans med ett anrop till rutinen för att ta bort telefonnumret.

import sqlite3 import katt_func as kf def redigera_meny(pekare, katt_db_id): while True: # Visa meny med redigeringsalternativ print("== MENY ==") print("L: Lägg till telefonnummer") print("P: Pensionera katt") print("T: Ta bort telefonnummer") print("Q: Avsluta meny") print() val = input("Välj: ").lower() if (val == 'q'): break elif (val == 'l'): kf.lägg_till_telefonnummer(pekare, katt_db_id) elif (val == 't'): kf.ta_bort_telefonnummer(pekare, katt_db_id) elif (val == 'p'): res = kf.pensionera_katt(pekare, katt_db_id) # Res innehåller antingen # True = Katten pensionerades # False = Katten pensionerades inte if res == True: # Pensionerades katten måste menyn # avslutas return # == Slut på funktionen redigera_meny ==

Även i detta steg är den del av huvudrutinen som visar startmenyn med alternativen A-S-N-R-Q identisk med rutinen i steg 7. Därför visas den inte här heller.

Modulen katt_func.py har utökats med sagda funktion för att ta bort telefonnummer. Det innefattar många steg.

# Tar bort telefonnummer relaterat till en katt def ta_bort_telefonnummer(pekare, katt_db_id): frågesats = "SELECT id, nummer, plats "\ " FROM Telefonnummer "\ " WHERE person_id = '{}'"\ .format(katt_db_id) pekare.execute(frågesats)

Page 216: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 214

telefonnummer = pekare.fetchall() # Kontrollera att det finns något telefonnummer att # ta bort. if len(telefonnummer) == 0: print("Katten har inga telefonnummer") print() return # Skriv ut kattens telefonnummer print("{0:<5}| {1:<20}| {2:>15}"\ .format("id", "Nummer", "Plats")) for nummer in telefonnummer: print("{0:<5}| {1:<20}| {2:>15}"\ .format(nummer['id'], nummer['nummer'], nummer['plats'])) print() # Låt användaren välja vilket ID som ska tas bort val = input("Välj: ") if val.isnumeric() == False: print("Felaktig inmatning") print() return # Ta bort telefonnummret från databasen nummer_db_id = int(val) ta_bort_telefonnummer = "DELETE FROM Telefonnummer "\ " WHERE id='{}'"\ .format(nummer_db_id) pekare.execute(ta_bort_telefonnummer) print("Numret borttaget!")

Funktionen ta_bort_telefonnummer() börjar med att hämta in alla telefonnummer som tillhör den utvalda katten katt_db_id och stoppa dem i listan telefonnummer. Observe-ra att listan inte är samma sak som databastabellen Telefonnummer!

Om listan var tom, alltså hade längden noll, fanns det inga telefonnummer och funktionen avslutas. I annat fall skrivs alla nummer i listan telefonnummer ut i en snygg tabell med tabellhuvud, så att användaren kan välja ID för ett nummer att ta bort.

Användaren väljer ett ID som tilldelas variabeln val och programmet kontrollerar att det var ett numeriskt värde. ID kan inte vara bokstäver. Är det numeriskt, görs det om till ett heltal och tilldelas variabeln nummer_db_id.

Funktionen bygger en SQL-ta-bort-sats med DELETE FROM Telefonnummer, kallar den ta_bort_telefonnummer och kör denna mot databasen. Telefonnummerraden för-svinner ur databasen.

Prova att ange ett annat telefonnummer-ID än vad som finns i listan och se vad som hän-der. Varför?

I och med detta är programmet fullständigt och kan användas för underhåll av kattdata-basen.

Page 217: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 215

17.5. Blockschema

Så här ser flödet ut för det fullständiga programmet. Ungefär. Schemat är bara ett över-siktligt blockschema. När du redovisar din deluppgift måste du rita ett schema som är mera detaljerat. Ta till exempel själv reda på vilka argument som skickas med från meny-erna till funktionerna och skriv in det i flödesschemat och redovisa alla valsituationer med de gängse romberna för frågesatser.

Page 218: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ARBETA MED SQL-DATABASER

RÄKNA MED PYTHON 216

17.6. Lärdomar

Det här programmet är med bred marginal det mest komplexa i denna bok. Det visar på ett antal metoder som du bör använda i alla dina program.

Rimlighetskontroll av svar.

Ge användaren en chans att lämna ett nytt svar om det förra var fel.

Säkerhetsfråga före farliga åtgärder.

Visa ledtexter så att användaren vet vad som händer, eller inte.

Behovet av snygg formatering av utskriften.

Observera att programmet i detta exempel inte följer personuppgiftslagen GDPR (General Data Protection Regulation) om det ska användas för att registrera människor.

Om du tänker fortsätta med boken Digitalslöjd kommer du att få användning av dina kunskaper om databaser. Ett av projekten går ut på att spara meterologiskt data för att senare göra diagram av det och rapportera det till WMO, World Meteorological Organsa-tion. Då är det händigt att spara observationerna i en databas.

17.7. Övningar på databasen

Kör nionde delsteget och visa att du kan:

a) Lägga till en katt och visa denna i listan.

b) Ta bort en katt och visa listan.

c) Byta namn på en katt. Det måste göras i flera steg.

d) Pensionera en katt.

e) Diskutera hur du skulle kunna lösa problemet med att byta namn på en katt i ett enda steg.

17.7.1. Flera övningar Se övningar i övningsavsnittet Klasser, på sidan 227.

17.8. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 219: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 217

18. IX Klasser

Klasser är bland det mest användbara som finns i programmering. Du använder dem hela tiden, utan att tänka på det. Målet med programmering är att försöka få programmet så överskådligt och lättbegripligt som möjligt.

Du har redan använt dig av olika grundläggande klasser, som levererar olika datatyper, till exempel följande:

int, float, str, bool

som hanterar olika sorters värden. Du behöver inte specificera hur int skapar heltal. Du får ett heltal ändå, som du kan använda på ett känt sätt, till exempel i addition. De har kallats datatyper, men är egentligen klasser.

När du skapar egna klasser som gör mera avancerade saker än bara är heltal, strängar osv, så kombinerar du grundläggande datatyper för att beskriva något nytt.

Med många klasser tillsammans kan man beskriva ett avancerat system. Detta skulle man kunna lösa med en uppsättning vanliga funktioner, men klassen hjälper programmeraren att strukturera och kapsla in koden så att den som använder klasser inte kan begå miss-tag som att oavsiktligt förändra klassens interna, privata variabler.

18.1. Klassens uppbyggnad

Du kan fortsätta att tänka i ungefär samma banor som för funktioner, bara med annan terminologi. En klass byggs upp med en uppsättning metoder, vilka sparas under ett gemensamt klassnamn och löser en specifik uppgift.

class Klassnamn: block

Ordet class är ett nyckelord. Efter detta anger man klassens namn, i detta fall Klass-namn. Klassens namn skapas utefter samma regler och med samma begränsningar som

Page 220: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 218

variabelnamn, men ska inledas med versal. Blocket kan bestå av initiering av variabler och definitioner av metoder.

Exemplet nedan visar en klass som beskriver en punkt i ett koordinatsystem.

# klasser_1.py # Klassen punkt beskriver ett koordinatpar class Punkt: x = 0 y = 0 # Huvudrutin # origo är en instans av klassen punkt origo = punkt() # koordinat_1 är en annan instans av klassen punkt koordinat_1 = punkt() # Tilldela koordinat_1 godtyckliga värden koordinat_1.x = 12 koordinat_1.y = 14 print(origo.x, ",", origo.y) print(koordinat_1.x, ",", koordinat_1.y)

Klassens dataattribut (interna klassvariabler) x och y initieras till punkten (0,0) alltså koordinatsystemets origo.

I huvudrutinen skapas två instanser av klassen punkt, nämligen objekten origo och ko-ordinat_1. Objektet origo har sin uppsättning av dataattributen x och y, medan koor-dinat_1 har en annan uppsättning. De två har inget samband.

Huvudrutinen gör inget mera med objektet origo utan skriver ut det som den är, då x och y alltså är (0,0).

Däremot låter man genom satsen koordinat_1.x=12 dataattributet x till delas värdet 12 i objektet koordinat_1. Detsamma gäller koordinat_1.y som tilldelas värdet 14. Man säger att koordinat_1 är av klassen punkt.

Vid den sista utskriften visas hur variabeln koordinat_1.x hämtar tillbaka värdet 12 från dataattributet x i sin egen instans medan koordinat_1.y hämtar tillbaka värdet 14.

>>> %Run klasser_1.py 0 , 0 12 , 14

Page 221: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 219

18.2. Gömma data för världen

Programmeraren som använder klassen ska inte ändra på dataattribut direkt, utan ge-nom att använda klassens metoder. Det visas genom att attributnamn börjar med under-strykningstecken. Så gör man inte bara attributen interna, utan även privata för klassen.

Därför behövs en säker metod att ändra de privata attributen utifrån, som visas nedan som tilldela_punkt().

# klasser_2.py # Klassen punkt beskriver ett koordinatpar class punkt: # Privata variablerna _x och _y _x = 0 _y = 0 # Metod som tilldelar de interna dataattributen # med värden från externa x och y def tilldela_punkt(self, x, y): self._x = x self._y = y # Returnerar en tuple med positionerna def hämta_punkt(self): return (self._x, self._y) # Huvudrutin # origo är en instans av klassen punkt origo = punkt() # koordinat_1 är en annan instans av klassen punkt koordinat_1 = punkt() # Tilldela koordinat_1 godtyckliga värden koordinat_1.tilldela_punkt(12, 14) # översätts till tilldela_punkt(koordinat_1, 12, 14) print(origo.hämta_punkt()) print(koordinat_1.hämta_punkt())

Klassen punkt() börjar med att skaffa sig två privata attribut, _x och _y.

Metoden tilldela_punkt() tilldelar det privata attributet _x värdet av inparametern x genom att särskilt peka ut det privata attributet med self._x. Argumentet self i argu-mentlistan pekar på den instans som anropade metoden, i detta fall koordinat_1. Man kan se det som om Python översätter

koordinat_1.tilldela_punkt(12, 14)

till

tilldela_punkt(koordinat_1, 12, 14)

På samma sätt kan

koordinat_1.hämta_punkt()

Page 222: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 220

tänkas översättas till

hämta_punkt(koordinat_1)

18.3. Metoden __init__()

Ibland har man behov av att initiera medlemsattribut när en klass instansieras (skapas). Då använder man funktionen __init__().

Inparametrarna (x=0, y=0) till metoden __init__ används till att instansiera klassen utan att ange argument. Skulle argument presenteras, gäller dessa istället. Läs mer på sidan 130.

Mata in defintionen av klassen punkt i Thonny och spara den som punkt.py i den kata-log där du sparar dina övriga python-filer. Du kommer att behöva den i nästa avsnitt.

# Klassen punkt beskriver ett koordinatpar class punkt: # Privata variablerna _x och _y def __init__ (self, x=0, y=0): self._x = x self._y = y # Metod som tilldelar de interna dataattributen # med värden från externa x och y def tilldela_punkt(self, x, y): self._x = x self._y = y # Returnerar en tuple med positionerna def hämta_punkt(self): return (self._x, self._y) # Returnerar x-koordinaten def hämta_x(self): return self._x # Returnerar y-koordinaten def hämta_y(self): return self._y

Mata därfter in huvudrutinen som anropar punkt, och spara den som punkt-huvudrutin.py.

# Huvudrutin from punkt import punkt # origo är en instans av klassen punkt origo = punkt() # koordinat_1 är en annan instans av klassen punkt koordinat_1 = punkt(12, 14) print(origo.hämta_punkt()) print(koordinat_1.hämta_punkt())

Page 223: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 221

Initieringen __init__ körs varje gång en klass instansieras, till exempel vid huvudrutinens origo = punkt(). Men __init__ körs inte vid andra anrop, som origo.hämta_punkt().

Kör programmet. Vid körningen visas först de fördefinierade värdena för origo, nämligen (0, 0) och därefter de värden man anropade med (12, 14) och kallade för koordinat_1.

18.4. Klasser inuti andra klasser

Mata in defintionen av klassen vektor och huvudrutin i en ny tom flik i Thonny och spara den som vektor.py i den katalog där du sparar dina övriga python-filer.

Klassen beräknar längden av en vektor mellan två punkter i ett koordinatsystem med hjälp av Pythagoras sats.

# klass_vektor.py # Klassen vektor utför Pythagoras sats class vektor: # Privata variablerna _p1 resp _p2 def __init__(self, p1, p2): self._p1 = p1 self._p2 = p2 def längd(self): # beräkna avståndet i X resp Y led dX = self._p2.hämta_x() - self._p1.hämta_x() dY = self._p2.hämta_y() - self._p1.hämta_y() # Beräkna längden med hjälp av Pythagoras sats # Roten beräknas genom att upphöja till 0,5 längd = (dX**2 + dY**2) ** 0.5 return längd

Nu ska du skriva en ny huvudrutin som använder klassen vektor. Mata in huvudrutinen nedan och spara den som vektor-huvudrutin.py. Både klassdefinitionerna vektor och punkt måste importeras.

# vektor_huvudrutin.py # Huvudrutin from vektor import vektor from punkt import punkt v1 = vektor(punkt(2,1), punkt(4,4)) vektor_längd = v1.längd() print("Längden på vektorn är: ", vektor_längd)

Kör programmet vektor_huvudrutin.py.

18.4.1. En körning Standardvärdena 2,1 och 4,4 för vektorns ändpunkter ger följande resultat.

>>> %Run vektor_huvudrutin.py Längden på vektorn är: 3.605551275463989

Ändra vektorns ändpunkter till 1,1 och 2,2. Då utgör vektorn diagonalen i en kvadrat med sidorna 1. Diagonalen i en sådan kvadrat ska bli √2. Prova.

Page 224: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 222

>>> %Run vektor-huvudrutin.py Längden på vektorn är: 1.4142135623730951

Ganska nära!

18.5. Klasser i praktiken

Tänk dig en kaffeautomat.

Kaffeautomaten har följande funktioner på framsidan, nämligen möjligheten att ändra koppens storlek och att starta bryggningen. Du behöver inte veta, och du får inte veta hur automaten tillverkar kaffet. Apparaten är av plåt och tillåter ingen insyn. Det enda du vet är vilka knappar som finns att trycka på och att kaffekoppen fylls på med nybryggt kaffe. Man säger att de interna metoderna är privata.

Inuti apparaten finns egenskapen storlek_på_kaffekopp som bestämmer hur mycket kaffe som ska malas och hur mycket vatten som ska hällas på. Denna egenskap styrs av vilken knapp användaren tryckte på när denne valde koppstorlek. Knapparna är kopplade till olika metoder inuti automaten. I just fallet klasser har begreppet funktion bytt namn till metod, men det är samma sak. Trycker man på knappen anropar man en metod.

Efter mycket velande om koppstorlek, trycker användaren på startknappen. Då börjar en kedja av metoder att köras inuti automaten, som

Maler kaffe Värmer vatten Blandar med kaffet Trycker ut kaffet genom filtret

men hur det går till spelar ingen roll för kaffedrickaren/användaren. Mängden kaffe som ska malas, beräknas utifrån variabeln storlek_på_kaffe–kopp som användaren påver-kade med knapptryckningen tidigare. Mängden kaffebönor som behövs till detta, syns inte utåt och ska inte kunna ändras utifrån. Variabeln kaffebönor är privat och kan bara an-vändas inuti kaffeautomaten.

18.5.1. Arv Låt oss återvända till tillverkaren av dryckesautomater. Denne lagerför ett grundskåp som kan förses med olika mekanismer, som teblandare respektive kaffekvarn för att få slutresultatet teautomat eller kaffeautomat.

Page 225: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 223

De båda automattyperna nyttjar samma kontrollpanel med samma metoder, men de har olika mekanismer (klasser). Automaternas huvudrutin körs i kontrollpanelen, så när programmeraren ska skriva rutinen, skapar denne en instans av antingen klassen kaffe-automat eller teautomat. Sett från automatens huvudrutin gör det ingen skillnad efter-som de publika metoderna (knapparna på kontrollpanelens front) är desamma.

Arv är en utökning av klasser som medger att metoder ur en föräldraklass kan ärvas av barnklasser. I barnklasserna kan man lägga till fler metoder, som specialiserar barnklas-serna ytterligare.

Vid anropet till en metod i barnklassen används de ärvda metoderna från föräldraklassen om de inte skrivits över av nyare metoder i barnklasserna. Programmet som anropar barnklassen behöver inte bry sig om vilken av metoderna som gäller, den ärvda eller den nya.

Programmeraren bygger en föräldraklass, vilken motsvarar den fysiska kaffe-världens grundmodul och innehåller metoderna att starta processen, ange koppstorlek och värma vatten. Dessutom skapar han två barnklasser.

Teautomatklassen ärver föräldrametoderna för att starta processen, ange koppstorlek och värma vatten. Dessutom förses den med metoder för att blanda tepulvret.

Kaffeautomatklassen ärver samma föräldrametoder, men får istället andra metoder för att mala kaffebönor och filtrera kaffet.

Startmetoden duger inte till någon av barnklasserna, utan varje klass ersätter, skriver över, startmetoden med sin egen dryckesspecifika metod.

Page 226: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 224

När klassen kaffeautomat instansieras, skapas ett objekt som tillhör bara dess instansie-rare. Metoderna i kaffeautomaten vet också hur mycket kaffe som går åt, men det attribu-tet är privat och kan inte förändras av instansieraren. Det enda attribut instansieraren kan få tillbaka är koppstorleken, för att exempelvis visa upp på kaffeautomatens frontpa-nel. Kaffeautomatens instansierare får alltid tillbaka sin egen koppstorlek, inte teautoma-terns koppstorlek.

# klasser-kaffe-te.py import time # Definiera föräldraklass class kaffeverk_80: def __init__(self): self.koppstorlek = 'liten' self.vattentemperatur = 0 def start(self): print('Kaffeverk-80 bullrar') time.sleep(1) def ändra_koppstorlek(self, koppknapp): self.koppstorlek = koppknapp if koppknapp == 1: self.koppstorlek = 'Liten' elif koppknapp == 2: self.koppstorlek = 'Mellan-' else: self.koppstorlek = 'Stor' def värm_vatten(self): self.vattentemperatur = 100 print('Kaffeverk-80 bubblar') time.sleep(1)

Page 227: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 225

# Teautomaten äver egenskaper från kaffeverket class teautomat(kaffeverk_80): def __init__(self): kaffeverk_80.__init__(self) def blanda_te(self): print('Te blandas') time.sleep(1) # Metoden start anropar föräldraklassens metod # värm_vatten def start(self): print('Teautomaten bullrar') time.sleep(1) self.värm_vatten() self.blanda_te() print(self.koppstorlek, 'kopp te är färdig') # Kaffeautomaten äver egenskaper från kaffeverket class kaffeautomat(kaffeverk_80): def __init__(self): kaffeverk_80.__init__(self) def mala_bönor(self): print('Bönor mals') time.sleep(1) def filtrera_kaffe(self): print('Kaffet filtreras') time.sleep(1) # Metoden start anropar föräldraklassens metod # värm_vatten def start(self): print('Kaffeautomaten bullrar') time.sleep(1) self.mala_bönor() self.värm_vatten() self.filtrera_kaffe() print(self.koppstorlek, 'kopp kaffe är färdig')

# Huvudrutin # Börja med att göra kaffe automat = kaffeautomat() automat.ändra_koppstorlek(2) automat.start() print ('') # Fortsätt med att göra te automat2 = teautomat() automat2.ändra_koppstorlek(3) automat2.start()

Programmet börjar med definitionen av föräldraklassen kaffeverk_80 som innehåller grundmetoder för barnklasserna, nämligen startrutinen start(), rutinen för koppstorlek och rutinen som låtsas värma vatten.

Page 228: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 226

I definitionen class teautomat(kaffeverk_80): ärver teautomatklassen metoderna från föräldraklassen, men skriver över föräldrametoden start() med sin egen metod, som bland annat vet hur man blandar_te. För att få varmvatten anropar den dock föräldrame-toden för detta, med self.värm_vatten().

I definitionen class kaffeautomat(kaffeverk_80): ärver även kaffeautomatklassen alla meoder från föräldraklassen, men som med teautoamten duger inte metoden start() utan den skrivs över av en metod som vet hur man mal kaffebönor och filtrerar kaffet.

Hittills har inget körts. Huvudrutinen börjar med att instansiera en kaffeautomat med satsen automat=kaffeautomat() som skapar ett objekt av klassen kaffeautomat som dessutom ärver metoder från kaffeverk_80.

Eftersom barnklassen kaffeautomat inte har någon metod för att ändra koppstorleken, kommer anropet automat.ändra_koppstorlek(2) att använda föräldrametoden änd-ra_koppstorlek(self, koppknapp). Argumentet self pekar på automat även om funk-tionen är definierad i föräldraklassen.

Satsen automat.start() hittar metoden start(self) i barnklassen och det blir denna som får köra kaffebryggningen. Den börjar med steget self.mala_bönor(). Därfter körs self.värm_vatten() vilken pekar till föräldrametoden värm_vatten(self) som simulerar vattenkokning med satsen self.vattentemperatur = 100. Hade automat frågat efter vattentemnperaturen, hade den fått svaret 100. Därefter körs metoden self.filtrera_kaffe().

Gå själv igenom hur rutinen för instansiering av teautomaten fungerar.

Körningen ser ut så här.

>>> %Run klasser-kaffe-te.py Kaffeautomaten bullrar Bönor mals Kaffeverk-80 bubblar Kaffet filtreras Mellan- kopp kaffe är färdig Teautomaten bullrar Kaffeverk-80 bubblar Te blandas Stor kopp te är färdig

Det är föräldrametoden som kokar vattnet i båda fallen, vilket visas med utskriften ”Kaf-feverk-80 bubblar” men som du ser får man aldrig utskriften ”Kaffeverk-80 bullrar”, ef-tersom båda barnklasserna har sina egna start-metoder som gäller före föräldrametoden.

Page 229: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

IX KLASSER

RÄKNA MED PYTHON 227

18.6. Övningar på klasser

18.6.1. Dataknådare Du ska nu sätta samman alla kunskaper från hela bokens första del till en samling klasser som du kan ha nytta av i matematikdelen.

Skriv själv ett testprogram till varje deluppgift nedan, för att visa att klasserna fungerar.

a) Skriv en klass som hanterar datamängder. Kalla den för dataknådare. Data kan komma till klassen i form av enskilda värden, en lista eller ett dictionary. Data ska dess-utom kunna beskrivas med en etikett. Klassens användare kan etikettera data och hämta ut innehållet som en lista eller ett dictionary.

b) Skriv en klass som hanterar matplotlib. Kalla den för grafritare. Den får sina data-punkter genom att den blir tilldelad ett objekt av klassen dataknådare. Den ska kunna rita upp punkt-, stapel, linje- eller cirkeldiagram. Den ska också kunna spara diagrammet som en bild, på hårddisken.

c) Skriv en klass som plockar sönder CSV-filer och gör dem till objekt av klassen dataknå-dare. Kalla den för CSV_läsare. Indata till klassen ska vara ett filnamn. Det ska finnas en metod för att hämta ut objekt av klassen dataknådare.

d) Utöka klassen CSV_läsare med flera metoder, så att den kan extrahera enskilda ta-bellkolumner, rader eller celler ur filen.

18.7. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 230: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FELSÖKNING

RÄKNA MED PYTHON 228

19. Felsökning

Alla gör fel. Eftersom programmering är ytterst formellt och kraven på korrekt syntax (grammatik) är absoluta, är det lätt att göra misstag.

Python försöker inte ens gissa vad du menade, den bara slår i sin grammatikbok och pe-kar med pekpinnen. Det trasiga program som används här, återfinns i korrekt form som kassakvitto.py på sidan 19.

19.1. Förklaring av enklare syntaktiska fel

När du skriver en text i programredigeraren markeras bara misstänkt felaktig syntax med ett grått eller grönt fält. Felmeddelandena visas först när du försöker köra programmet.

Du behöver inte nödvändigtvis läsa detta kapitel nu, utan kan återvända hit och använda det som referens om du får felmeddelanden senare.

19.1.1. Saknat citationstecken

Print-satsen på rad 4 ska skriva ut det argument som står inom parentesen. Avsikten var att skriva ut ordet ”kvitto” men redan vid inmatningen protesterar Thonny med grön bakgrund och menar att det är något syntaktiskt fel. Ordet ”kvitto är en textsträng och sådana ska ha citationstecken på båda sidor. Det är mycket vanligt att man glömmer dem. Som du ser klagar Python med SyntaxError i rött och pekar på print-satsen där det miss-tänkta syntaxfelet finns. Korrekt syntax hade varit:

print("kvitto")

Läs mer om utmatning av text på sidan 47.

Page 231: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FELSÖKNING

RÄKNA MED PYTHON 229

19.1.2. Felaktigt citationstecken Det finns fyra sorters citationstecken, men bara två av dem passar Python. Det kan vara lite knepigt om man inte känner till det och felet kan få en i övrigt korrekt programrad att ändå markeras som felaktig.

Print-satsen i felmeddelandet ovan är korrekt. Det är de typografiska (sneda) citations-tecknen ” och ’ som inte går att använda i Python. När du skriver rakt in i Thonny på tangentbordet är det inga problem, för du får alltid de raka citationstecknen " och ' (apo-strof) men om du kopierar programkod ur en ordbehandlare, vilken som standard visar typografiska citationstecken, kommer Python att protestera mot de sneda citationsteck-nen ” som blir resultatet, så som visas ovan.

19.1.3. Saknad parentes

Python fortsätter med att hitta fel, nu på rad 6. Python menar att print-satsen med skum-tomtar lider av syntaxfel. Tittar man närmare, ser man att satsen är korrekt. Då finns felet någonstans i närheten.

Det grå området visar var du ska börja leta. Fortsätter du åt höger på rad 5, stöter du ganska snart på slutet av raden där en parentes saknas. Det är sannerligen inget ovanligt skrivfel. Parentespar ska alltid vara kompletta.

Page 232: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FELSÖKNING

RÄKNA MED PYTHON 230

19.1.4. Felaktigt variabelnamn

Variabler kan döpas ganska fritt, men ett absolut krav att det inte får vara en siffra först i variabelnamnet. Det finns andra tecken som inte heller får förekomma i variabelnamn, som % & / # ! : ; + ? och så vidare. Korrekt syntax hade varit:

kexchoklad_pris = 10

Läs mer om namngivning av variabler på sidan 34.

19.1.5. Felstavat variabelnamn

Alla variabler som ska skrivas ut eller användas i en jämförelse, måste vara definierade. De måste alltså ha varit använda tidigare i programmet och ha tilldelats ett värde. Det vanligaste brottet mot denna regel uppstår när man stavar fel på ett variabelnamn. Det skulle inte ha stått skumtomte_pris, utan skumtomtar_pris. Korrekt syntax hade va-rit:

print("skumtomtar", skumtomtar_pris)

Läs mer om namngivning av variabler på sidan 34.

19.1.6. Skiftläge Python, såväl som de flesta andra programmeringsspråk gör skillnad mellan versala och gemena tecken i variabelnamn. Det betyder att Svar och svar är två skilda variabler. Rå-kar man göra ett sådant fel, anmärker Python på följande sätt:

>>> svar = 7 >>> print (Svar) Traceback (most recent call last): File "<pyshell>", line 1, in <module> NameError: name 'Svar' is not defined

Page 233: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FELSÖKNING

RÄKNA MED PYTHON 231

Python anser att variabeln Svar är odefinierad. Du försöker använda en variabel som inte tidigare har tilldelats ett värde. Då finns den inte.

Uttrycket File "<pyshell>", line 1 kan behöva förklaras. Python anser hela tiden att den läser data från en fil. Även tangentbordet är fil, om än bara en virtuell fil med en enda rad. Därför finns felet på rad 1. I Thonny kallas denna fil <pyshell> (men kan på andra ställen heta ”standard input” eller stdin).

19.2. Om indrag saknas

Vad händer om man inte gör indrag för att markera ett block?

Eftersom Python vet att ett block börjar efter en sats som avslutas med ett kolon, kommer tolken att mata ut ett felmeddelande om indraget saknas på nästa rad.

Python förväntade sig att print-satsen på rad 2 skulle vara indragen. Python gör så för att hjälpa dig att skriva ett snyggt och lättfattligt program. Det var en av grundsatserna när Python uppfanns och här ser du en del av genomförandet.

Page 234: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FELSÖKNING

RÄKNA MED PYTHON 232

19.3. Oväntat indrag

Skulle du råka göra ett indrag på fel ställe, eller ett indrag för mycket kommer Python också att lämna ett felmeddelande.

Page 235: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

FELSÖKNING

RÄKNA MED PYTHON 233

Del 2 Programmering i

matematiken

Page 236: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 234

20. Reella tal och deras egenskaper

De reella talen är alla tal som går att beskriva på en kontinuerlig tallinje. Inom matemati-ken delas de reella talen upp i olika undergrupper som har olika egenskaper.

20.1. De naturliga talen

De naturliga talen är alla de positiva tal utan decimaler som är större än eller lika med noll, såsom 0, 1, 2, 3. Dessa tal används i vardagen när man ska räkna antal förekomster av något, som till exempel hur många fingrar som finns på handen eller hur många år man fyller.

De naturliga talen kan också kallas för positiva heltal. Det finns även negativa heltal, så-som –1, –2, –3. För Python spelar det ingen roll om talen är positiva eller negativa heltal. Det finns bara heltal.

20.1.1. Prova på Använd terminalvyn och utför följande beräkningar:

a) 2 + 2

b) 9 – 3

c) En klar, vindstilla höstnatt fryser våra sjöar till is, det börjar från stränderna och växer sig ut över vattnet. Ytvattnet har en temperatur på just 0°C när det sker. En månad sena-re är temperaturen –5° C. Hur stor är temperatursänkningen?

d) Elin köper två påsar med 4 äpplen i varje påse. Hon ger 2 äpplen till Kristina. Hur många äpplen har Elin kvar?

20.1.2. Lösningsförslag Exempel a och b är enkla räkneövningar

>>> 2 + 2 4 >>> 9 - 3 6

Page 237: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 235

c) Det var 0° C och sänks till –5° C på en månad

>>> 0 - (-5) 5

d) Elin handlade 2 påsar * 4 äpplen = totalt 8 äpplen. Av dessa 8 äpplen så gav Elin bort 2 till Kristina.

>>> 2 * 4 - 2 6

20.1.3. Övningar på reella tal Använd terminalvyn för att beräkna

a) En varm sommardag sätter du igång luftkonditioneringen och sänker inomhustempe-raturen från 35 °C till 21 °C. Hur många graders sänkning har skett?

b) En sommardag är det 27 °C i skuggan. Du tittar in i frysen efter en glass. Hur många graders skillnad är det mellan ute och frysen om det är –16 °C i frysen?

c) Slickar man på en lyktstolpe när det är minusgrader ute kan man fastna med tungan. Om det är –18° C den kväll som man provar detta, hur många grader måste man värma lyktstolpen för att saliven ska tina och tungan ska lossna?

d) I filmen ”Världen räcker inte till” hoppar James Bond, agent 007, från ett plan som undviker radar genom att flyga på endast 35 meters höjd. Han hoppar ner i Sydkinesiska sjön utanför Vietnams kust. Efter att ha landat i vattnet dyker han ner till ett sjunket örlogsfartyg på ca 25 m djup. Hur stor är den totala höjdskillnaden?

e) Till jul vill man baka 225 st knäck, eftersom gammelfarfar är en hejare på att äta dem. Räkna om receptet som är för 75 st knäck till 225 st knäck.

2 dl strösocker 2 dl sirap 2 dl vispgrädde 1 dl hackad mandel 1 msk smör

20.1.4. Mattetävling a) Ta hjälp av terminalvyn och tävla med en klasskamrat. Testa de fyra räknesätten ge-nom att skriva in följande beräkningar i terminalen och låt din klasskamrat räkna ut sva-ret innan du ber Python beräkna resultatet. Kontrollera om din kamrat får samma svar som Python. Räkna ihop hur många rätta svar ni får.

3 + 5 4 + 7 6 – 3 2 * 3 4 / 2 5 * 4 17 – 9 18 / 2

18 / 3 2 * 19 16 – 7 6 + 7 [Du: Vad är 3 + 5 ?] [Klasskamrat: 8] [Python: >>> 3 + 5] [Python: 8 ] [Rätt 1] [Du: Vad är 4 + 7 ? ]...

b) Skriv ett program som använder sig av talen i föregående övning och frågar ”Vad blir: (ett av talen)?” Programmet ska kontrollera om svaret är rätt och om det inte är korrekt

Page 238: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 236

ska programmet visa det rätta svaret. Programmet ställer bara en fråga och avslutas se-dan.

Körning 1

Vad blir: 3 + 5? 10 Fel, 3 + 5 blir 8

Körning 2

Vad blir: 3 + 5? 8 Rätt

c) Utöka ditt program till att fråga efter samtliga beräkningar i listan från övning 25.13.2, ett efter ett. Räkna hur många korrekta och felaktiga svar användaren ger. Testa ditt program på din klasskamrat. När alla beräkningar gjorts, ska ett resultat presenteras.

Körning

Vad blir: 3 + 5? 8 Rätt Vad blir: 4 + 7? 10 Fel, 4 + 7 blir 11 Vad blir: 6 – 3? 19 ... Resultat: 10 rätt och 2 felaktiga svar.

20.2. Positionssystemet

I vårt decimala talsystem finns det tio stycken siffror för att representera tal, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Dessa siffror kan i sig maximalt beskriva 9 förekomster av någonting, tillex-empel nio fingrar. Men tittar vi på våra händer så har de flesta av oss tio fingrar men vi kan inte representera tio med de siffror vi har tillgängliga. Sättet att uttrycka tio med de siffror vi har är att kombinera 1 och 0 i just den ordningen, alltså 10, kombinerar vi sam-ma siffror åt andra hållet 01 så betyder det något helt annat nämligen ett.

Det decimala talsystemet bygger dels på att siffran i sig har ett värde samt positionen ger en multiplikationsseffekt om 10 för varje position åt vänster den står. Siffrornas positio-ner kallas för ental, tiotal, hundratal, tusental osv.

20.2.1. Prova på a) Dela upp talet 42 i tiotal och ental. Skriv ut delarna.

b) Beskriv uppgiften a) i generell form för alla heltal.

20.2.2. Lösningsförslag a)

# positioner.py # Talet från uppgiften är 42 tal_att_dela = 42 # Rest vid heltalsdivision med 10 ger ental ental = tal_att_dela % 10

Page 239: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 237

# Heltalsdivision av tal_att_del med 10 gör tiotalet # till ental tal_att_dela = tal_att_dela // 10 # Rest vid division med tio ger tiotalet tiotal = tal_att_dela % 10 print('Tiotal ', tiotal) print('Ental ', ental)

Vid körning

Tiotal 4 Ental 2

b) Tal_att_undersöka tilldelas det värde som ska delas upp i positioner.

Slingan med villkoret: så länge tal_att_undersöka är större än noll.

Använd rest vid division med tio och tal_att_undersöka för att få ut den minst signifikanta siffran.

Använd heltalsdivion med tio på tal_att_undersöka för att utesluta den minst signifikanta siffran.

Börja om från slingans villkor.

20.2.3. Värdesiffror Skriv ett program som uppmanar användaren att mata in ett tal mellan 0 och 999. Pro-grammet ska skriva ut vilka siffror talet består av och deras positionsvärden. Skriv även ut talet i summaform.

Körning 1

Ange ett tal mellan 0 – 999? 789 7 hundratalsposition 8 tiotalsposition 9 entalsposition 789 = 700 + 80 + 9

Körning 2

Ange ett tal mellan 0 – 999? 205 2 hundratalsposition 0 tiotalsposition 5 entalsposition 205 = 200 + 0 + 5

20.3. Rationella och irrationella tal

Rationella tal är de tal som man kan uttryckas som bråktal, alltså en kvot mellan två hel-

tal, såsom 31 , 3

2 , 33 , och 3

4 . Dessa tal kommer att uppvisa ett visst mönster i deci-

malerna som oftast är en upprepning av samma siffra, som till exempel 31 = 0,333333… i

all oändlighet.

Page 240: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 238

De irrationella talen kan man inte uttrycka som en kvot mellan två heltal, till exempel π, och de uppvisar inget återkommande mönster i decimalerna. π = 3,14159265359...

Gemensamt för rationella och irrationella tal är att de har en decimaldel. I Python kallas dessa tal för flyttal. Flyttal skrivs i samtliga programmeringsspråk med decimalpunkt (0.33) vilket kan vara förvirrande eftersom vi använder decimalkomma i Sverige och övri-ga Europa, utom i England.

20.3.1. Prova på Använd terminalvyn och utför följande beräkningar:

a) 1,12 + 0,88

b) 31

31

c) Francisco hittar ett recept på lemonad på Internet. Man behöver 10 dl vatten, 6 citroner och 6 dl socker. Men Francisco har bara 2 citroner hemma. Hjälp honom att räkna om receptet så han kan ta med lemonaden till stranden och spela boll.

20.3.2. Lösningsförslag Exempel a och b kan bara matas in precis som de står.

>>> 1.12 + 0.88 2.0 >>> 1/3 + 1/3 0.6666666666666666

c) Antalet citroner bestämmer hur mycket lemonad som kan göras. Skaleringen av recep-

tet blir alltså 62 . Följande beräkningar ska göras:

>>> # 10 dl vatten * 2/6 >>> 10 * 2/6 3.3333333333333335 >>> >>> 6 dl socker * 2/6 >>> 6 * 2/6 2.0

Franciscos recept blir 3,3 dl vatten, 2 citroner och 2 dl socker.

20.3.3. Rationella och irrationella tal

a) 3 är ett nästan magiskt tal som inte går att skriva helt och hållet: ett irrationellt tal.

Undersök om du kan hitta ett bråk som beskriver 3 genom att prova olika bråk och närma dig det riktiga värdet och se hur nära du kommer.

>>> 3 ** 0.5 1.7320508075688772

Det går att närma sig det riktiga värdet nedifrån eller uppifrån, från till exempel 23 eller

24 . Börjar du nedifrån får du först öka täljaren tills du passerat det riktga värdet och

därefter öka nämnaren så att du kommer under det riktiga värdet. Därefter får du öka

Page 241: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 239

täljaren igen. Avsluta försöket när du kommit 0,0001 ifrån det riktiga värdet och visa hur många försök som behövdes.

b) π kan nästan beräknas. All världens matematiksnillen har arbetat med problemet i många hundra år. Det klarar du på tio minuter med en dator. Koncentrera dig på någon av följande metoder.

Wallisprodukten ger π/2 om du försöker med att öka n från 0 till oändligheten. Du kan inte försöka med oändligheten, men undersök hur långt du rimligen kan fortsätta:

12

2*

12

2

n

n

n

n

François Viète levde mellan 1540 och 1603 och arbetade sig gråhårig på att försöka räk-na fram π. Viètes metod ger 2/π när n går mot oändligheten:

n

i

i

n

a

1 2lim

för 12 nn aa där 21 a

Liebniz formel ger π/4:

0 )34(*)14(

2n nn

Vill du ha fler metoder att räkna ut närmevärden på π så finns de beskrivna på Wikipedia.

20.4. Prioriteringsregler

Tro det eller ej, men matematik speglar alltid verkligheten! Och för att göra det finns det en slags grammatik. En av dessa grammatiska regler kallas prioritering, som säger att saker som står innanför parenteser alltid ska beräknas först. Sedan ska multiplikation och division utföras för att avsluta med addition och subtraktion. I Python används samma prioriteringsregler som inom matematiken i övrigt.

Exempel

4 + 2 · 4 = 4 + 8 =

12

(4 + 2) · 4 = 6 · 4 =

24 Det är inte bara parenteser som kopplar ihop två tal som i exemplet ovan. Kopplingar kan även göras på ett annat sätt – med ett bråkstreck.

3

42

Bråket innebär att man först ska addera termerna 2 och 4 för att sedan dela summan 6 med 3.

23

6

3

42

Bråkstreck kan inte användas i Python eftersom alla satser skrivs på en enda rad. Bråk-strecket måste alltså ersättas med parenteser. Exemplet ovan skrivs som

Page 242: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 240

(2 + 4)/3

20.4.1. Prova på Prova följande uppgifter i pythontolken och förklara vilka prioriteringsregler som an-vänds:

a) 5 + 6 * 2 – 6

b) 3 * 3 * 3 / 3

c) 3 * (4 + 4) + 3

d) 3

)42(*2

20.4.2. Lösningsförslag a)

>>> 5 + 6 * 2 - 6 11

Först beräknas 6 * 2 = 12 enligt prioriteringsregeln för multiplikation.

Sedan beräknas 5 + 12 – 6 enligt prioriteringsregeln addition och subtraktion.

b)

>>> 3 * 3 * 3 / 3 9.0

Multiplikation och division har ingen inbördes prioritering, så uttrycket kommer att lösas från vänster till höger.

c)

>>> 3 * (4 + 4) + 3 27

Först beräknas (4 + 4) = 8 enligt prioriteringsregeln för parenteser.

Sedan beräknas 3 * 8 enligt prioriteringsregeln för multiplikation.

Sist beräknas 24 + 3 = 27 enligt prioriteringsregeln för addition.

d) Eftersom man i Python skriver uttryck på en rad och i matematik kan använda bråk-streck för uttryck måste man först sätta in parenteser så att de motsvarar bråkstreckets prioritet.

3

)42(*2

>>> (2*(2 + 4))/3 4.0

I det här exemplet ska det finnas en parentesnivå inuti den första parentesen, nämligen (2 * (2 + 4)).

Page 243: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 241

20.4.3. Prioriteringsregler Räkna ut uttrycket och motivera prioriteringarna under beräkningens gång.

a) ((6 * (9 – 46))**2) / 7

b) (4 + 4 / 3)**2

c) 2**16 % 19

d) 22 % 20 **16

e) Inessa Kravets från Ukraina är världsrekordhållare för damer i trestegshopp. Hennes rekord är 15,50 meter. Ett trestegshopp går till så att man tar fart och hoppar. Sedan får bägge fötterna ta i marken en gång till. På det tredje steget ska man hoppa så långt man kan. Anta att Inessas två första steg var 4 meter vardera och det sista hoppet var resten.

20.5. Potenser

Man kan säga en sak om matematiker: de kan inte låta bli att ställa frågan: ”Hur vore det om vi gjorde så här?”

Tecknet för upphöjt till kan variera beroende på vilken maskin man använder och vad den har för skärm. För miniräknaren i mobiltelefoner är det inte ovanligt att man använder en cirkumflex ^ för att beteckna upphöjd till. Ganska logiskt för den ser ut som en liten uppåtpil. I Python skriver man ** eller gånger-gånger:

32 skrivs 3**2 43 skrivs 4**3 105 skrivs 10**5

20.5.1. Prova på Får du samma svar när du använder dessa olika sätt att skriva potenser?

a) 32 * 34 och dess motsvarigheter 3(2+4), 36 och 3*3*3*3*3*3

b) 43 * 42 och dess motsvarigheter 4(3+2), 45 och 4*4*4*4*4

c) Prova på att skriva ett program som testar dessa tre olika format för potenser. Låt an-vändaren mata in två lika baser med olika potenser. Visa de olika operationerna på skär-men och redogör för svaret.

20.5.2. Lösningsförslag a)

>>> 3**2 * 3**4 729 >>> 3**(2+4) 729 >>> 3**6 729 >>> 3*3*3*3*3*3 729

b)

>>> 4**3 * 4**2 1024 >>> 4**(3+2) 1024

Page 244: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 242

>>> 4**5 1024 >>> 4*4*4*4*4 1024

c)

# potensformer.py # Läs in bas från användaren bas = int( input("Ange en bas? ") ) # Läs in potens 1 och 2 från användaren potens_1 = int( input("Ange första potens? ") ) potens_2 = int( input("Ange andra potens? ") ) # Form 1 produkt_1 = bas**potens_1 * bas**potens_2 print("Form 1: {0}**{1} * {0}**{2} = {3}" .format(bas, potens_1, potens_2, produkt_1)) # Form 2 produkt_2 = bas**(potens_1 + potens_2) print("Form 2: {0}**({1} + {2}) = {3}" .format(bas, potens_1, potens_2, produkt_2)) # Form 3 summa_potens = potens_1 + potens_2 produkt_3 = bas**summa_potens print("Form 3: {0}**{1} = {2}" .format(bas, summa_potens, produkt_3)) # Form 4 if summa_potens == 0: # Om potensen är 0 inträffar specialfallet a**0 = 1 produkt_4 = 1 form4 = "specialfall {}**0".format(bas); else: # Den här formen är dynamisk. Vid programmeringen # vet man inte hur många gånger basen ska upprepas. # Är potensen 1 så är det: bas # Är potensen 2 så är det: bas * bas # Är potensen 3 så är det: bas * bas * bas # osv # Analyserar man mönstret ser man att multiplika- # tionstecknet inte ska komma i början av utskriften, # så början är ett specialfall. För varje potens # upprepas "* bas" tills antalet potenser förbrukats. form4 = "{}".format(bas); produkt_4 = bas antal = 1 # Är summa_potens = 1 kommer slingan inte att # köras. Orsaken till att funktionen # abs(summa_potens) används är att summa_potens kan # vara negativ - se nedan.

Page 245: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 243

while antal < abs(summa_potens): # Här fylls textsträngen på med mönstret "* bas" # Produkten multipliceras med basen en gång till # (ökar potensen med 1). Antalet potenser som # redan är beräknade i produkten ökas med ett form4 = "{0} * {1}".format(form4, bas); produkt_4 = produkt_4 * bas antal = antal + 1 if summa_potens < 0: # Om potensen är negativ, krävs speciell # hantering. En negativ potens är samma som # 1/bas**potens form4 = "1 / ( {} )".format(form4) produkt_4 = 1 / produkt_4 # Skriv ut som form 4 print("Form 4: {0} = {1}" .format(form4, produkt_4)) # Jämför de fyra olika formernas produkt if ( produkt_1 == produkt_2 and produkt_2 == produkt_3 and produkt_3 == produkt_4): print("De fyra formerna ger samma resultat!") else: print("Nu är det något som är fel")

Indata från användaren tilldelas variablerna bas, potens_1 och potens_2. Beräkningar-na utförs och redovisas på skärmen, inklusive resultat. Utifrån en frågesats ska program-met redovisa att svaren är lika, oberoende av format. Annars ska det tala om att något är fel.

Form 4 är extra knepig för den måste ta särskild hänsyn till om potensen är negativ eller noll. Se kommentarena i koden.

If-satsen på slutet är för lång för att få plats på en rad. Satsen har därför radbrutits så att alla argument (produkt_1==...) står snyggt under varandra, indragna med fyra blanksteg. Detta kommer att ge en visuell konflikt med print-satsen i blocket efter if-satsen som då inte längre liknar ett indraget block, men det är fullt tillåtet.

>>> %Run potensformer.py Ange en bas? 3 Ange första potens? 2 Ange andra potens? 4 Form 1: 3**2 * 3**4 = 729 Form 2: 3**(2 + 4) = 729 Form 3: 3**6 = 729 Form 4: 3*3*3*3*3*3 = 729 De fyra formerna ger samma resultat!

Med föreslaget program kan du undersöka många olika exempel på potensmultiplikation.

Page 246: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 244

20.5.3. Att dividera tal med potenser Nästa steg är att fundera över division mellan potenser. Tänk dig samma siffror som ovan, men med division med istället för multiplikation: 43 / 42. Det är samma sak som (4 * 4 * 4) / (4 * 4). Du vet att 4 / 4 är ett och kan förkortas bort. Detta finns med två gånger i nedan-stående beräkning:

A. Resultatet blir: (4 * 4 * 4) / (4 * 4) = 4

Det kan också visas så här: 43 / 42 = 4(3 – 2) = 41 = 4

Multiplikation mellan baserna var detsamma som att addera exponenterna. På samma sätt är division mellan baserna en subtraktion mellan exponenterna. Subtraktion är mot-satsen till addition, precis som division är motsatsen till multiplikation.

En negativ exponent anger att talet är mindre än 1, men större än 0. Ett exempel på detta är 0,04. Det är samma som en tjugofemtedel eller 1/25. Man kan skriva ”inverterade” tal på olika sätt: 1/25 är samma sak som 1/52 eller 5–2 och alla tre kan skrivas 0,04 i decimal-form.

20.5.4. Prova på a) 4**2 / 4**4 och dess motsvarighet: 4**(2–4) samt 4**–2

b) 3**2 / 3**6 och dess motsvarighet: 3**(2–6) samt 3**–4

c) Modifiera ditt program från ovan. Nu ska den klara av att beräkna division av tal med potenser på de tre olika sätt som redovisas ovan. Programmet ska visa upp vilken beräk-ning som görs och vilket svar som erhålls samt om svaren är samma och korrekta.

20.5.5. Lösningsförslag a)

>>> 4**2/4**4 0.0625 >>> 4**(2-4) 0.0625 >>> 4**-2 0.0625

b)

>>> 3**2/3**6 0.012345679012345678 >>> 3**(2-6) 0.012345679012345678 >>> 3**-4 0.012345679012345678

c)

Dividera med potenser.

# division_med_potenser.py # Läs in bas från användaren bas = int( input("Ange en bas? ") ) # Läs in potens 1 och 2 från användaren potens_1 = int( input("Ange första potens? ") )

Page 247: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 245

potens_2 = int( input("Ange andra potens? ") ) # Form 1 kvot_1 = bas**potens_1 / bas**potens_2 print("Form 1: {0}**{1} / {0}**{2} = {3}" .format(bas, potens_1, potens_2, kvot_1)) # Form 2 produkt_2 = bas**(potens_1 - potens_2) print("Form 2: {0}**({1} - {2}) = {3}" .format(bas, potens_1, potens_2, produkt_2)) # Form 3 differens_potens = potens_1 - potens_2 produkt_3 = bas**differens_potens print("Form 3: {0}**{1} = {2}" .format(bas, differens_potens, produkt_3)) # Jämför de tre olika formernas produkt if kvot_1 == produkt_2 and produkt_2 == produkt_3: print("De tre formerna ger samma resultat!") else: print("Nu är det något som är fel")

Körning av programmet

>>> %Run division_med_potenser.py Ange en bas? 4 Ange första potens? 2 Ange andra potens? 4 Form 1: 4**2 / 4**4 = 0.0625 Form 2: 4**(2 - 4) = 0.0625 Form 3: 4**-2 = 0.0625 De tre formerna ger samma resultat!

20.5.6. Små och stora tal Det är ingen hemlighet att 10 * 10 = 100. Dessutom kan man skriva 10 * 10 = 102. Ser du sambandet? Exponenten är 2 och talet 100 har två nollor. Talet 10 000 har fyra nollor och skrivs 104.

Men hur ska man skriva 20 000 med potenser? Man delar talet i två delar:

20 000 = 2 * 104

25 000 000 kan skrivas 25 * 106 eller 2,5 * 107

20.5.7. Prova på Beräkna följande

a) 4 * 102 * 4 * 104

Page 248: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 246

Grafen är ett hexagonalt mönster av kolatomer, tunt men oerhört starkt, starkare än stål.

b) Grafen består av kolatomer som är kopplade i ett hexagonalt mönster. Materialet är endast en atom tjockt, men kan tillverkas i stora flak. Ett flak på en kvadratmeter väger 0,77 mg och består av 0,0641 mol kol (mol är ett standardmått för grundämnen, nämligen ungefär 6,022141 * 1023 stycken atomer). Hur många kolatomer består ett kvadratmeter-stort flak grafen av?

c) Om man antar att kolatomerna är jämt fördelade över hela ytan och har direktkontakt med varandra, ungefär hur stor är en kolatom? Svara med lämpligt prefix och tiopotens. Approximera det hexagonala mönstret till ett rutnät med räta vinklar mellan kolatomer-na.

20.5.8. Lösningsförslag a)

>>> 4*10**2 * 4*10**4 16000000

b)

>>> 0.0641 * 6.022141 * 10**23 3.860192381e+22

c)

>>> from math import sqrt >>> math.sqrt(1/3.860192381e+22) 5.089739151796541e-12

~5.09 pm

20.5.9. Potenser a) Skriv ett program som tar emot en bas och en exponent och utvecklar dem till en talse-rie och visar produkten.

Exempelkörning

Ange bas? 7 Ange exponent? 3 7*7*7=343

Page 249: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 247

b) Skriv ett program som finner grundpotensformen som tiopotens för ett stort tal, genom att dividera med tio upprepade gånger i en slinga.

Exempelkörning

Ange tal? 4711 Grundpotens: 4,711 * 10**3

c) Modifiera programmet så att det klarar negativa tiopotenser, alltså tal mindre än ett.

Exempelkörning

Ange tal? 0.042 Grundpotens: 4.2 * 10**–2

20.6. Rötter

Frågan som ställs när man beräknar kvadratrötter är vilken ”rot” ska man multiplicera med sig självt för att, till exempel få svaret 16? Svaret är såklart 4. 4 * 4 = 16. Att beräkna de flesta kvadratrötter är dock lite svårare än så eftersom det inte finns så många jämna rötter. Talen 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 och 100 är kvadraterna på de elva första na-turliga talen 0, 1, 2, 3 4, 5, 6, 7, 8, 9 och 10. Alla andra tal mellan 0 och 100 saknar rötter som är naturliga tal (positiva hela tal). Ofta får man ett irrationellt tal som svar.

Tredje- och fjärderoten och så vidare fungerar på samma sätt, men då är det en fråga om vilken rot som man har om roten ska multipliceras med sig självt ett antal gånger: 3√27 är till exempel 3 därför att 3· 3· 3 = 27

Ett annat sätt att skriva rötter är att uttrycka dem som potenser. I själva verket är det det generella sättet att uttrycka rötter i Python, eftersom Python inte har något rottecken. Vänj dig alltså vid att uttrycka kvadratrötter som bas**(1/2), tredjerötter som bas**(1/3), fjärderötter som bas**(1/4) och så vidare. Det ger dessutom nya, spännande möjligheter, nämligen möjligheten till tvåtredjedelsrötter, med bas**(2/3).

Python har massor av förenklande funktioner, som till exempel math.sqrt(). För att ta kvadratroten ur 100 och visa resultatet, skriver du satsen.

print (math.sqrt(100)) 10.0

Fördelen med att använda math.sqrt() är att det direkt framgår för programmeraren att det handlar om rötter. Nackdelen är att denna typ av funktion bara finns för kvadratröt-ter.

20.6.1. Prova på Utför dessa beräkningar i Python.

a) 2 4 b) 4 16 c) 22 )4( d) 32

125

20.6.2. Lösningsförslag a)

>>> 4**(1/2) 2

Page 250: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

REELLA TAL OCH DERAS EGENSKAPER

RÄKNA MED PYTHON 248

b)

>>> 16**(1/4) 2

c)

>>> (4**(1/2))**2 4

d)

125**(2/3) 24.999999999999996

Det sista svaret ska egentligen bli 25, men vid flyttalsberäkningar på en dator kan det dyka upp siffror i slutet av resultatet som inte var förväntade. Orsaken till att det blir ett antal nior i svaret och inte jämna, fina 25 beror på datorns sätt att representera flyttal i minnet och är inte unikt för Python, utan finns i andra programmeringsspråk också.

20.6.3. Övningar på rötter Den tempererade tonskalan används i all västerländsk musik. Skalan utgår från normal-A i ettstrukna oktaven, som sitter mitt på pianot och har frekvensen 440 hertz.

Steget till nästa ton definieras som frekvensen gånger tolfte roten ur två, så här:

Hz16,466440*212

I Python uttrycker man det som

440 * 2**(1/12)

Beräkna nu frekvensen för alla toner från normal-A till A i tvåstrukna oktaven, som är den trettonde tonen och ska bli 880 hertz. Avrunda frekvensen till två decimaler. Skriv ut noternas namn före frekvenserna, från A, A#, b, H, C, ciss ... A och skriv ut ordet ”hertz” efter frekvensen. Normal-A behöver du inte räkna ut, eftersom du vet att frekvensen är 440 hertz. Det räcker med att skriva ut den. Det ska vara tre raka spalter. Gör även en rubrik. Ungefär så här:

A 440,00 hertz A# 466,16 hertz b 493,88 hertz ... A2 880,00 Hertz

20.7. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 251: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ALGEBRA

RÄKNA MED PYTHON 249

21. Algebra

Algebra kommer från arabiskans al-djebr som betyder återförening eller koppling. För moderna människor är algebra helt enkelt symbolisk matematik, där man ”räknar” med bokstäver eller variabler, snarare än konstanter (artimetik).

21.1. Formulera ett uttryck

OMG! är ett uttryck som används när man talar om att man är förvånad över något. Be-tyder OMG verkligen det? Nej. ”Oh, my God!” är egentligen en bön om Herrens beskydd i ett knepigt läge. Det är ett uttryck som vi fyllt med ny mening. Ett matematiskt uttryck är inte helt olikt.

Tre burkar energidryck och ett paket kvarg skulle kunna vara en ”fantastisk” lunch, men kan även beskrivas matematiskt: 3 ED + 1 LK. Detta kallas för att teckna ett uttryck för något.

Oftast använder man x, y och z i matematiken för att uttrycka saker som kan finnas i va-rierande mängd. I vårt fall blir det 3x + 1y.

21.1.1. Prova på Skriv ett uttryck för

a) Två zebror, tre xylofoner och en yxa.

b) Två påsar karameller, en hink med popcorn och två läsk.

c) Roten ur en hink med popcorn.

21.1.2. Lösningsförslag a)

# symbolisk_zebra.py from sympy import Symbol, pprint, sqrt zebra = Symbol("zebra") xylofon = Symbol("xylofon") yxa = Symbol("yxa") uttryck = 2*zebra + 3*xylofon + 1*yxa pprint(uttryck)

pprint() betyder Pretty Print, en funktion som skriver ut uttryck i Python på ett sätt som gör dem mera lika hur de skrivs för hand. Men kom ihåg att det bara gäller snygga utskrifter. Du måste ändå skriva formlerna på en rad när du programmerar.

Vid körning

3*xylofon + yxa + 2*zebra

b)

# symboliskt_godis.py from sympy import Symbol, pprint, sqrt karamellpåse = Symbol("karamellpåse")

Page 252: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ALGEBRA

RÄKNA MED PYTHON 250

popcornhink = Symbol("popcornhink") läsk = Symbol("läsk") uttryck = 2*karamellpåse + 1*popcornhink + 2*läsk pprint(uttryck)

Vid körning

2*karamellpåse + 2*läsk + popcornhink

c)

# popcornhink.py from sympy import Symbol, pprint, sqrt popcornhink = Symbol("popcornhink") uttryck = sqrt(popcornhink) pprint(uttryck)

Vid körning

_____________ \/ popcornhink

21.1.3. Symboliska uttryck Ställ upp ett symboliskt uttryck baserat på följande scenarion.

a) Baka en limpa av följande ingredienser:

500 gram mjöl 1 tesked salt 2 matskedar olja 2 deciliter vatten 25 gram jäst 20 gram torkade aprikoser

b) Gjut grunden till ett hus av:

15 ton cement 3 kubikmeter vatten 2 ton sand 47 meter armeringsjärn 1 gummistövel

21.2. Tilldela värden

Övningarna ovan var enbart symboliska. Skulle du vilja sätta in värden i symbolerna finns metoden subs som substituerar (ersätter) symboler med ett numeriskt värde eller annat uttryck. subs tar ett dictionary som argument, där nyckelordet ersätts med värdet.

21.2.1. Prova på Skriv ett uttryck och beräkna.

a) Roten ur en popcornhink, som kostar 45 kronor.

Page 253: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ALGEBRA

RÄKNA MED PYTHON 251

21.2.2. Lösningsförslag a)

# hink_45.py from sympy import Symbol, pprint, sqrt popcornhink = Symbol("popcornhink") uttryck = sqrt(popcornhink) roten = uttryck.subs({popcornhink : 45}) pprint(roten)

Vid körning

___ 3*\/ 5

21.3. Förenkla uttryck

Från exemplet ovan, om ni är två som ska äta varsin lunch med dryck och kvarg. Hur många drycker och paket med kvarg går det åt nu? Svaret är 3x + y + 3x + y eller dubbelt så mycket av varje sort. Det går bra att multiplicera med 2:

2 * (3x + 1y) = 6x + 2y

Man kan multiplicera med två och få rätt mängd.

21.3.1. Prova på Förenkla så långt som möjligt och använd funktionen factor() och simplify() för att fak-torisera och förenkla resultatet.

a) 3 (x + y + y + x) / (x + y)

b) x + (3x – 16)

c) x/3 + 5y – x + 3

d) Romerska tegelstenar var tre gånger så långa som breda. Höjden var sjättedelen av längden. Skriv ett så enkelt uttryck som möjligt för volymen av en sådan tegelsten.

e) 21z/2 + 5y/4 + y – z + 4(z + 2y)

f) (2z + 3y)**2 * 81 – y**2 * (6v – 3r)**2

21.3.2. Lösningsförslag a)

# förenkling.py from sympy import Symbol, factor, pprint, simplify x = Symbol('x') y = Symbol('y') uttryck = 3 * (x + y + y + x) / (x + y) pprint(uttryck) print('\nFaktor:\n') pprint(factor(uttryck))

Page 254: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ALGEBRA

RÄKNA MED PYTHON 252

print('\nSimplify:\n') pprint(simplify(uttryck))

Vid körning

6*x + 6*y --------- x + y

Faktor:

6

Simplify:

6

b) Vid körning

4*x - 16

Faktor:

4*(x - 4)

Simplify:

4*x - 16

c) Vid körning

2*x - --- + 5*y + 3 3 Faktor:

-(2*x - 15*y - 9) ------------------ 3 Simplify:

2*x - --- + 5*y + 3 3

d)

3 3*b ---- 2 Faktor:

3 3*b ---- 2

Page 255: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ALGEBRA

RÄKNA MED PYTHON 253

Simplify:

3 3*b ---- 2

e)

Faktor:

41*y + 54*z ----------- 4

Simplify:

41*y 27*z ---- + ---- 4 2

f)

Faktor:

-9*(r*y - 2*v*y - 9*y - 6*z)*(r*y - 2*v*y + 9*y + 6*z) Simplify:

2 2 2 - 9*y *(r - 2*v) + 81*(3*y + 2*z)

21.3.3. Förenkling Importera factor och simplify från sympy och förenkla följande uttryck.

a) –x4+2x2+x

b) –x2+2x–1

c) (x–y)2–y2

Du kanske känner att detta är ren sifferexercis som du aldrig kommer att få nytta av? Kommer du till Tekniska Högskolan kommer du att behöva använda det varje dag!

21.4. Parentesmultiplikation med två parenteser

Parenteser kan multipliceras med parenteser! Det som händer då är att allting i den ena parentesen ska multipliceras med allting i den andra:

(2x + 3) (4 + 3x) ger:

2x * 4 + 2x * 3x + 3 * 4 + 3 * 3x

8x + 6x * x + 12 + 9x (tänk på att x * x skrivs x2)

8x + 6x2 + 12 + 9x

Detta ska sedan förenklas på så sätt att alla delar som är av samma sort samlas. Man börjar normalt med högsta potensen av x, dvs x2:

6x2 + 8x + 9x + 12

Detta ger resultatet:

Page 256: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ALGEBRA

RÄKNA MED PYTHON 254

6x2 + 17x + 12

Parenteser kan innehålla fler än två faktorer:

(2x + 3) (4 + 3x + 2a) och då blir det såhär:

2x * 4 + 2x * 3x + 2x * 2a + 3 * 4 + 3 * 3x + 3 * 2a

8x + 6x2 + 4ax + 12 + 9x + 6a

21.4.1. Prova på Genomför parentesmultiplikationen och förenkla så långt som möjligt:

a) (2x + 6)(3x - 2)

b) (4 - 3x2)(2x + 5)

c) (8 + 3x)(4z - 3 + 2x)

d) (8 + 3x)(4z - 3 + 2x) - 12xz

21.4.2. Lösningsförslag >>> from sympy import Symbol, factor, simplify >>> from sympy import expand, collect >>> x = Symbol('x')

a)

>>> ekv = (2*x + 6)*(3*x - 2) >>> expand(ekv) 6*x**2 + 14*x - 12

b)

>>> ekv = (4 - 3*x**2)*(2*x + 5) >>> expand(ekv) -6*x**3 - 15*x**2 + 8*x + 20

c)

>>> ekv = (8 + 3*x)*(4*z - 3 + 2*x) >>> expand(ekv) 6*x**2 + 12*x*z + 7*x + 32*z - 24

d)

>>> ekv = (8 + 3*x)*(4*z - 3 + 2*x) - 12*x*z >>> expand(ekv) 6*x**2 + 7*x + 32*z – 24

Page 257: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ALGEBRA

RÄKNA MED PYTHON 255

21.5. Parentesmultiplikation med negativa tal

Hur blir det då om det finns negativa tal? Nu ska faktorerna i parentesen multipliceras med –3 istället för 3 som i det förra exemplet.

–3 * (2 + x) –3 * 2 – 3 * x –6 – 3x

Minus är något av det lättaste som finns att göra fel på i matematik och därför kan man tänka så här istället. Om man först multiplicerar in 3 i parentesen och sedan byter alla tecken, minskar risken att göra fel (Python räknar naturligtvis alltid precis som du skri-ver):

–3 * (2 + x) –(3 * 2 + 3 * x) –6 – 3x

Från vårt exempel med två parenteser:

(2x – 3) (4 + 3x) (2x – 3) (4 – 3x) 2x * 4 + 2x * 3x – 3 * 4 – 3 * 3x 2x * 4 – 2x * 3x – 3 * 4 + 3 * 3x

8x + 6x2 –12 - 9x 8x – 6x2 –12 + 9x 6x2 – x – 12 –6x2 + 17x –12

Till vänster finns –3 och minustecknet följer med när –3 ska multipliceras med både 4 och 3x. På högersidan finns två minustecken och då multipliceras –3x och –3. Tänk på att när man multiplicerar två negativa tal får man ett positivt tal, i vårt exempel 9x.

21.6. Ekvationer

Till att börja med måste betydelsen av likamed-tecknet (=) vara helt klar. Tidigare har ”lika med” varit en slags uppmaning att lösa ett problem, som:

3 + 6 = ____?

Det har funnits en slags rörelse från vänster till höger inbyggd i tecknet. När du arbetar med ekvationer betyder likamed-tecknet något helt annat! Det betyder att det som står till höger (högra ledet) och till vänster (vänstra ledet) om tecknet vara lika med varandra. En ekvation är ett påstående om att en sak är lika med en annan. I Python delas höger och vänster led helt från varandra med ett kommatecken innan de löses.

I ekvationen 3x = 15; ser du ganska snabbt att x = 5.

Läs mer i kapitel 14 om lösning av ekvationer. En annan metod att lösa ekvationer gra-fiskt visas senare i kapitel 22 om räta linjens ekvation.

21.6.1. Prova på a) 39 + x = 0

b) 39 + x = 54

c) 5x + 3 = 3x + 13

d) –2x – 5 = 3x – 10

Page 258: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ALGEBRA

RÄKNA MED PYTHON 256

21.6.2. Lösningsförslag >>> from sympy import solveset, Symbol, Eq

a)

>>> solveset(9 + x) {-9}

b)

>>> solveset(Eq(39 + x , 54)) {15}

c)

>>> solveset(Eq(5*x + 3 , 3*x + 13 )) {5}

d)

>>> solveset(Eq(-2*x - 5 , 3*x - 10)) {1}

21.7. Lösa ut variabler

Funktioner som hör ihop i ett ekvationssystem kan bli rätt komplicerade att reda ut. Där-för behöver man lära sig att lösa ut variabler, med andra ord uttrycka en relation i anting-en den ena eller andra variabeln.

Uttrycket 15x = 5y + 10 kan uttryckas antingen som x = något eller y = något.

21.7.1. Prova på Använd ekvationen 15x = 5y + 10

a) Uttryck ekvationen som en funktion av x.

b) Uttryck ekvationen som en funktion av y.

c) Tre stenar vägs. Sten 1 väger 32 g mer än dubbla vikten av sten 2. Sten 3 väger fyra gånger så mycket som sten 1. Tillsammans väger stenarna 512 g. Hur mycket väger sten 1, 2 och 3?

21.7.2. Lösningsförslag >>> from sympy import Symbol, solveset, Eq >>> x = Symbol('x') >>> y = Symbol('y')

a)

>>> solveset(Eq(15 * x, 5 * y + 10),x) {y/3 + 2/3}

b)

>>> solveset(Eq(15 * x, 5 * y + 10),y) {3*x - 2}

Page 259: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ALGEBRA

RÄKNA MED PYTHON 257

c)

>>> sten1 = Symbol('sten1') >>> sten2 = Symbol('sten2') >>> sten3 = Symbol('sten3') >>> sten1 = 64 + sten2 >>> sten3 = 4 * sten1 >>> solveset(Eq(sten1 + sten2 + sten3, 512), sten2) {32}

21.7.3. Ekvationslösning Använd funktionen solveset() tillsammans med klassen Eq() och lös följande ekvationer.

a) x + 19 = – 29 b) x – 5 = 10 c) –6 + x = – 10

d) –x – 10 = – 45 e) 3x = 15 f) 2x + 5 = 25

g) 2x – 5 = 25 h) x/5 = 25 i) x/(– 4) + 5 = 6

j) –x/(– 2) = 15 k) x/3 + 4 = 16 l) 3x2 – 4 = 6x +34

m) 3x2 – 4 = 6x – 34 n) 01701271 xx

o) xx

32

1

21.8. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 260: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

GEOMETRI

RÄKNA MED PYTHON 258

22. Geometri

Pythagoras från Samos (levde år 582 – 486 f. Kr.) lade grunden till dagens geometri. Han gjorde ma-tematiska upptäckter som är viktiga än idag. Den mest kända är förståss Pythagoras sats, som ger förhållandet mellan kateterna och hypotenusan i en rätvinklig triangel som a2 + b2 = c2. Han gjorde andra upptäckter också, inom musikens matema-tik, astronomin och medicinen. Han lärde ut att Jorden är rund och har fem klimatzoner. Han ska också ha upptäckt de fem grundläggande platons-ka kropparna, alltså tetraedern, kuben, oktaedern, dodekaedern och ikosaedern. Hans påverkan på eftervärlden är obestridlig.

22.1. Enheter och prefix

I verkliga världen är det sällan att något, som en längd, fart eller en vikt är ”ett” utan den är oftast ett tusental, ett miljontal eller miljarder av något. När man skriver en enhet på vardagligt sätt, brukar man använda prefix istället för tiopotens.

Fransmännen, som vill ha ordning på allt, har skapat SI-systemet som är en systematisk uppställning av alla prefix som kilo, mega och giga och enheter som meter, volt och joule och deras indelning i exempelvis deci, centi och milli. SI-systemet anger också exakt hur de olika prefixen och enheterna ska skrivas och om alla bara höll sig strikt till SI-systemet skulle världen bli väldigt mycket mindre komplicerad.

22.1.1. Längdmått En väg är oftast några kilometer (km) lång. Kilo betyder tusen, så vägen är flera tusentals meter lång. Vägen från Jorden till Solen är 150 miljoner kilometer. Ett papper är bara en tiondels millimeter tjockt (0,1 mm).

22.1.2. Prova på a) Uttryck vägen från Jorden till Solen i megameter och gigameter.

b) Akrobater gillar att stå på varandras axlar. Hur många akrobater måste stå på var-andra om de ska räcka från Jorden till Solen och varje akrobat är 1,72 meter hög. Uttryck det totala antalet akrobater med ett prefix.

22.1.3. Lösningsförslag a) 150 000 megameter (Mm), eller 0,15 gigameter (Gm)

b)

>>> (150000000000/1.72)/1000000000 87.20930232558139

Alltså 87 gigaakrobater. Den resterande 200 megaakrobaterna kommer att få ersättas med en värmesköld om inte akrobaterna ska få håret avbränt.

Page 261: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

GEOMETRI

RÄKNA MED PYTHON 259

22.1.4. Areor En säng är oftast cirka 2 kvadratmeter (m2) stor, medan en åker kan vara 10 000 m2. Sve-rige är 447 435 km² medan en tangent på ett tangentbord är en kvadratcentimeter (cm2). En ar är 100 m2, men är inte en SI-enhet och ska undvikas. Detsamma gäller hektar. Icke-standardiserade enheter förvirrar bara.

22.1.5. Volymer Ett köksskåp har normalt en volym på en kubikmeter (m3) medan ett typiskt oljetankfar-tyg rymmer 100 000 m3 eller 0,1 Mm3 Ett knappnålshuvud har en volym på en kubikmil-limeter (mm3).

22.1.6. Prova på

a) Du får tillgång till en oljetanker som rymmer 100 000 m3 och beslutar dig för att fylla den med gummiankor. En gummianka är 12 cm lång, 6 cm bred och 8 cm hög. Hur många ankor får plats?

b) Tankern går på grund i en storm och bryts av på mitten. Du orsakar tidernas största gummiank-läckage. Hur stor area på havet täcker ankorna om de ligger i ett lager, tätt packade intill varandra?

c) Det går inte att städa upp, så ankorna flyter omkring på världshaven. Hur många varv runt Jorden räcker ank-mängden om de ligger på längden? Jorden är 40 000 kilometer runt vid ekvatorn.

22.1.7. Lösningsförslag a)

>>> gummianka_volym = 0.12 * 0.08 * 0.06 >>> antal = 100000/gummianka_volym >>> antal 173611111.11111113

Page 262: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

GEOMETRI

RÄKNA MED PYTHON 260

b)

>>> gummianka_area = 0.12 * 0.08 >>> antal * gummianka_area 1666666.6666666667

alltså cirka 1,7 kvadratkilometer.

c)

>>> längd = antal * 0.12 >>> varv = (längd/1000) / 40000 >>> varv 0.5208333333333334

Något mer än ett halvt varv runt Jorden. Du kommer att bi ihågkommen i historieböck-erna som ankmarodören. Lycka till med uppstädningen.

22.1.8. Datakapacitet Ett typiskt wifi-nät kan överföra 50 miljoner bitar per sekund (Mbps) till din dator. Uni-versitetsnätet Sunet har en kapacitet på 100 gigabit per sekund (Gbps). Ingen hårddisk eller dataförbindelse har någonsin en kapacitet räknad i mbps. Millibitar, tusendels bitar finns inte men förekommer allt för ofta i populärpressen. Skilj också på bit (b) och byte (B). Bitar används som enhet vid överföring på datornät, medan byte används som enhet vid överföring från hårddiskar.

22.1.9. Prova på a) Du har en internetanslutning som är 100 Mbps och är intresserad av att hämta hem data om världsrymden. Hur mycket data kan du hämta hem på 24 timmar? Det går åtta bitar på en byte. Uttryck svaret i gigabyte.

22.1.10. Lösningsförslag a)

>>> (100*10**6/8 * 60 * 60 * 24)/ 2**30 1005.8283805847168

22.2. Figurer i två dimensioner

Det finns tre figurer med två dimensioner som är riktigt viktiga att kunna beräkna de vanligaste egenskaperna för: trianglar, rektanglar och cirklar (medan kvadrater är ett specialfall av rektanglar). Formlerna för dessa är:

Figur Omkrets Area Vinkelsumma Triangel sida + sida + sida (basen * höjden) / 2 180°

Rektangel 2*(basen + höjden) basen * höjden 360° Cirkel π * diametern π * radien2

Utöver detta gäller Pythagoras sats för rätvinkliga trianglar: a2 = b2 + c2.

Page 263: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

GEOMETRI

RÄKNA MED PYTHON 261

Ovanstående figurs area kan beräknas på följande sätt: basen gånger höjden minus en liten kvadrat som tagits bort.

6 * 2 – 12

eller basen gånger höjden plus en liten kvadrat som lagts till.

5 * 2 + 12

22.2.1. Prova på Beräkna area och omkrets för följande figurer:

a) Triangel: katet1: 6 cm, katet2: 8 cm, hypotenusa: 10 cm

b) Rektangel: bas: 8 dm, höjd 7 dm

c) Cirkel: radie 4 m

22.2.2. Lösningsförslag a)

>>> 6*8/2 24.0 >>> 6+8+10 24

b)

>>>8*7 56 >>>2*8+2*7 30

c)

>>> from math import pi >>> pi * 4**2 50.26548245743669 >>> pi * (4+4) 25.132741228718345

Page 264: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

GEOMETRI

RÄKNA MED PYTHON 262

22.2.3. Trianglar Gör ett program i tre steg som gör olika beräkningar på en rätvinklig triangel.

a) Skriv en funktion som beräknar omkretsen av en rätvinklig triangel, vars mått anges i variablerna b (katet bredd), h (katet höjd) och d (hypotenusa) i den anropande huvudrutinen (som inte finns ännu, men den kommer i uppgift b).

b) Skriv en huvudrutin som gör ett anrop till funktionen ovan som beräknar triangelns omkrets, och skriver ut denna.

c) Gör en annan funktion som beräknar triangelns area och skriver ut den. Värdet för arean ska matas ut som ett heltal som är mindre än eller lika med den sanna arean.

Python har färdiga matematikfunktioner. Använd någon lämplig funktion för att göra avrundningen.

22.2.4. Tvådimensionella figurer a) Skriv ett program som visar en meny, där användaren kan välja någon av de tre vanliga tvådimensionella figurerna, rektangeln, triangeln och cirkeln. Programmet ska be om dess mått och sedan räkna ut omkrets och area.

b) Skriv ett program som räknar ut tredje vinkeln i en triangel utifrån två givna vinklar. Se till att vinkelsumman inte överskrider 180°.

22.3. Pythagoras sats

Att använda Pythagoras sats för att räkna ut hypotenusan eller ena kateten i en triangel är lite mera utmanande än att beräkna vinkelsumman. Formeln a2 = b2 + c2 måste om-vandlas för att passa det som efterfrågas. Är hypotenusan okänd, blir lösningen:

22 cba

Är det en av kateterna som är okänd blir formeln istället:

22 cab

22.3.1. Prova på a) Beräkna hypotenusan i en triangel med kateterna 3 och 4.

b) Beräkna den okända kateten i en triangel med hypotenusan 15 och andra kateten 9.

22.3.2. Lösningsförslag a)

>>> (3**2 + 4**2)**(1/2) 5.0

b)

>>> (15**2 – 9**2)**(1/2) 12.0

Page 265: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

GEOMETRI

RÄKNA MED PYTHON 263

22.3.3. Pythagoras sats a) Skriv ett program som ber om längden på två valfria sidor i en rätvinklig triangel. Programmet ska fråga om det är en hypotenusa eller en katet som är okänd. Beräkna den okända sidan med Pythagoras sats.

b) Om de angivna värdena inte stämmer med Pythagoras sats, dvs om användaren till exempel angivit att denne matar in en katet, men istället råkar mata in en hypotenusa, ska programmet säga ifrån och be om nya, korrekta värden för en rätvinklig triangel.

22.4. Objekt i tre dimensioner

När det gäller figurer i tre dimensioner finns det flera kroppar att hålla reda på.

Kropp Volym Begränsningsarean Prisma triangelns area * höjden Rätblock basens area * höjden Sfär 4 * π * radien3 / 3 4 * π * radien2 Cylinder π · radien2 * höjden 2 * π · radien2 + π * d * h Kon π · radien2 * höjden / 3 π * radie * sida + π * r2 Pyramid basens area * höjden / 3 Det här är utmärkta uppgifter för en dator att lösa eftersom det är formler som gäller i alla lägen.

22.4.1. Prova på

Beräkna

a) Volymen och

b) Begränsningsarean för en cylinder med följande mått: diameter 6 cm, höjd 5 cm.

Beräkna volymen och begränsningsytorna för följande objekt, där alla mått är i centime-ter, nämligen:

c) Sfärens volym d) Sfärens area e) Rätblockets volym

f) Rätblockets area g) Konens volym h) Konens area

Page 266: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

GEOMETRI

RÄKNA MED PYTHON 264

22.4.2. Lösningsförslag a) Volymen

>>> from math import pi >>> pi * (6 / 2) ** 2 * 5 141.3716694115407

b) Begränsningsarean

>>> 2 * pi * (6 / 2)**2 + pi * 6 * 5 150.79644737231007

c) Sfärens volym:

>>> 4*pi*(3**3)/3 113.09733552923255

d) Sfärens area:

>>> 4*pi*(3**2) 113.09733552923255

e) Rätblockets volym:

>>> 3*3*4 36

f) Rätblockets area:

>>> 2*(3*3)+4*(3*4) 66

g) Konens volym:

>>> pi*(3**2)*4/3 37.69911184307752

h) Konens area:

>>> pi*(3*5+3**2) 75.39822368615503

22.4.3. Volym och area Skriv ett program som klarar att beräkna volym och area enligt alla formler på sidan 263. För att klara detta krävs att programmet frågar vilken figur eller kropp som ska utredas och sedan ställer frågor om volym eller radie beroende på vad som är okänt.

Page 267: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

GEOMETRI

RÄKNA MED PYTHON 265

22.5. Skala

Det grundläggande för en skala är storleksförhållandet mellan en bild och den verklighet bilden visar. Skalan åskådliggörs som ett enkelt förhållande:

Bild : Verklighet

Bildens mått och verklighetens mått ställs mot varandra och räknas i samma enhet (me-ter, centimeter etc).

22.5.1. Exempel

Tänk dig en flygplansmodell i skala 1:500. Det betyder att verklighetens flygplan är 500 gånger så stort som model-len. Om modellen är 12 cm lång räknas de verkliga måt-ten ut så här:

1:500 12 *1 : 12 * 500 12:6000

Det riktiga flygplanet är alltså 6000 cm långt eller 60 meter i verkligheten.

Någon av de två siffrorna i en skala ska alltid vara 1. Om 1 kommer före kolonet (som 1:10), handlar det om en förminskning. Om 1 kommer efter kolonet (som 10:1) så är det en förstoring. När man har andra siffror än ett, säg en bild på en sak som är 45 cm på bil-den och 900 cm verkligheten, vad gör man då? Man ställer upp det som ovan: 45:900

Det ena talet ska vara 1 och det andra ska helst vara heltal. Då utnyttjar man det faktum att ett tal delat med sig självt är 1, och delar med 45 på båda sidor kolonet:

45/45 : 900/45 = 1:20. Svaret är att skalan är 1:20.

22.5.2. Prova på a) Avståndet på en karta uppmäts till 3,5 cm. Skalan är angiven som 1:500 000. Hur stort är avståndet i verkligheten? Svara med lämpligt prefix.

b) En teknisk ritning på en specialskruv har en förstoring på 3:1. Hur lång är skruven på ritningen om den i verkligheten är 30 millimeter lång?

22.5.3. Lösningsförslag a)

>>> 3.5*500000/100000 17.5 (km)

b)

>>> 3*30 90 (mm)

Page 268: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

GEOMETRI

RÄKNA MED PYTHON 266

22.5.4. Skala a) Stockholmsmodellen som är utställd på Kul-turhuset vid Sergels Torg är en exakt modell av Stockholm i skala 1:1000 utskriven med 3D-skrivare. Titta på bilden. Du ser lagren som blir resultatet vid friformsframställning. Beräkna hur hög Klara kyrka är på ett ungefär, då du vet att en klister-tub är 2,5 centimeter i diameter?

b) ABBs tyristorlok Rc-loket står i bilden till vänster på vanligt svenskt normalspår med spårvidden 1435 mm. Du ska ta upp konkurrensen med Märklin och börja tillverka plastmodeller av denna stolta svenska industriprodukt.

Mät på bilden med linjal. Hur bred och hög ska modellen vara om du vet att skala H0 (H-noll) är skala 1:87?

22.6. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 269: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 267

23. Sannolikhet och statistik

Sannolikhet och statistik handlar lika mycket om att samla in data som att visa upp det på ett sätt som får läsarna att förstå vad saken handlar om.

Vad är det för mening med att skriva ett program som presenterar utdata som ingen för-står eller kan ta till sig för att det är för komplext eller innehåller för stora datamängder?

Statistisk databehandling handlar om att tillgängliggöra genom att begränsa, filtrera och kategorisera data så att det väsentliga blir uppenbart.

Introduktionen till hur diagram hanteras i Python finns i avsnittet om matplotlib på sidan 139.

23.1. Hur allting började

Cirkeldiagrammet har en fantastisk förhistoria. Du känner säkert till Florence Nightingale, damen med lampan osv, en brittisk sjuksköterska som verkade under Krimkriget. Kriget utkämpades från 1853 till 1856 mellan Kejsardömet Ryssland på ena sidan och en allians av Storbritannien, Frankrike, det Sardinska kungadömet och Osmanska riket på den andra. När Nightingale kom till Istanbul förstod hon det fasans-fulla i den usla hygien som rådde vid denna tid, som gjorde att tiofalt flera soldater dog av sjukdomar än av krigsskador.

Hygien var tämligen okänt inom sjukvården vid denna tid och Nightingale ville visa för regeringen i London hur illa det stod till. Hon insåg att det var effektivare att uttrycka statistiska data i form av diagram än som tabeller. Diagram kunde användas till att övertyga politiker och kungahus, folk som normalt inte var in-

satta i, eller inte skulle ha tålamod att förstå sig på statistiska tabeller. Hon uppfann inte det polära diagrammet (eller pajdiagrammet som vi slarvigt säger) men hon använde det mycket effektivt. Själv kallade hon det för en “coxcomb” (tuppkam).

Page 270: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 268

Bilden visar Florence Nightingales tidiga polära cirkeldiagram. Antalet dödsfall av smitt-samma sjukdomar representeras av de blå tårtbitarna. Diagrammet fick avsedd effekt. När britterna skickat en saneringsgrupp till Istanbul som tömde avloppet och förbättrade ventilationen minskade dödstalen av smittsamma sjukdomar kraftigt, från 42 % till 2,2 %.

Hela den spännande historien om hennes tidiga affärsgrafik och vad som hände därefter, finns under rubriken Florence Nightingale på http://huvudrutin.se/index.php/lankar

Datorer är utmärkta redskap för att hantera stora mängder data snabbt. Med ett relativt litet program kan man få fram viktig information om ett statistiskt material. Dr Hans Rosling gjorde sig en karriär av att visa korrekt data från hela världen på webbplatsen: http://www.gapminder.org. Där kan man få reda på nästan vad som helst om världen i grafisk form. Vikten av att förstå världen som den verkligen är, kan inte nog understry-kas!

23.2. Läges- och spridningsmått

Statistik handlar om att beskriva hur en viss mängd data är fördelat över olika värden. Man brukar tala om medelvärdet som är summan av alla värden delat med deras antal, median som är det mittersta värdet, typvärdet som är det vanligaste värdet och varia-tionsbredden som är högsta värdet minus lägsta värdet.

Ett låddiagram är uppbyggt kring fem viktiga värden: Största värde, övre kvartil, median, nedre kvartil och minsta värde. Pythons funktoner skapar låddiagram där även kvarti-lavståndet är med. Kvartilavståndet är ett sätt att dela in all data i fjärdedelar för att visa hur data är fördelat i relation till median och variationsbredd. Extremvärdena kallas för utliggare.

Page 271: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 269

23.2.1. Prova på Barnen i en skolklass har olika längder, nämligen 145, 137, 150, 192, 152, 140, 145, 143, 156, 167, 149 centimeter.

Beräkna minsta längd, största längd, medellängd, median, standradavvikelse och varians och visa dessa parametrar i ett diagram av typen boxplot.

23.2.2. Lösningsförslag Barnens längder lagras i en lista kallad Data[], varefter du använder olika fördefinierade python-funktioner för att ta fram de statistiska värdena.

# barnstatistik.py import matplotlib.pyplot as plt from statistics import median, mean, stdev, variance data = [145, 137, 150, 192, 152, 140, 145, 143, 156, 167, 149] print('Minsta längd:', min(data)) print('Största längd:', max(data)) print('Medellängd:', mean(data)) print('Medianlängd:', median(data)) print('Standardavvikelse:', stdev(data)) print('Varians:', variance(data)) plt.boxplot(data) plt.xlabel('Den här klassen') plt.ylabel('Längd, centimeter') plt.title('Elevernas längder') plt.show()

Vid körning:

Page 272: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 270

Minsta längd: 137 Största längd: 192 Medellängd: 152.36363636363637 Medianlängd: 149 Standardavvikelse: 15.493693731791184 Varians: 240.05454545454546

23.2.3. Medelvärde Skapa en lista med 40 tal och beräkna medelvärdet av dem genom att summera alla talen och dividera med antalet. Använd lämplig slumptalsgenerator för att skapa talen.

Programmet ska skriva ut medelvärdet med lämplig ledtext.

23.2.4. Median Hitta medianvärdet av 40 tal i en lista med hjälp av

a) en slinga

b) rekursion

Kontrollera dina svar med hjälp av Pythons standardmetoder från modulen statistics.

23.3. Normalfördelning eller gaussisk fördelning

Saker och ting i naturen, som fjärilar, bilar eller fjälltoppar har för det mesta inte helt slumpmässiga värden, utan värdena centreras kring något medelvärde. Kålfjärilar är för det mesta 3 centimeter långa, men kan vara mellan 2,5 och 3,5 centimeter. Personbilar brukar vara omkring 5 meter långa men det finns de som är 6 meter och de som är 4 me-ter.

Visar man detta naturliga förhållande i ett digram, kommer det att bli en topp i diagram-met kring det ”huvudsakliga” värdet, med extremvärdena spridda på upp- och nedsidorna. Diagrammet brukar få en rundad topp, en så kallad gausskurva.

Gausskurvan är det normala i en statistisk fördelning och brukar också kallas för normal-fördelning. De flesta statistiska undersökningar av fenomen i verkliga världen kommer att likna gausskurvor.

Page 273: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 271

23.4. Slumptal

Mycket i vår värld styrs av slumptal, som lotterier, bankkoder, hasardspel, datorsimule-ring, kryptografi och liknande områden där ett oförutsägbart resultat är önskvärt.

Slumpfunktionerna som hör till Python kan styras till att mata ut olika typer av slumptal med olika fördelning. Det är ganska vanligt i statistisken att man använder sig av exem-pelvis kvadratisk (rak) eller gaussisk fördelning. För detta finns funktonerna uniform() respektive gauss(). Det finns många flera typer av fördelnignar för den intresserade.

23.4.1. Prova på Skriv ett program som genererar slumptal med hjälp av modulen random och visar deras frekvens i ett diagram. Animera diagrammet genom att bygga upp allt flera slumptal mel-lan 1–100 och göra en ny plott för varje nytt tal.

Skapa en lista med poster från 1–100 som ska visas längs x-axeln. Den ska fyllas med nol-lor och allt eftersom slumptalen genereras, ökas motsvarande post i listan med ett. Inne-hållet i varje post i listan visas längs y-axeln varje gång bilden uppdateras. Det är det som är frekvensfunktionen.

För varje slumptal som fylls på i listan ska programmet vänta 5 millisekunder så att ani-meringen ska bli möjlig för en människa att följa.

a) Programmet ska använda kvadratisk fördelning (normalfördelning) och fortsätta gene-rera slumptal tills programmet avbryts.

b) Ändra programmet till att använda sig av gaussisk fördelning och notera skillnaderna i grafens utseende.

23.4.2. Lösningsförslag a) och b)

# slumpgraf.py import random import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation fig, ax = plt.subplots() plt.xlim(0,100) plt.ylim(0,100) # Ett snabbt sätt att skapa en lista med 100 nollor ydata = [0]*100 xdata = list(range(0,100)) # Skapa ett punktdiagram. animated=True berättar för # matplotlib att denna graf är animerad ln, = plt.plot(xdata, ydata, 'ro', animated=True) # Funktionen som anropas varje gång en ny punkt ska visas def skapa_punkt(frame): # Normalfördelning slumptal = int(random.uniform(0,99)) # Gaussfördelning #slumptal = int(random.gauss(50, 10))%100

Page 274: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 272

# Förekomsten av ett slumptal ger ökar y-värdet i # denna position ydata[slumptal] = ydata[slumptal] + 1 ln.set_data(xdata, ydata) return ln, # Skapa animationen # Första argumentet fig anger hela diagrammet # skapa_punkt är funktionen som används för att generera # en ny bild # blit är en metod för att optimera bilduppdateringen # interval är tiden mellan bilderna i millisekunder animation = FuncAnimation(fig, skapa_punkt, blit=True, interval=5) plt.show()

Programmet använder sig av två viktiga externa moduler: random, som med funktionen .uniform() ger slumptal med normalfördelning, medan funktionen .gauss() ger gauss-fördelade slumptal. För enkelhets skull är satsen med gaussfördelningen utkommenterad i koden ovan och visad med grå bakgrund. När du ska köra uppgift b) kommenterar du in det grå och kommenterar ut satsen med normalfördelningen.

Satsen ydata = [0]*100 används som ett led i att poängtera vikten av att skriva program enkelt och överskådligt. De finns flera sätt att fylla en lista med etthundra nollor, men detta sätt är det enklaste.

ln, = är intressant. plt.plot lämnar en lista med linjer som retursvar, men i detta program fångas bara den första och enda linjen upp: det är den som plottas.

Argumentet interval=5 ger en väntetid på 5 ms mellan varje omritning av skärmen.

23.4.3. Läs mer Läs emr om random- och secrets-funktionerna och om Mersenne-Twister på sidan 316.

23.5. Sannolikhet

Köper du en lott eller kastar tärning vill du kanske veta chansen att vinna något? På lot-ter står det hur många vinstlotter som finns för olika nivåer. Det kan vara tre lotter som ger högsta vinsten och kanske några hundra tusen som ger en ny lott. Om det är 3 000 000 lotter totalt så har du en chans på 1 000 000 att kamma hem högsta vinsten. Är det en tärning du kastar, har du lika stor chans att få en etta som en sexa, men om det är två tärningar är oddsen helt annorlunda.

Tabell som visar summan av två tärningar. Summan 7 är det vanligaste utfallet, med sannolikheten 6 av 36 eller 1/6. Lägsta möjliga utfall är 1+1=2, som har en sannolikhet på 1/36, högsta möjliga är 6+6=12, också den med sannolikheten 1/36.

Spelet Yatzy spelas med fem tärningar och blir därmed väldigt oförutsägbart. Att få fem ettor i Yat-zy har en sannolikhet på 1/55 eller 1/3125!

Page 275: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 273

23.5.1. Prova på

a) Beräkna sannolikheten för poängsumman 4 vid kast med två sexsidiga tärningar där ordningen är av betydelse.

b) Skriv ett program som slumpar fram två tärningskast med normalfördelning, ett antal gånger och visar hur många kast som behövs för att bevisa slutsatsen i a).

23.5.2. Lösningsförslag a) Det finns tre möjliga utfall: 2 och 2 eller 1 och 3 eller 3 och 1 av 36 möjliga. Sannolikhe-ten är 3/36 eller 1/12 eller 0,08333...

b)

# slå_tärning.py from random import randint lyckade_kast = 0 totalt_antal_kast = 0 sökt_utfall = 3/36 while totalt_antal_kast < 10000: # randint ger ett slumpmässigt heltal mellan 1 och 6 tärning_ett = randint(1,6) tärning_två = randint(1,6) totalt_antal_kast += 1 if tärning_ett + tärning_två == 4: lyckade_kast += 1 utfall = lyckade_kast/totalt_antal_kast if utfall == sökt_utfall: print('Det krävs ', totalt_antal_kast, ' kast för att visa sannolikheten') break else: print("Kan inte visa sannolikheten på under", totalt_antal_kast, "kast")

Page 276: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 274

Det sökta utfallet från uppgift a) specificeras för programmet som 3/36 i variabeln sökt_utfall.

Programmet är generöst skrivet för att prova 10 000 gånger i en while-slinga, men i de allra flesta fall behöver man inte kasta tärningarna så många gånger för att nå sannolik-heten. Det inträffar trots allt, och då löses felutskriften i sista saten ut.

Vid körning.

>>> %Run 'slå_tärning.py' Det krävs 1140 kast för att visa sannolikheten >>> %Run 'slå_tärning.py' Kan inte visa sannolikheten på under 10000 kast

23.5.3. Kast med mynt a) Beräkna sannolikheten för att få tre stycken krona vid tre kast med ett mynt.

b) Skriv ett program som slumpar fram tre kast med normalfördelning, med mynt ett an-tal gånger och visar hur många kast som behövs för att bevisa slutsatsen i a). Sannolikhe-ten kommer inte att bli exakt, utan kommer att gå mot det teoretiska värdet i a).

23.6. Frekvenstabeller

Textanalys är ett viktigt verktyg vid exempelvis arbete med kryptografi och datakompri-mering. Ett krypto är vid första anblicken en helt obegriplig samling bokstäver, men när man analyserar antalet tecken och hur de står tillsammans, kan man finna intressanta mönster. Av dessa mönster kan man dra slutsatser om vilket språk kryptot är författat på och av frekvensen av olika tecken och teckensekvenser kan man dra slutsatser om medde-landets innehåll.

Under andra världskriget kunde engelsmännen ofta knäcka de tyska krypterade tele-grammen genom att tyskarna hade Ordnung! och alltid började sina telegram med samma teckensekvens. Olika ord som panzer, waffen osv återkom också ofta. Det blev kryptots nemesis.

I Python finns en färdig modul Collections med klassen counter. Counter är en snabb räknare som har metoden most_common som kan användas för att analysera en lista med data, text eller siffror.

23.6.1. Prova på a) Använd counter för att analysera följande text.

Träutensilierna i ett tryckeri äro ingalunda en faktor där trevnadens ordning-ens och ekonomiens upprätthållande, och dock är det icke sällan som sorgliga erfarenheter göras ordningens och ekonomiens därmed upprätthållande. Trä-utensilierna i ett tryckeri äro ingalunda en oviktig faktor, för trevnadens ord-ningens och och dock är det icke sällan.

b) Mycket av datorns uppgifter är att flytta data från ett format till ett annat. I detta fall ger most_common en lista med tupler, där det första elementet är det vanligaste tecknet som påträffats, medan det andra elementet är antalet tecken som påträffats. Så fortsätter most_common tills det inte finns flera tecken. Pyplot.bar kan inte använda sig av den formen utan måste få en lista med x- och en med y-värden. Omvandla listan med tupler till två listor, som passar pyplot. Använd funktionen zip().

c) Rita en frekvenstabell som visar förekomsten av olika bokstäver i texten ovan.

Page 277: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 275

23.6.2. Lösningsförslag a)

# träutensilier.py # Använd Counter från modulen collections from collections import Counter # Analysera en lång text Text_från_Arne_Heine = ('Träutensilierna … icke sällan.') # Räkna antal förekomster av bokstäver i exempeltexten räknare_till_text = Counter(Text_från_Arne_Heine) frekvenstabell = räknare_till_text.most_common() print(frekvenstabell)

Vid körning visas

[(' ', 49), ('e', 32), ('n', 32), ('r', 29), ('o', 21), ('t', 20), ('i', 20), ('a', 17), ('d', 16), ('s', 14), ('l', 13), ('ä', 12), ('c', 12), ('k', 11), ('g', 9), ('h', 9), ('u', 6), ('f', 4), ('m', 4), ('p', 4), ('v', 3), ('T', 2), ('y', 2), ('å', 2), (',', 2), ('ö', 2), ('.', 2)]

b) Detta är de viktiga raderna som tillfogats programmet ovan

print(frekvenstabell) print() print(list(zip(*frekvenstabell)))

Vid körning visas

[(' ', 'e', 'n', 'r', 'o', 't', 'i', 'a', 'd', 's', 'l', 'ä', 'c', 'k', 'g', 'h', 'u', 'f', 'm', 'p', 'v', 'T', 'y', 'å', ',', 'ö', '.'), (49, 32, 32, 29, 21, 20, 20, 17, 16, 14, 13, 12, 12, 11, 9, 9, 6, 4, 4, 4, 3, 2, 2, 2, 2, 2, 2)]

c)

# utensiliediagram.py # Använd Counter från collections-modulen from collections import Counter # Analysera en lång text Text_från_Arne_Heine = ('Träutensilierna … icke sällan.') # Räkna antal förekomster av bokstäver i exempeltexten räknare_till_text = Counter(Text_från_Arne_Heine) frekvenstabell = räknare_till_text.most_common() # Skapa en lista av frekvenstabellen så att den passar # anropet till pyplot.bar frekvenstabell_lista = list(zip(*frekvenstabell)) # importera matplotlib from matplotlib import pyplot

Page 278: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SANNOLIKHET OCH STATISTIK

RÄKNA MED PYTHON 276

# Visa ett stapeldiagram pyplot.bar(frekvenstabell_lista[0], frekvenstabell_lista[1]) pyplot.show()

Vid körning visas följande diagram

23.6.3. Övning på frekvenstabeller Grunderna i datakomprimering är att komprimeringsalgoritmen läser igenom exepelvis en text och hittar upprepade förekomster av samma ord, sträng, tal eller bitmönster och ersätter det med något kortare. Så fungerar metoderna ZIP, JPEG, RAR osv. Dessutom sparar algoritmen en tabell med sina utbyten, för att veta hur data ska kunna återställas när det packas upp.

a) Skapa en tuple med den text du vill analysera. Texten måste vara minst 1000 ord lång. Hämta lämpligen en insändare från någon dagstidning på Internet. Rensa den infångade texten från specialtecken som radslut osv, så att bara text och blanksteg återstår.

b) Gör en frekvensanalys på tuplen med avseende på alla ord, alltså textsträngar som av-gränsas av två blanksteg och presentera denna som ett stapeldiagram.

c) Analysera hur många olika ord det var och bestäm därefter vilka symboler som ska re-presentera orden i den komprimerade texten. Anledningen till detta är att skapa så korta symboler som möjligt. Finns det bara exempelvis 100 olika ord, behöver du bara ha symbo-ler från 00 – 99. Presentera tabellen.

d) Använd tabellen och översätt texten till en sträng med symboler. Visa symbolsträngen. Hur mycket kortare blev symbolsträngen än originaltexten? Presentera en procentsats.

e) Konvertera tillbaka symbolsträngen till en läsbar text. Jämför med originaltexten.

f) Prova om programmet fungerar om du byter ut texten mot en annan text. Prova om det fungerar olika bra med olika texter, som siffertabeller, programkod, tjatiga sångtexter osv.

23.6.4. Analys av verkligt data Flera uppgifter och mera data att analysera i form av datafiler i CSV-format finns hos hu-vudrutin.se. Dessutom finns mycket mera data hos Statistiska Centralbyrån att arbeta vidare med.

Page 279: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SAMBAND OCH FÖRÄNDRING

RÄKNA MED PYTHON 277

24. Samband och förändring

Procenträkning är det samband som styr det mesta av vardagslivet, som ekonomi, priser och bankräntor. Butiker tycker om att göra procentuella påslag på priset eller göra pro-centuella avdrag när det är rea. Bankerna ger dig en liten summa för att du sätter in dina pengar hos, i form av några tiondels procent på kapitalet.

24.1. Procent

I sin enklaste form svarar procentberäkningar på frågor som: ”Om 7 av 10 hundar är säll-skapshundar, hur många sällskapshundar finns det på 100 hundar?” Det är alltså hela tiden en jämförelse mot vad som hade varit om det var 100. Relationen 7 av 10 är relativt enkel att omsätta till 100, det är bara att multiplicera båda talen med 10! Men för att det ska fungera i alla lägen, för till exempel 25 av 2000 så behöver man en formel. Man brukar prata om hela och delar. Så här kan man tänka:

100

%Antal

Hela

Delen

Man kan använda siffrorna i den inledande texten. Då blir det så här:

100

%

2000

25 Antal

Detta ger:

%100*2000

25Antal

Resultat:

1,25 = Antal %

25 av 2000 blir alltså 1,25 %

24.1.1. Prova på Använd formeln ovan för att besvara frågorna med hjälp av Python.

a) Hur många procent är 350 av 400?

b) Sveriges befolkning var 10 151 588 i april 2018 och är cirka 1,98 % av hela EU:s be-folkning. Hur många bor det i hela EU?

c) Om det föds ungefär lika många personer varje dag, hur många av världens befolkning är födda i februari? Vart fjärde år är februari längre, men du kan strunta i det.

24.1.2. Lösningsförslag a)

>>> 100 * (350/400) 87.5

b)

>>> (100/1.98) * 10000000 505050505.05050504

Page 280: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SAMBAND OCH FÖRÄNDRING

RÄKNA MED PYTHON 278

c)

>>> (28 / 365) * 7630000000 585315068.4931507

24.1.3. Procentuella pålägg och avdrag Skriv ett program som beräknar momspåslag och momsavdrag på olika varor och tjänster. Programmet ska hantera följande situationer.

a) Företag betalar moms, men får tillbaka momsen efter deklarationen. Du går till Clas Ohlson och köper en målarpensel för 27,50 och momsen på sådana varor är 25 %. Hur mycket ska ditt företag betala i slutänden?

b) På väg från Clas Ohlson passerar du smörgåsbaren och det kurrar i magen. Du köper en foccachia speciale för 68 kronor. Hur mycket av det är moms, om matmomsen är 12 %?

c) Penseln tynger i fickan och du köper en bussbiljett för att komma tillbaka till kontoret. En kontantbiljett kostar 31 kronor. Hur mycket kostar den utan moms, om momsen på resor är 6 %?

d) Du har målat kontoret och ska skicka fakturan. Målningen tog tio timmar och du tar 540 kronor per timme plus 25 % moms. Hur stort är fakturabeloppet?

e) Som företagare har du rätt att handla hos Matgrossisten AB. De säljer huvudsakligen mat och tar matmoms 12 %. De säljer annat också och frågar om du kanske vill betala matmoms för det också? Det vill du naturligtvis och köper en stege för 295 kronor, som räknas som mat på kvittot. Hur mycket har du lurat staten på, om den generella momsen är 25 %?

f) Du ska hjälpa det lokala snabbköpet med ett program som kundernas kvitton och speci-ficerar de olika momssatserna. Programmet tar emot tre parametrar från användaren: varans namn, pris och momssats. Varorna kan matas in i vilken ordning som helst, men de ska skrivas ut sorterade på momssats.

f2) Amerikanska rymdraketer är 78 meter höga, medan ryska bara är 65 meter. De har samma diameter. 95% av raketerna är bränsle. Raketen når så högt som mängden bränsle medger. Hur mycket högre flyger amerikanska raketer i procent?

24.2. Förändringsfaktor

En av de vanligaste frågorna man kan använda procenträkning till är att svara på föränd-ringar över tid. För att göra detta används något som kallas förändringsfaktor. Den anger om det blir fler eller färre av något med tiden. Om förändringsfaktorn är större än ett blir det fler med tiden och om den är mindre än ett, blir det färre. Kom ihåg att 1 är 100 % i decimalform och att ändringen adderas till eller subtraheras från 100 %.

Bankernas inlåningsränta är ett bra exempel. Om man sätter in pengar på ett bankkonto med en ränta på 1,1 %, hur mycket finns det då på kontot efter ett år och efter fem år?

24.2.1. Prova på a) Man sätter in 5000 kr på ett bankkonto med 1,1 % ränta. Hur mycket finns det på kon-tot efter ett, respektive fem år?

b) Under en realisation sänks priset på en jacka som kostar 849 kronor med 15 %. Hur mycket kostar jackan under rean? Tips: 100 % – 15 % = 85 % eller 1–0,15 = 0,85.

Page 281: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SAMBAND OCH FÖRÄNDRING

RÄKNA MED PYTHON 279

24.2.2. Lösningsförslag a)

>>> 5000 * 1.011**1 5054.999999999999

>>> 5000 * 1.011**5 5281.116916830252

b)

>>> 849 * 0.85 721.65

24.2.3. Förändringsfaktor a) Skriv ett program som beräknar saldot på ett konto efter valfri insättning, valfri ränta och valfritt antal år. Typiska räntesatser för olika banker ligger mellan 0 och 1,5 %.

b) Skriv ett program som beräknar dubbleringstiden för samma uppgifter som ovan.

c) Utveckla båda dessa program genom att skapa en lista för att bygga en jämförande ta-bell mellan olika banker. Försök hitta räntesatser på Internet.

d) Plotta ett diagram som visar den linje som beskriver förhållandet i funktionen från dubbleringstiden för ett kapital på ett konto med en ränta på 1,5 % så som beskrivs i av-snittet om förändringsfaktor ovan.

Diskutera om inlåningsräntan faktiskt är ett konkurrensargument mellan bankerna med dagens räntesatser.

24.2.4. Låneränta När du ska ut på bostadsmarknaden kommer du att märka att du behöver låna pengar av en bank för att ha råd att köpa en bostad. Skriv ett program som ger dig en översikt över månadskostnaderna, om följande gäller:

Lånebelopp: 1 500 000 kronor Räntesats: 1,7 % av det återstående lånebeloppet per år Rak amortering: 0,5 % av det ursprungliga lånebeloppet per år Bostadsrättsavgift: 4500 kronor per månad Resor till och från arbetet: 860 kronor per månad Internetanslutning: 240 kronor per månad Din månadslön efter skatt: 15 000 kronor Mat: 3500 kronor per månad

a) Beräkna hur mycket pengar du har kvar på kontot vid månadens slut, efter att du beta-lat mat, ränta, amortering och bostadsrättsavgift mm.

b) Utöka programmet så att det visar grafiskt hur lånebeloppet minskar med åren, samti-digt som ackumulerad betald ränta ökar med åren. Avgör när lånet är helt amorterat.

Ta hänsyn till att när du amorterat en summa under ett år kommer räntan att minska till nästa år, eftersom lånebeloppet då är mindre.

c) Räkna ut när lägenheten är fullt betald och vad du i själva verket då har betalat till banken.

Page 282: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SAMBAND OCH FÖRÄNDRING

RÄKNA MED PYTHON 280

d) Staten ändrar amorteringskraven ibland. Utöka programmet så att amorteringssatsen kan matas in i början av programkörningen. Prova med olika procentsatser och se när lånet är avbetalat.

e) Antag att du bundit lånet på ett år och alltså kan räkna med att få ny räntesats varje år. Banken vill kompensera sig för diverse bonusprogram genom att höja räntesatsen med 0,1 % per år. Hur påverkar det din budget? Visa månadskostnaden för varje år tio år framöver.

24.3. Samband

Ett exempel på ett samband är när du ska köpa bananer i en affär. Antag att bananer kos-tar 20 konor per kg. En funktion som beskriver detta samband ser ut så här:

Pris på bananer = 20 kr/kg * antalet kg

Detta är en så kallad proportionalitet. Köper du inga bananer, kostar det inget att gå ut från affären, men ju flera bananer du köper desto mera kostar det. Det är en konstant relation som kan visas som en rät linje i ett diagram.

Alla samband som ser ut som räta linjer i ett koordinatsystem kallas linjära funktioner och kan beskrivas med en generell funktion:

y = kx + m

24.3.1. Prova på a) Skriv ett program som räknar ut olika värden för y enligt formeln y=2x–3. Börja med x= –2 och fortsätt stegvis, med steget 1, tills x=4.

b) Plotta ett diagram och visa den räta linje som beskriver förhållandet i funktionen i a).

Page 283: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SAMBAND OCH FÖRÄNDRING

RÄKNA MED PYTHON 281

24.3.2. Lösningsförslag a)

# beräkna_y.py def f(x): return 2*x-3 # Huvudrutin for x in range (-2, 5): print('f(', x, ') = ', f(x), sep='')

vid körning

f(-2) = -7 f(-1) = -5 f(0) = -3 f(1) = -1 f(2) = 1 f(3) = 3 f(4) = 5

b)

Page 284: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SAMBAND OCH FÖRÄNDRING

RÄKNA MED PYTHON 282

24.3.3. Åka tåg

Du ska åka tåg och vill veta allt om resan. Du har förmodligen hört problemet förr? Du åker från Stockholm till Göteborg och vet att tåget kör med en viss fart och resan tar en viss tid. Hur lång är sträckan?

Skriv tre program som räknar ekvationen framlänges och baklänges.

sträckan = tiden * hastigheten

eller

s = t * v

a) Först ska användaren uppmanas hitta på en sträcka och ange den i kilometer för pro-grammet. Sedan ska användaren själv räkna ut hur lång tid resan tar med kännedom om att hastigheten är 160 km/t och ange tiden för programmet, räknat i timmar. Programmet

utför v

st och verifierar om användaren räknat ut tiden rätt. Är den inmatade tiden fel,

ska användaren uppmanas försöka igen genom att köra om programmet.

b) På samma sätt som förut ska användaren uppmanas hitta på en restid och ange den för programmet räknat i timmar. Sedan ska användaren själv räkna ut hur fort resan går med kännedom om att sträckan är 30 kilometer och ange hastigheten för programmet, räknat i kilometer per timme.

c) På samma sätt som förut ska användaren uppmanas hitta på en hastighet och ange den för programmet räknat i km/t. Sedan ska användaren själv räkna ut sträckan med kännedom om att tiden är 7 timmar, och ange sträckan för programmet, i kilometer.

d) Det blir växelfel i Bromölla och du blir stående i 7 timmar. Vilken blev den verkliga medelhastigheten i b)?

Page 285: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SAMBAND OCH FÖRÄNDRING

RÄKNA MED PYTHON 283

24.4. Ekvationssystem

Ett ekvationssystem består av två eller flera funktioner som beskriver ett samband där de båda har ett eller flera gemensamma värden. Man kan till exempel köpa apelsiner för 18,80 kronor, men får olika många om man handlar på en lågprisbutik eller i en specialbu-tik, eftersom butikerna har olika pris per kg. Från kapitlet om algebra vet du att man kan lösa ekvationer med hjälp av sympy-funktionen solveset().

24.4.1. Prova på a) Lågprisbutiken Snabben säljer apelsiner för 6 konor per kg. Plastpåsar kostar 2 kronor. I specialbutiken Erikssons miljöhandel säljer man KRAV-märkta apelsiner för 8,50 kronor per kg, men du får en rabatt på 5 kronor om du tar med en egen påse. Ett ekvationssy-stem som beskriver detta, ser ut som följer:

kostnad1 = 6*a + 2

kostnad2 = 8,5*a – 5

b) Använd ekvationen:

–5x + 3 = 3x + 13

Använd funktionen plot() för att rita upp dessa linjer i ett diagram. Där linjerna korsas, finns lösningen för x.

24.4.2. Lösningsförslag a)

# apelsindiagram.py from sympy import Symbol from sympy.plotting import plot a = Symbol ('a') plot (6 * a + 2, 8.5 * a - 5)

Du ser att det lönar sig att köpa apelsiner från specialbutiken, tills du når cirka 2,5 kg, då istället snabbköpet lönar sig bättre.

Page 286: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

SAMBAND OCH FÖRÄNDRING

RÄKNA MED PYTHON 284

b)

24.4.3. Koordinatsystem Lär dig hitta rätt i ett koordinatsystem.

a) Skriv ett program som ritar upp ett koordinatsystem på skärmen med inlagda stödlin-jer och sedan anvisar användaren var denne ska klicka i systemet genom att visa en x- och en y-koordinat. Koordinatsystemet ska sträcka sig mellan 0 och 10 i x- och y-led. Klickar användaren på fel ställe, ska det riktiga stället visas med en röd punkt, varefter ett nytt koordinatpar visas. De röda punkterna blir kvar.

Uppgifter om hur du gör diagrammet interaktivt med matplotlib, finns på sidan 139.

b) Utöka programmet så att koordinatsystemet sträcker sig mellan –10 ... 10 i x- och y-led. Räkna även antalet rätt- och felklick.

24.5. Stöd och hjälp

Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 287: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROBLEMLÖSNING

RÄKNA MED PYTHON 285

25. Problemlösning

All programmering går ut på att överföra ett givet problem till ett program. Det ska göras på ett så bra sätt som möjligt. För programmerarens egen del bör programmet vara enkelt att förstå och enkelt att underhålla. Angreppsmetoden ska vara logisk och dokumen-teras korrekt. Användaren är mest intresserad av att algoritmen ska vara effektiv, alltså komma fram till ett resultat snabbt. Det finns tusen sätt att skriva ett program, men bara några av dem är bra. Programmerarvärlden har en standardformulering för detta:

KISS – Keep it simple, stupid!

Rådet kan tyckas barnsligt, men utgör essensen av alla kraven ovan.

25.1. Algoritmer

Algoritmen definieras som ett sätt att beskriva hur ett problem ska lösas i form av olika steg, för att åstadkomma ett önskat resultat. Sortering är en typisk algoritm som är nyttig i de flesta situationer. Tänk dig att du är inne på en e-handelssida och letar i listan över tangentbord. Den är kanske sorterad i färgordning, men du vill hellre ha det billigaste tangentbordet. Du klickar på pilen i tabellhuvudet vid ordet ”pris”, och vips sorteras lis-tan om med det billigaste tangentbordet överst. Hur fungerar det?

25.1.1. Prova på a) Beskrivningen av algoritmen för bubbelsortering är enkel: Ta en godtyckligt lång lista med tal (element). Jämför element 1 och 2 i listan. Är element 1 större än element 2, byter de plats. Fortsätt att jämföra element 2 och 3 och byt eventuellt plats på dem. Gör så tills du nått slutet av listan. Nu har det största talet bubblat upp och är sist i listan.

Börja sedan om från början och jämför element 1 och 2, byt eventuellt plats på dem och fortsätt så till dess att näst största talet i listan bubblat upp och är näst sista element. Fortsätt så genom hela listan. Skriv denna algoritm i Python.

25.1.2. Lösningsförslag # bubbelsortering.py # Skapa lista med tal tallista = [6, 3, 4, 2, 1] # Skapa en indexlista som innehåller slutpositionerna # Exempel [5, 4, 3, 2, 1] for slut_index in range(len(tallista), 1, -1): # Skapar en indexlista som går från början till # slutpositionerna Vid varje iteration kommer # slutpositionen att flyttas ett steg framåt for i in range(1, slut_index): if tallista[i-1] > tallista[i]: # Byt plats på elementen temp = tallista[i] tallista[i] = tallista[i-1] tallista[i-1] = temp # Skriv ut den sorterade listan print(tallista)

Page 288: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROBLEMLÖSNING

RÄKNA MED PYTHON 286

25.1.3. Insertion Sort Världen är full av sorteringsalgoritmer och den som kan hitta på en bättre kan bli rik som Joakim von Anka. Här ska du få implementera en metod som skiljer sig från bubbelsorter-ing, som introducerades tidigare.

1. Metoden börjar med en lista med osorterade tal. Listan sorteras genom att program-met tar det första hittills osorterade talet och undersöker var det kan passas in mellan ett tidigare sorterat mindre och större tal.

2. Nästa varv i algoritmen tar programmet nästa osorterade tal och passar in det på rätt plats i den sorterade listan.

3. När programmet nått den sista posten i listan, är denna sorterad.

Första gången finns inga sorterade tal. Då betraktas det första talet i listan som redan sorterat. Operationen börjar egentligen med det andra talet i listan.

Skriv ett program som utför Insertion sort. Programmet ska visa den osorterade och sor-terade listan och antalet iterationer.

25.1.4. Quick Sort Din förhoppning att bli rik som JvA får konkurrens av Quicksort, en ännu snabbare algo-ritm.

1. Quicksort går ut på att listan med osorterade tal delas i två genom att talet i en god-tycklig post väljs ut och alla tal större än detta tal flyttas upp i den övre delen av listan, utan att sorteras. Alla tal som är mindre än talet flyttas ned i den undre delen, utan att sorteras.

2. De båda delarna underindelas på samma sätt, och processen görs om på varje del.

3. Så kan du fortsätta att dela ett godtyckligt antal gånger, varefter listan till sist blir sorterad.

Utvikning

Så länge dellistorna innehåller fler än ett element kan varje del sorteras med en känd me-tod, som Insertion sort eller bubbelsortering. När varje del är sorterad, är hela listan sor-terad.

a) Skriv ett program som utför Quick sort. Programmet ska visa den osorterade och sorte-rade listan och antalet iterationer och delningar.

b) Använd Insertion sort eller bubbelsortering för att sortera dellistorna och ta reda på vilken algoritm som är effektivast.

c) Undersök vid vilket antal delningar som Quicksort med tillsatsmetoder blir som snab-bast, eller snarare, utför minst antal processteg.

25.1.5. Stöd och hjälp Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 289: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROBLEMLÖSNING

RÄKNA MED PYTHON 287

26. IX Paraduppgifter

Följande uppgifter är väldigt avancerade och avsedda för den som kommit väldigt långt. Lösningsmetoden är inte helt uppenbar.

26.1. Morsesändare

Telegrafnyckel

Är 1838 uppfann Samuel Morse morsealfabetet för telegrafi över telegrafledningar. Mor-ses ursprungliga alfabet var inte så användbart och har reviderats flera gånger. Nu gäller det Internationella telegrafalfabetet.

Morsesignalering är trots teknikutvecklingens enorma framsteg fortfarande det effekti-vaste sättet att överföra text på en svårt störd förbindelse, främst för att ”avkodaren” i andra änden är den mänskliga hjärnan, som är oöverträffad när det gäller att upptäcka signaler dolda i brus. När tekniska anordningar i det sårbara samhället slås ut i en kata-strofsituation, är en skicklig morsetelegrafist alltjämt ovärderlig. Då är överföringshastig-heten inte det viktigaste, utan att budskapet oförvanskat över huvud taget kommer fram.

Morsetecken är sammansatta av serier av korta prickar och långa streck (teckendelar, tut) på ett eller tre enhetsintervall, med ett enhetsintervall emellan. Mellan två tecken ska det vara tre enhetsintervall och mellan ord sju enhetsintervall.

Krav:

A. Programmet ska ta emot ett meddelande i klartext från användaren och mata ut det som morsekod i datorns tuta. Ljudsignal görs i Python med satsen winsound.Beep().

B. Studera det internationella telegrafalfabetet, inklusive svenska specialtecken. Pro-grammet ska minst kunna hantera tecknen A-Ö, 0-9 och punkt.

C. Gör funktioner som: 1) Tar emot ett skrivtecken och lämnar ett morsetecken i retur. En lista som avsöks med attribut kan vara lämplig att använda. 2) Tar emot ett morsetecken och anropar ytterligare funktioner som matar ut ett kort tut, en kort paus, ett långt tut, en tecken-paus eller en ord-paus.

Page 290: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROBLEMLÖSNING

RÄKNA MED PYTHON 288

D. Allt eftersom tecknen sänds, ska de visas i terminalvyn.

E. Programmet ska vara omställbart i olika sändningstakt, räknat i ord per minut (words per minute, WPM). Normal sändningstakt är 65-takt, alltså 65 ord per minut. Anta att ett ord är fem bokstäver. Kom ihåg att även tidsintervallet till nästa ord ingår i ett ord.

Prova programmet med några berömda meddelanden: SOS Nödanrop (för taltrafik gäller Mayday-mayday). CQ CQ ”Seek you/Söker dig” allmänt anrop på kortvåg CQ20 CQ20 ”Söker dig på 20 meters våglängd” SM0FIX Författarens anropssignal SAQ SAQ Den svenska trådlösa telegrafstationen Grimetons anrop V V V ”V is for Victory” BBCs anropssignal under andra världskriget

Om detta till äventyrs skulle sporra dig att börja lyssna på kortvågsradio är sekvensen CQ CQ den du förmodligen kommer att känna igen först, både i morse och tal. Därefter kommer du att inse att kortvågsradion är en ny, outforskad värld som kan sluka oändliga mängder tid och ge oändlig tekno-nörd-tillfredsställelse!

26.1.1. Utförande Börja med att rita ett flödesschema för programmet. Det ska presenteras tillsammans med resultatet och utskriften. Du ska kunna motivera och förklara flödet. Skriv därefter pro-grammet.

26.1.2. Morseavkodare Skriv ett program som gör tvärtom, lyssnar på en morsesändning på kortvågen och gör om tecknen till text. För det behöver du diverse maskinvara. Hur du gör det, får du reda på i boken Digitalslöjd, från Huvudrutin AB.

Page 291: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROBLEMLÖSNING

RÄKNA MED PYTHON 289

26.2. Marsraket

Rymdraketen Aniara ska till Mars med sju astronauter. Det kortaste avståndet mellan Mars och Jorden är 58 miljoner kilometer (Mkm). Raketens tomvikt är 100 ton, vilket in-kluderar de hydroponiska trädgårdarna. Raketens acceleration eller retardation måste hela tiden vara 1 g för att besättningen ska uppleva normal jordgravitation. Raketen läm-nar Jorden med 1 g acceleration och när den är halvvägs vänder den motorerna baklänges och börjar bromsa med 1 g för att slutligen nå Mars med farten noll. Motorerna förbrukar således bränsle hela tiden.

Din uppgift är att räkna ut hur mycket förnödenheter och bränsle rymdfararna måste ha med sig och presentera en snygg tabell för NASA som ska bygga raketen.

A. Hur fort går raketen kontra Jorden när den nått halvvägs? Jorden rör sig också, men det kan du bortse från. Hur lång tid tar hela färden? Det kan du beräkna när du kän-ner totalvikten. Men du kan inte beräkna totalvikten förrän du vet resans längd i da-gar, med avseende på förbrukade förnödenheter. Du kan inte beräkna resans längd i dagar förrän du vet totalvikten. Eller kan du det? Intressant!

B. En människa förbrukar 3 liter vatten per dygn. Hur mycket vatten förbrukar de sju besättningsmedlemmarna under resan?

C. En människa måste äta 2 kg mat per dygn. Hur mycket mat förbrukar de sju besätt-ningsmedlemmarna under resan, om mat i medeltal väger 1 kg per liter? Hur mycket mat måste man ta med sig från Jorden om de hydroponiska trädgårdarna ombord pro-ducerar 25 % av maten? Förutsätt att allt avfall från den odlade maten återvinns som växtgödning och att vattnet i avfallet återvinns för att vattna trädgårdarna i ett evigt kretslopp.

D. Människan andas in 300 kg syre per år och ut lika mycket koldioxid per år, som måste rensas bort ur andningsluften i rymdkapseln och delvis återanvändas i de hydroponis-ka trädgårdarna ombord och bli till lika mycket syre. Den utandade koldioxiden måste ersättas med syre. Kvävet i luften förbrukas inte. Hur mycket koldioxid har besätt-ningen åstadkommit under färden? Vad väger det? Hur mycket koldioxid finns kvar efter färden, om växterna ombord använder 15 % av koldioxiden för att skapa 15 % av

Page 292: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROBLEMLÖSNING

RÄKNA MED PYTHON 290

syret? Vad väger den kvarvarande koldioxiden? Resten av syret måste ersättas med medhavt syre i flytande form. Vad väger det? Hur många liter flytande syre vid -192°C måste raketen ha med sig? Tänk på att det ska finnas 10 % extra syre kvar efter resans slut, som säkerhetsmarginal.

E. När jordlingarna stiger ut ur kapseln på Mars möts de av ett uppbåd av gröna marsia-ner. De diplomatiska förbindelserna mellan Jorden och Mars är viktiga. Jordlingarna har därför med sig presenter i form av gula och blå ekologiska pythonformade kara-meller, som överräcks till hövdingen. Beräkna Mars befolkningsmängd och anta att invånarna ska ha en karamell var. Mars har samma befolkningstäthet som Sibirien, nämligen 2,7 marsianer per kvadratkilometer. Mars radie är 3389 kilometer och ytan beräknas som 4*pi*r2. Totalvikten på karamellerna kan beräknas som att varje kara-mell väger 10 gram och volymen genom att man vet att densiteten för socker är 850 kg/m3.

F. När du vet mängden medhavda karameller, mat, vatten och gaser kan du beräkna bränsleåtgång1en, eftersom det åtgår 0,1 ton bränsle per sekund för att accelerera 25 ton massa med 1 g. Hur mycket bränsle åtgår för hela färden? Totalvikten är tomvik-ten + bränslets vikt + matens vikt + syrets vikt + vattnet + karamellerna. Bortse ifrån att det medhavda bränslet minskar i vikt allt eftersom det förbrukas. Astronau-ternas vikt är försumbar.

G. Utöka programmet så att du kan mata in avståndet till valfri planet med valfri befolk-ningstäthet och karamellmängd. Merkurius: 77 Mkm, Venus: 41 Mkm, befolkning: sannolikt grillad, Jupitermånen Europa: 628 Mkm, befolkning: fiskar, Pluto: 4280 Mkm och Proxima Centauri B b: 4,37 ljusår. Rätt namn ska finnas med i tabellens ru-brik. Bedöm om det är rimligt för människor att färdas till Pluto – and beyond!

Det här är också en övning i att göra snygga utskrifter. Formatera utskriften som visas nedan. Skulle utskriften inte få plats i terminalvyn kan du storleksförändra vyn.

Krav:

Alla sifferuppgifter ska vara högerställda i en fem tecken bred spalt som är vänsterut-fylld med blanksteg. Automatisk högerställning gör du med en format-sats inuti print-satsen.

Gör en funktion för att mata ut avdelarna med === och ---

Tabellen ska ha snygga raka kolumner och rak högerkant. Python har en inbyggd ta-bellritare kallad texttable som kan instrueras att göra detta. För att få högerställda sifferkolumner använder du format-satsen med utfyllnadsargument.

Page 293: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROBLEMLÖSNING

RÄKNA MED PYTHON 291

=================================================+ RESA TILL MARS MED S/S ANIARA MED 7 ASTRONAUTER | -------------+-----------------------------------+ Total resväg | ????? Mkm enkel resa | Toppfart | ????? km/s | på avståndet | ????? Mkm | Total restid | ????? dygn | Tomvikt | ????? ton | Totalvikt | ????? ton | =============+===================================+ Förnödenheter vid resans början | -----------+------------+------------------------+ | VIKT | VOLYM | Vatten | ????? ton | ????? kubikmeter | Syre | ????? kilo | ????? liter (flytande) | Mat | ????? ton | ????? kubikmeter | Bränsle | ????? ton | ????? kubikmeter | Karameller | ????? ton | ????? kubikmeter | ===========+============+========================+ Avfall vid resans slut | ------------------------+------------------------+ | VIKT | Tot. utandad koldioxid | ????? kilo | Kvarvarande koldioxid | ????? kilo | Kvarvarande avfall | ????? ton | ========================+========================+

26.2.1. Utförande Börja med att rita ett flödesschema för beräkningen. Det ska presenteras tillsammans med resultatet och utskriften. Du ska kunna motivera och förklara flödet. Skriv därefter programmet.

Page 294: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROBLEMLÖSNING

RÄKNA MED PYTHON 292

26.3. II Mandelbrots mängd

Fraktaler är funktioner som antingen kan finnas i verkligheten eller bara finnas som matematisk teater. Exempel på fraktaler som finns i verkligheten är växten grönkål. Titta noga på en broccoli romanesco och du får se ett mönster som upprepar sig om och om igen i allt finare detaljer. I själva verket beskriver de allt mindre spiralerna på kål-blomman Fibonaccis talserie.

Mandelbrots mängd är en matematisk funktion med samma egenskaper som grönkålen. Den kan tyckas enkel, men tit-

tar man närmare finns det oändligt många detaljer. Mandelbrots formel visar om en koor-dinat i ett koordinatsystem tillhör Mandelbrots mängd eller ej. Programmet löper igenom formeln och kommer efter många iterationer fram till om koordinaten tillhör mängden eller ej.

Man brukar visa resultatet så att koordinater som tillhör mängden plottas som svarta, medan andra koordinater utanför mängden ges en färg som beror på hur många varv man varit tvungen att prova Mandelbrots formel innan man fick ge upp och inse att koordina-ten inte tillhörde mängden.

Koordinatsystemet har en reell och en imaginär axel och det är just tack vare de imaginä-ra talen som funktionen blir så intrikat.

Benoit B. Mandelbrot blev världsberömd bland matematiker för sin formel och sin mängd. Föreställer du dig mängden i koordinatsystemet som ett fysiskt föremål kan du zooma in i

Page 295: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

PROBLEMLÖSNING

RÄKNA MED PYTHON 293

den och upptäcka nya detaljer, stjärnhimlar och märkliga symmetrier. Figuren är oändligt djup och oändligt detaljrik. Ju djupare du zoomar, desto fantastiskare blir formerna vid mängdens kanter, ja nästan hypnotiserande.

Med lite utforskande kan du hitta landskap och universa som ingen annan hittat. Zoomar du riktigt djupt kan du bli världsmästare i mandelbrotzoomning. Sparar du flera zoom-ningar i en film och sätter musik till kan du bli ett Youtube-fenomen.

Mandelbrots mängd utvärderas med följand formel.

czZ nn 2

1

Man utgår från z0=0. Det komplexa talet c tilhör Mandelbrots mängd om absolutvärdet av zn inte går mot oändligheten, oavsett hur många gånger man itererar, dvs oavsett hur stort n blir.

Manelbrotzoomning är en beräkningstung uppgift. Vill du se de finaste detaljerna blir det väldigt många iterationer. 1030 iterationer är inte ovanligt. Det bästa är om du har en rik-tigt stark dator att räkna på.

Läs mer om hur du räknar ut Mandelbrots mängd på Wikipedia.

Du kan hitta några inspirerande exempel på Youtube om du söker på användaren Olbaid Fractalium. Hans zoomnngar görs med fantastiska 101194 iterationer.

26.3.1. Stöd och hjälp Skulle du får problem med någon uppgift, eller om något är oklart kan du kontakta kund-stödet på [email protected]. Vi uppskattar dina synpunkter.

Page 296: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

TERMINOLOGI FÖR DIN EGEN SKULL

RÄKNA MED PYTHON 294

27. Terminologi för din egen skull

Den moderna datorvärlden är full av en massa surr-ord (jaja, buzzwords) som människor tror att de behöver ta till för att visa att de är med i svängen. Programmering och dator-teknik har sina specialord, men du behöver inte alls ta till underliga ord på engelska, ef-tersom det finns utmärkta svenska ord. Ibland kan du behöva påminnas om vad orden betyder.

Korrekt teknikspråk är inte fikonspråk.

27.1.1. Den logiska världen Specialord för att beskriva sådant du inte kan ta på, som idéer och program.

Binärkod: (engelska: binary code) Ett da-torprogram som är direkt körbart i en pro-cessor. Koden består bara av ettor och nol-lor och är således binär. Se Maskinkod.

Data: en liten bit information, till exempel en bokstav på en sida. Data är i sig själv meningslöst, men mycket data tillsammans bildar information, som en hel textsida, som är meningsfylld. Data omvandlas till information med hjälp av automatisk data-behandling (ADB).

Dialogruta: En ruta på bildskärmen som antingen visar ett meddelande eller där man kan göra enklare inställningar, som utnyttjas av fönstersystemet. Efter att man gjort inställningarna, stänger man dialog-rutan med exempelvis OK-knappen. En dialogruta är inte ett fönster. Ett fönster har ingen OK-knapp.

Exekvera, se köra.

Fönster: En ruta på bildskärmen, där man ägnar sig åt någon aktivitet. Fönstret ska-pas av det program som stödjer aktiviteten, som en webbläsare eller ordbehandlare. Ett fönster är inte en dialogruta och känne-tecknas av att det har manöverknapparna . Fönstret, som utgör själva pro-grammet, stängs inte förrän man stänger av hela programmet med kommandot Stäng i Arkiv-menyn eller klickar på stäng-knappen . Ett operativsystem som stödjer fönster kallas för fönstersystem och det mest kända är Fönster (Windows).

Högnivåspråk: (engelska: high-level language, HLL) Ett programmeringsspråk som mer eller mindre liknar engelska. Högnivåspråket måste kompileras för att

bli till maskinspråk, eller tolkas av en tolk för att kunna köras.

Integrerad utvecklingsmiljö: (engelska: integrated development environment, IDE) Ett datorprogram med vilket man kan skriva och prova datorprogram. Program-met visar ett antal vyer på bildskärmen, i vilka man kan skriva källkod, visa felmed-delanden och se resultatet när programmet körs, samt hantera källkoden i ett system för versionshantering. När man är nöjd med källkoden kan den transporteras ut ur den integrerade miljön och in i måldatorns maskinvara.

Klartecken: Se prompt.

Kod: Krypto eller hemlig kod, en text som inte kan förstås om man inte kan dekrypte-ra den. Datorer programmeras istället med program som är helt begripliga för männi-skor.

Kompilator: (engelska: compiler) omvand-lar programmets källkod till maskinkod.

Källkod: (engelska: source code) Källan till programmet, programsatserna, den text som en människa matar in, som mer eller mindre liknar engelska. Undvik ord som source och sourcekod.

Köra: att låta datorn utföra ett program.

Lågnivåspråk: (engelska: low-level langu-age, LLL) Ett programmeringsspråk som kallas assembler och är en människovänli-gare representation av maskinkod. Språket består av bokstavsförkortningar som efter-liknar maskininstruktionerna. Assembler måste assembleras för att bli till maskin-kod. Att programmera i lågnivåspråk är

Page 297: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

TERMINOLOGI FÖR DIN EGEN SKULL

RÄKNA MED PYTHON 295

mycket tidskrävande men ger mycket kom-pakta och effektiva resultat.

Maskinkod: (engelska: machine code) Det slutliga datorprogrammet när det kompile-rats till maskinkod. Efter kompilering be-står programmet bara av koder som svårli-gen kan tolkas av människan.

Meny: Ett sätt att välja och utföra kom-mandon och göra inställningar i en föns-termiljö.

Program: En lista med instruktioner till en dator, skrivna i ett programmerings-språk. Undvik orden code, mjukvara, soft-vara och software. Se även Källkod. Code betyder ”kod” på svenska, alltså krypterad text.

Programgenerator: (engelska: program generator) Ett datorprogram som tar ett program i högnivåspråk och omvandlar det till ett program i något annat språk, eller tar ett program konstruerat som ett flödes-schema i en grafisk utvecklingsmiljö och gör konkreta programsatser av det.

Programmerare: (engelska: programmer) En person som skriver datorprogram. Und-vik ord som coder eller developer.

Prompt: Klartecken. Operativsystemets eller programmets sätt att begära nästa kommando. I Python är prompten >>>.

Sats: (engelska: statement) En program-rad.

Syntax: Programmeringsspråkets gram-matik. Brott mot syntaxreglerna ger fel-meddelanden.

Tolk: (engelska: interpreter) ett program eller en programmeringsmiljö som löpande omvandlar programsatser till körbar ma-skinkod och kör dem. Så fungerar Python i tolkläge.

Versionshantering: Allt efter som pro-grammeringsarbetet fortskrider, kommer programmet att lagras i flera versioner. Det är bra om man kan spara alla versionerna och ha möjlighet att gå tillbaka och se vad man gjort tidigare. Det kan skötas med ett system för versionshantering. Ett exempel på ett vanligt system som finns på Internet är Git.

27.1.2. Programmeringsord Specialord som används under programmering, avseende delar av ett program eller meto-der för programmering, med inriktning på Python.

Anrop: (call) Ett program anropar exem-pelvis en funktion, för att utöka sin egen förmåga. Anropet görs genom att man skri-ver funktionens namn i programmet. Som resultat av anropet får programmet ett re-tursvar med begärt data.

Avlusning: (felsökning, debugging) Alla program får fel och de måste avhjälpas med hjälp av felsökning. På engelska kallas fel för ”bugs” (löss) som man blir av med ge-nom avlusning.

Bibliotek: (library) En samling paket med hjälpprogram, skriven av någon annan, som huvudrutinen behöver. Ett bibliotek är externt från huvudrutinen och kan hämtas manuellt, eller länkas in dynamiskt under körning om det behövs.

Block: en sammahållen del av programmet som körs som reaktion på en frågesats

Bugg: Ett programfel. Se avlusning.

Datatyp, se klass.

Definition: En funktion, en programdel som ska kunna återanvändas, måste defini-eras. Det går till så att man skriver det re-serverade ordet def och sedan funktionens programsatser.

Frågesats: (if statement) En sats som stäl-ler en logisk fråga och utvärderar den till sant eller falskt. Exempel: if A == 7 frågar om A är lika med sju. Är A lika med sju får frågan svaret sant. Se vidare if – elif – else.

Funktion: En programdel som ska kunna återanvändas. Den definieras och är sedan

Page 298: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

TERMINOLOGI FÖR DIN EGEN SKULL

RÄKNA MED PYTHON 296

tillgänglig för alla delar av programmet, att anropas när så behövs, så att man inte ska behöva skriva samma satser om och om igen.

Huvudrutin: Programmets startpunkt och huvudsakliga körväg.

If – elif – else: Ett komplex av frågesatser som utgör alla möjligheter att ställa frågor och därefter reagera och ställa flera delfrå-gor om den första frågan inte skulle vara heltäckande.

Indrag: (indentation) I Python används indragen text för att tala om för tolken var en programdel (block) börjar och slutar. Dessutom är det lätt för en människa att förstå indragen text. Ett indrag är fyra blanksteg, varken mer eller mindre. Gör du åtta blanksteg räknas det som dubbelt in-drag.

Klass: Den typ av data som finns i en vari-abel. Vanliga klasser är int (heltal), float (decimaltal), string (text) och imaginära tal. Det är viktigt att veta vilken klass en vari-abel har, så man inte använder den på fel sätt och får fel svar.

Krasch: När ett program misslyckas totalt under körningen och stannar.

Package: Se bibliotek.

Reserverat ord: Se nästa avsnitt.

Retur, returnera: (return) När en funk-tion avslutas har den för det mesta skapat ett värde som det anropande programmet begärde. Detta värde blir ett retursvar, nå-got som returneras tll det anropande pro-grammet.

Sats: (statement): Ett kommando till pro-grammet eller en programrad. Säg inte ”kodrad”.

Slinga: (loop) En programdel som uppre-pas om och om tills ett villkor är uppfyllt.

Subrutin: Se funktion.

Tilldelning: (assignment) Att sätta ett värde på en variabel, att tilldela variabeln ett värde. A=7 betyder att variabeln A till-delas värdet 7.

27.1.3. Reserverade ord Reserverade ord är sådana ord som inte får användas som variabel- eller funktionsnamn i program. Python kommer att lämna ett felmeddelande.

and as assert async await break class continue def del elif else except False finally for from global if import in

is lambda None nonlocal not or pass raise return True try while with yield

Page 299: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

INSTALLATION AV THONNY MED TILLBEHÖR

RÄKNA MED PYTHON 297

28. Installation av Thonny med tillbehör

Innan du kan börja arbeta med programmering måste programmet Thonny och en del tillbehör installeras i datorn. För din egen skull bör du installera programmen och tillbe-hören på ett logiskt och strukturerat sätt.

Windows har en standardplats där du uppmanas spara allt möjligt, nämligen C:\Mina dokument. Det är ungefär lika olämpligt som att ha en stor låda där du lägger alla dina ägodelar, och kallar den för Mina grejor.

28.1. Bygg lämplig katalogstruktur

Allvarligt menat arbete med datorer innebär att du har god ordning på dina filer och spa-rar dem i ett filträd som du själv skapat i din hemkatalog, så du vet vad som finns var. I Windows kan det se ut ungefär på detta sätt.

/arbete /arbete/thonny /arbete/svenska/uppsatser /arbete/samhällskunskap/statistik /arbete/samhällskunskap/uppsatser /arbete/matematik

God ordning är viktig, inte bara för att du lätt ska kunna hitta tillbaka filerna, utan för att det ska vara lätt att säkerhetskopiera allt ditt arbete i /arbete emellanåt. För du gör väl säkerhetskopior?

28.2. Installation av Thonny i Unix-liknande system

Maskinkrav: En dator dator med ett fungerande Unix-system med minst 60 megabyte le-digt på hårddisken. Anslutning till Internet.

Normalt finns Python redan installerat i systemet. Om det inte är så, installeras Python så här i olika system.

FreeBSD

sudo pkg install python36

Debian-derivat

sudo apt-get install python36

Fedora

sudo dnf install python36

Det enda du behöver göra sedan är att hämta Thonny med pip3.

pip3 install thonny

Page 300: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

INSTALLATION AV THONNY MED TILLBEHÖR

RÄKNA MED PYTHON 298

28.2.1. Installation av SQLite i Unix-liknande system FreeBSD

sudo pkg install sqlite3

Debian-derivat

sudo apt-get install sqlite3

Fedora

sudo dnf install sqlite3

28.3. Installation av Thonny i Mac OSX

Maskinkrav: En Apple-dator dator med minst OSX 10.6 (Snow Leopard) med minst 60 megabyte ledigt på hårddisken. Anslutning till Internet.

Thonny hämtas från https://thonny.org.

1. Klicka på länken Mac i övre högra hörnet. OSX frågar om du vill spara filen eller köra den och du ska välja att spara den.

2. Filen Thonny-3.1.2.dmg (eller senare version) hamnar i mappen Hämtade filer. Där kan den inte installeras.

3. Flytta filen till mappen Program och dubbelklicka på den.

4. Thonny installeras med en serie vägledande texter. En ikon med namnet Thonny 3.1.2 hamnar på skrivbordet. En mapp med samma namn finns därefter i mappen Program.

5. Dubbelklicka på mappen och verifiera att programmet Thonny, illustrerat med Thon-nys Th-logotyp finns i mappen.

Har du ett äldre apple-system måste du använda den långa installationsanvisningen som du hittar om du klickar på länken for Macs under rubriken Installation instructions längre ned på sidan.

Skapa därefter dina arbetsmappar i mappen Program/thonny 3.1.2/ exempelvis så här:

Program/thonny 3.1.2/arbete/

Page 301: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

INSTALLATION AV THONNY MED TILLBEHÖR

RÄKNA MED PYTHON 299

28.3.1. Installation av SQLite i Mac OSX Om du inte har databasmotorn installerad redan, måste du hämta den från www.sqlite.org/download.html.

För Mac OSX väljer du att hämta hem filen sqlite-tools-osx-x86-3270200.zip (eller se-nare version).

De tre uppackade filerna sqldiff.exe, sqlite3.exe och sqlite3_analyzer.exe måste också läggas i Thonnys arbetskatalog Program/thonny 3.1.2/arbete/. På det sättet slipper du ange sökvägar i det fortsatta. Efter uppackningen ska du bara arbeta med de uppackade filerna i Thonnys arbetskatalog.

28.4. Installation av Thonny i Windows

Maskinkrav: En PC-kompatibel dator med minst Windows 7 med minst 60 megabyte ledigt på hårddisken. Anslutning till Internet.

Thonny hämtas från https://thonny.org.

1. Klicka på länken Windows i övre högra hörnet. Windows frågar om du vill spara filen eller köra den och du ska välja att köra den direkt.

2. Thonny installeras med en vägledande serie dialogrutor. Välj att installera en ikon på skrivbordet.

Har du Windows XP eller Vista måste du använda den långa installationsanvisningen som du hittar om du klickar på länken for Windows under rubriken Installation instruc-tions längre ned på sidan.

Fortsättningsvis sparar du alla dina pythonfiler i arbetskatalogen

\arbete\thonny

så som beskrivs i avsnittets början.

Page 302: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

INSTALLATION AV THONNY MED TILLBEHÖR

RÄKNA MED PYTHON 300

28.4.1. Installation av SQLite i Windows Om du inte har databasmotorn installerad redan, måste du hämta den från www.sqlite.org/download.html.

För Windows väljer du att hämta hem filen sqlite-tools-win32-x86-3270200.zip (eller senare version) och lägger den i Thonnys arbetskatalog på din dator. Packa upp zip-filen med Utforskaren.

De tre uppackade filerna sqldiff.exe, sqlite3.exe och sqlite3_analyzer.exe måste också läggas i Thonnys arbetskatalog. På det sättet slipper du ange sökvägar i det fortsatta.

Starta tolken sqlite3.exe och om Windows bråkar om säkerhetsproblem, anger du att du visst vill köra filen.

Se väldigt noga upp i fortsättningen så du inte kör den komprimerade sqlite3 en gång till för då får du nya säkerhetsfrågor och Utforskaren skapar nya kataloger och filer och undrar om den får skriva över. Tyvärr är det väldigt liten skillnad mellan ikonen för katalog och komprimerad katalog.

Efter uppackningen ska du bara arbeta med de uppackade filerna i Thonnys arbetskata-log.

28.5. Installation av tillbehör

Pythons grundfunktioner kan utvidgas betydligt med hjälp av tilläggsfunktioner som skrivits och underhålls av andra öppen-källkodsgrupper. För ditt framtida arbete kommer du att behöva de flesta av dessa nedan. Det enklaste är att installera dem allihop.

Tilläggsmodulerna som används i denna bok hämtas alla från samma webbsida: https://www.scipy.org. Läs mer under rubriken Tilläggsmodulerna till Thonny på http://huvudrutin.se/index.php/lankar

SymPy är ett externt bibliotek som kan hämtas in i ett python-program och användas till att lösa ekvationer och rita upp svaren i ett diagram.

NumPy: En stödfunktion till Python som hanterar flerdimensionella talmatriser och ett antal matematiska funktioner som arbetar med matriserna.

Page 303: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

INSTALLATION AV THONNY MED TILLBEHÖR

RÄKNA MED PYTHON 301

SciPy: En samling matematiska moduler som kan användas för vetenskapliga ändamål, såsom optimering, linjär algebra, integration, interpolation, fouriertransformering, samt signal- och bildbehandling. SciPy behöver NumPy och Matplotlib för att kunna fungera.

Matplotlib: Ett kodbibliotek (plotting library) avsett för diagramritning i Python och NumPy.

28.5.1. Installation i Windows I Thonny, välj Tools > Open system shell. Skriv

python -m pip install numpy scipy matplotlib ipython jupyter pandas sympy nose

28.5.2. Installation i Mac OSX I Thonny, välj Tools > Open system shell. Skriv

pip3 install --user numpy scipy matplotlib ipython jupyter pandas sympy nose

Pip är en python-installatör som hämtar ett stort antal filer från Internet. Installationen kan ta åtskilliga minuter och kan tyckas stanna ibland. Men det är i sin ordning. Vänta tills du ser texten ”Successfully installed...”, varefter du bör få tillbaka prompten.

Stäng terminalfönstret. När installationen är klar, startar du om Thonny.

28.5.3. Installation ej möjlig i webbtillämpningar Undersök om den webb- eller molnversion av utvecklingssystemet som du använder, re-dan har tilläggsfunktionerna ovan tillgängliga. I annat fall kan du inte skriva program som kräver dessa funktioner. Funktionerna finns exempelvis redan i Repl.it.

Page 304: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ANDRA UTVECKLINGSMILJÖER ÄN THONNY

RÄKNA MED PYTHON 302

29. Andra utvecklingsmiljöer än Thonny

Python är ett språk du talar med datorer, på samma sätt som att svenska är det språk du skriver för att skicka brev till andra människor. Du kan skriva ett brev i valfri ordbehand-lare, som Word, Vi, EMACS, Anteckningar, Wordpad eller LibreOffice Writer, men resul-tatet blir detsamma. Meddelandet överförs till mottagaren på svenska.

På samma sätt är det med Python. Du kan använda olika ”miljöer” som Thonny, Repl.it, Ecplise Che, Cloud 9, IDLE osv för att skriva ditt brev, men det är fortfarande ett pythonprogram och det överförs fortfarande till mottagaren Python.

Valet av ordbehandlare avgör hur du skriver ditt brev. Word kan allt som behövs för att göra ett korrekt meddelande, som stavnings- och grammatikkontroll, medan Anteckning-ar knappt kan något alls, utom att lagra text.

Page 305: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ANDRA UTVECKLINGSMILJÖER ÄN THONNY

RÄKNA MED PYTHON 303

Python tolkar ditt överförda program och resultatet presenteras på det sätt som utveck-lingsmiljön klarar. Vissa miljöer klarar interaktiv grafik, andra inte. Vissa saknar funk-tionsbibliotek, andra är mera välutrustade. Men det är fortfarande Python.

Det finns ett tjugotal olika utvecklingsmiljöer för Python, en del kostnadsfria, en del kö-peprogram, en del bara på engelska, en del på många olika språk, Thonny är lätt att in-stallera, översiktligt och pedagogiskt att använda, med utmärkt, snabb, detaljerad avlus-ningsfunktion.

Bilden på förrqa sidan visar huvuddragen i några av de populäraste miljöerna. Som du ser är de ytligt sett ganska lika. De flesta grundläggande funktioner går igen i alla system. Det måste finnas en kör-ikon, metoder för avlusning och ett filträd där man kan spara sina programfiler.

Skillnaderna finns under huden på systemen:

Vilka funktioner och funktionsbibliotek som finns tillgängliga som standard kan varie-ra.

Sättet att mata ut grafik (diagram, plottade bilder) kan variera. Vissa system kan han-tera interaktiv grafik, andra kan inte.

Avlusningsfunktionerna kan vara olika detaljerade.

Exakt var programmet körs, kan variera. Antingen körs det i din dator eller också körs det i molnet.

29.1. Repl.it

Repl.it finns i molnet och då körs även programmen i molnet. Programfilerna sparas på samma ställe. Då har du begränsad eller ingen kontroll över dem. Det kräver att du skaf-far medlemskap, att du går med i organisationen, skaffar lösenord och lämnar ut din e-postadress.

Tyvärr kan molnkörning bli ganska långsam ibland, beroende på belastning. Det är otympligt att inte ha programfilerna hemma och köra i en lokal dator, särskilt om programmet ska användas i annan utrustning senare, till exempel om du följer upp denna bok med den praktiska delen i boken Digitalslöjd.

Innehållet i Räkna med Python går att använda med Repl.it med vissa undantag. Program som matar ut grafik och ägnar sig åt ekvationslösning behöver ändras för att fungera.

Utmatning av plottad grafik fungerar inte som i Thonny. Grafiken blir till en fil, som måste visas med ett kommando. På grund av detta blir interaktiv grafik inte möjlig.

29.2. Eclipse Che

Eclipse Che finns i molnet och då körs även programmen i molnet och programfilerna spa-ras på samma ställe. Det kräver att du skaffar medlemskap, att du går med i organisatio-nen, skaffar lösenord och lämnar ut din e-postadress. Eclipse kan också installeras lokalt.

Eclipse är en utvecklingsmiljö som stödjer ett antal språk, utöver Python, som C, C++, C#, F#, Go, Java, JavaScript, PHP, Ruby, SQL och TypeScript.

Förkortningen Che anger att huvuddelen av utvecklingsarbetet utförs i staden Cherkasy i Ukraina.

Page 306: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

ANDRA UTVECKLINGSMILJÖER ÄN THONNY

RÄKNA MED PYTHON 304

29.3. Cloud9

Cloud9 IDE finns i molnet och drivs av Amazon Web Services (AWS) Programmen körs i molnet och programfilerna sparas på samma ställe. Det kräver att du skaffar medlemskap, att du går med i organisationen, skaffar lösenord och lämnar ut din e-postadress.

Cloud9 finns också med som lokalt installerat program i mikrodatorer från Beagle-board.org, som PocketBeagle och BeagleBone. PocketBeagle är en av huvudkomponenter-na för arbete med Huvudrutins elektronikbok Digitalslöjd, men Cloud9 har i detta fall ersatts med Thonny som är mera pedagogiskt.

Cloud9 är en utvecklingsmiljö som stödjer ett antal språk, utöver Python, som C, C++, PHP, Ruby, Perl, JavaScript med Node.js och Go.

29.4. IDLE

IDLE (Integrated Development and Learning Environment) är en utvecklingsmiljö som körs lokalt och medföljer standardutgåvan av Python-språket. Den finns med i det paket som medföljer många linuxdistributioner. IDLE är avsett att vara mycket enkelt och där-med idealiskt för nybörjare, men saknar många önskvärda egenskaper som finns hos de mera avancerade miljöerna, som:

Textredigering i flera fönster, automatisk komplettering av text, utmärkande färger i syntaxen, smart indentering mm.

Ett terminalfönster med syntaxvisning.

Avlusningsmekanism med möjlighet till stegning.

IDLE är alltså inte den bästa utvecklingsmiljön, men den kan eventuellt duga som ett in-steg för att senare bytas mot något mera avancerat, som Thonny.

IDLE skrevs av samme man som uppfann Python: Guido van Rossum. Eftersom han kallade sitt språk Python för att hedra den brittiska komikergruppen Monty Python, an-tar man att namnet IDLE har valts för att hedra gruppmedlemmen Eic Idle. Se vidare avsnitt 2.3 Perspektiv på Python.

29.5. Din hjälp uppskattas

Räkna med Python kan alltid bli bättre. Vi gör inte anspråk på att ha täckt in alla skillna-der mellan Thonny och de övriga utvecklingsmiljöer som finns och kommer du på skillna-der som inte nämns här, eller om du använder någon utvecklingsmiljö vi inte känner till och har hittat problem med denna, vore vi på Huvudrutin AB väldigt glada om du hörde av dig med dina synpunkter så vi kan ta med dem i kommande versioner av boken. Du kan alltid komma i kontakt med oss via vår webbsida huvudrutin.se.

Page 307: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VERSIONSHANTERING

RÄKNA MED PYTHON 305

30. Versionshantering

Med tiden kommer du att skriva så många program och skapa så många datafiler att du kommer att få svårt att hålla ordning på dem.

Versionshanteringssystem används för att på ett strukturerat sätt hålla ordning på dina filer och förändringarna i filerna över tid. Det går att se de individuella föränd-ringarna genom filens historik och du kan även gå tillbaka till en tidigare version av filen. Du kan se versionshanteringssyste-met som en tidsmaskin!

Bilden visar Dr. Who:s tidsmaskin TAR-DIS (Time And Relative Dimension In Space) som pepparkakshus.

30.1. Så går det till normalt – oflexibelt

Antag att ni ska göra en skoluppgift i grupp. Då går det ofta till så att man gemensamt skapar ett dokument i en ordbehandlare som sedan e-postas ut till alla deltagare. När ti-den för inlämning av uppgiften närmar sig, börjar det bli panik och gruppens deltagare sätter sig hemma och lägger till och ändrar i texten var för sig. De olika filerna e-postas sedan kors och tvärs och någon får till uppgift att sammanställa allt till ett slutgiltigt do-kument. Det brukar inte vara det enklaste, speciellt inte under tidspress.

30.2. Med versionshantering – flexibelt

I en sådan situation hjälper ett versionshanteringssystem till genom att låta en grupp dela på en uppsättning filer. Antag att det handlar om en bok med många kapitel. Om man delar upp kapitlen i dokumentet i separata filer, kan respektive projektdeltagare ändra det kapitel som denne är satt att arbeta med och när nästa deltagare ska arbeta med samma fil så ser denne vad de tidigare har ändrat och hur det blev som det blev. Bestämmer sig gruppen för att ta tillbaka information från tidigare versioner, finns möjligheten att titta i äldre filer och kopiera de textrader som är intressanta att lägga tillbaka.

En av versionshanteringssystemets mest användbara funktioner är att sätta ett bokmärke på en uppsättning filer. Det kan till exempel användas när man ska publicera en ny ver-sion av sitt program.

Systemet strukturerar upp filerna i en trädstruktur allt eftersom de skapas och läggs in i systemet. Trädets stam (master) utgörs av filer med färdiga, fungerade, utprovade funk-tioner, medan grenarna används för att testa nya funktioner. Versionerna som läggs utef-ter en gren kan antingen accepteras i slutänden, eller förkastas.

Page 308: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VERSIONSHANTERING

RÄKNA MED PYTHON 306

30.3. Så fungerar systemet

I stora drag används de flesta versionshanteringssystem på samma sätt.

Skapa ett projekt: gör en katalogstruktur där filerna i projektet ska ligga i din dator. Det är lämpligen samma trädstruktur som den som visas i filträdet i Thonny.

Skapa en fil med innehåll, alltså det pythonprogram du utvecklar, och spara det i kata-logstrukturen.

Gör versionshanteringssystemet medvetet om filen.

Om du inte gör systemet medvetet om filen kallas den för ospårad och kommer inte att vara med i hanteringen.

30.4. Gör en ändring och publicera den

När du ändrat i en programfil eller annan fil, måste du göra systemet medvetet om den nya versionen.

Spara den nya versionen i katalogstrukturen.

Publicera den nya versionen genom att ”checka in” den.

Lägg till en kommentar om den nya versionen, en ny etikett, ett nytt bokmärke, ett nytt versionsnummer osv.

Systemet kommer själv att ta reda på skillnaderna.

30.5. Se ändringar

Allt eftersom arbetet fortskrider kommer filerna i katalogstrukturen att ändras. Efter ett tag måste du ta reda på vad som ändrats.

Ge versionshanteringssystemet kommandot att hämta alla ändringar i en viss katalog, eller katalogträd.

Begär en lista med ändringarna.

Välj vad du vill undersöka, i listan.

Titta närmare på skillnaderna i ändringsloggen för din utvalda fil.

Ändringsloggen visar också vem som har ändrat, om systemet tillåter flera användare att ändra, till exempel i ett större bokprojekt.

När du gör nya ändringar i en fil som finns i systemet, gör du som förut, sparar den i kata-logstrukturen och publicerar den igen.

30.6. Installera ett system

Det finns många olika versionshanteringssystem och de vanligaste är Git och Subver-sion. De fungerar i stort sett likadant.

30.6.1. Unix-liknande system Använd ditt pakethanteringssystem för att installera Git eller Subversion.

FreeBSD

svnlite är redan installerat

Page 309: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VERSIONSHANTERING

RÄKNA MED PYTHON 307

sudo pkg install git

Debian-derivat

sudo apt-get install git sudo apt-get install subversion

Fedora Linux

sudo dnf install git sudo dnf install subversion

30.6.2. Mac OS X Subversion respektive Git kan redan vara installerade. Prova i ett terminalfönster.

$ svn --version $ git –version

Om inte, kan du hämta dem från Internet från någpn av dessa adresser.

https://git-scm.com/download/mac https://subversion.apache.org/packages.html#osx

30.6.3. Windows Börja med att hämta hem lämpligt programpaket från Internet, från någon av följande adresser:

https://git-scm.com/download/win https://subversion.apache.org/packages.html#windows

Du får en exe-fil, som du installerar på gängse windows-vis.

30.7. Spara filen med innehåll i katalogstrukturen

Efter installationen är det dags att börja skapa data som kan övervakas. Skapa exempelvis filen skriv_ut.py i Thonny och spara i katalogen /arbete. Filen förutsätts innehålla ra-den

print("utskrift")

Efter detta blir procedurerna olika, beroende på vilket system för versionshantering du valt.

Page 310: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VERSIONSHANTERING

RÄKNA MED PYTHON 308

30.8. Om du valt Git

Du måste börja med att identifiera dig för systemet.

30.8.1. Gå med i Git Berätta vem du är, för att systemet och därmed projektdeltagarna ska kunna veta vem som gjort ändringar.

$ git config --global user.email "[email protected]" $ git config --global user.name "Cecilia"

30.8.2. Hämta ett repository från Internet En av de vanligaste åtgärderna är att hämta kod som andra har skrivit och publicerat på Internet. Det gör man med kommandot Git clone. För att hämta extramaterial till denna bok, ger du kommandot

Git clone http://huvudrutin.se/RmP.git

När du givit detta kommando kommer katalogen RmP att skapas i den katalog du stod när du gav kommandot. I denna katalog kommer allt extramaterial att finnas.

30.8.3. Vad ska Git hantera – Git init Git behöver få reda på exakt vad i strukturen på hårddisken som det ska hantera och byg-ga en historik för. Det gör du med Git init. Det Git init gör är i huvudsak att skapa en katalog som heter .git som kommer innehålla en historik över allt som händer i den kata-logstruktur som övervakas. .git-strukturen kallas för ”repository”.

Git kommer kontinuerligt att undersöka den del av katalogträdet den satts att övervaka, och rapportera eventuella ändringar när du ber om det.

Så här används kommandot git init.

$ cd arbete $ git init Initierade tomt Git-arkiv i /home/RmP/arbete/.git/

Till att börja med är repositoryt, historikdelen, alldeles tom. Snart ska du få fylla på den.

30.8.4. Git status Kommandot git status visar vilken status som versionshanteringssystemet har, nämligen vilka filer som är spårade (och finns på trädgrenen master), vilka av dem som checkats in för första gången och vilka som är ospårade och måste checkas in.

$ git status På grenen master Första incheckning Ospårade filer: (använd "git add <fil>..." för att ta med i det som skall checkas in) skriv_ut.py

Page 311: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VERSIONSHANTERING

RÄKNA MED PYTHON 309

Det finns inget under rubriken Första incheckning, men ospårade filer finns. Systemet uppmanar dig att använda Git add.

Git status visar grenen master, som är huvudgrenen. Systemet visar också att filen skriv_ut.py finns i katalogstrukturen och att det är en fil som systemet inte hanterar. Git uttrycker det som att den är ospårad.

30.8.5. Git add Det är lätt att lägga till en fil till repositoryt, alltså att göra en ospårad fil till en spårad.

$ git add skriv_ut.py

Ett nytt försök med Git status visar att systemet nu är medvetet om filen skriv_ut.py.

$ git status På grenen master Första incheckning Ändringar att checka in: (använd "git rm --cached <fil>..." för att ta bort från kö) ny fil: skriv_ut.py

Ännu finns inget på grenen master. Inget har heller checkats in. Status för filen skriv_ut.py har ändrats så att den nu känns igen av git. Men den versionshanteras fort-farande inte eftersom den väntar på att checkas in med kommandot commit.

30.8.6. Git commit För att checka in ändringen i Git, alltså för att få med skriv_ut.py i versionshanteringen, använder du kommandot commit.

$ git commit -m "Första versionen" [master (rotincheckning) d86de05] Första versionen 1 file changed, 2 insertions(+) create mode 100644 skriv_ut.py

Med tillägget -m "Första versionen" anger du den etikett som ska sättas på denna första incheckning. Kommandot anger att alla spårade filer ska checkas in och därmed etikette-ras. Alla incheckningar får samma etikett. Vill du ge dem olika etiketter, måste du checka in varje fil separat.

30.8.7. Git log För att se historiken, alltså allt som hänt sen sist i hela det övervakade katalogträdet, an-vänder du kommandot log.

$ git log commit d86de055f98da0af3f8d31a74b24dd6e4583fa61 Author: Cecilia <[email protected]> Date: Fri Aug 3 12:48:40 2018 +0200 Första versionen

Något med etiketten ”Första versionen” har checkats in av Cecilia. Objektet har ett iden-titetsnummer som är d86d…a61, men det är inte så smakligt för människan.

Page 312: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VERSIONSHANTERING

RÄKNA MED PYTHON 310

30.8.8. Git show För att se exakt vad som checkats in ber du Git visa upp objektet med kommandot show.

$ git show d86de055f98da0af3f8d31a74b24dd6e4583fa61 commit d86de055f98da0af3f8d31a74b24dd6e4583fa61 Author: Cecilia <[email protected]> Date: Fri Aug 3 12:48:40 2018 +0200 Första versionen diff –git a/skriv_ut.py b/skriv_ut.py new file mode 100644 index 0000000..13d3d78 --- /dev/null +++b/skriv_ut.py @@ -0,0 +1 @@ +print(“utskrift”)

I huvudsak ser du på raden diff –git a/skriv_ut.py att det nyligen incheckade objektet är din fil skriv_ut.py. Den allra sista raden visar också filens innehåll: print(”utskrift”). + betyder att raden lagts till i filen. Eftersom ingen fil alls fanns före detta kommando, är raden de facto tillagd.

30.8.9. Visa ändringar Säg nu att du ändrar i filen och lägger till två satser och vill se vad som ändrats. Det gör du med kommandot diff (difference). Då behöver du inte längre bry dig om identitets-numret. Diff visar upp alla filer som ändrats och ändringarna i dem.

$ git diff diff --git a/skriv_ut.py b/skriv_ut.py index 6f2fd02..22e3a27 100644 --- a/skriv_ut.py +++ b/skriv_ut.py @@ -1,2 +1,5 @@ print("utskrift") + +# En utskrift till +print("andra utskriften")

Om du bara vill se ändringar för en särskild fil, ger du kommandot

$ git diff skriv_ut.py

30.8.10. Git commit igen Ännu så länge vet Git bara om ändringarna, men de har inte checkats in, alltså inte ham-nat i historiksystemet. Ändringar i en fil checkas in med commit, som tidigare. Börja med att ange exakt vilken fil du vill checka in och fortsätt därmed med etiketten -m "Dagens arbete 20180800".

Page 313: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

VERSIONSHANTERING

RÄKNA MED PYTHON 311

$ git commit skriv_ut.py -m "Dagens arbete 20180800" [master 45bfbe6] Dagens arbete 20180800 1 file changed, 3 insertions(+) $ git status På grenen master inget att checka in, arbetskatalogen ren

Alternativt kan du checka in alla filer som ändrats under arbetspasset. Detta anger du med tillägget –a.

$ git commit -a -m "Dagens arbete 20180800" [master 45bfbe6] Dagens arbete 20180800 15 files changed, 27 insertions(+) $ git status På grenen master inget att checka in, arbetskatalogen ren

Systemet meddelar att det inte längre finns några spårade objekt i master att checka in.

30.8.11. Ångra oavsiktliga ändringar och backa i historien Antag att du råkat göra fel när du redigerade och har förstört en massa arbete och dessut-om råkade spara filen. Börja med att stänga Thonny och använd versionshanteringssy-stemet för att gå tillbaka till den senast incheckade versionen av filen.

$ git checkout skriv_ut.py

Detta reparerar filen.

Vill du gå längre tillbaka i historiken kan du utifrån listan som Git log visar, välja en identitet och backa dit, med kommandot:

$ git checkout d86de055f98da0af3f8d31a74b24dd6e4583fa61

30.9. Filformat

Ett typiskt versionshanteringssystem kan inte hantera vilka filformat som helst. Pythonfi-ler och HTML-filer fungerar bra, för de är rena textfiler. Det gäller givetvis också för andra rena textfiler.

Mera komplicerade filtyper som Word-dokument med dolda koder, kalkylark, binärfiler eller bildfiler kan inte hanteras ned på rad- eller pixelnivå. Systemet kan inte hitta skill-nader i filformat som det inte förstår sig på. I detta senare fall kommer ändringar bara att hanteras på fil-nivå.

Vill du versionshantera ordbehandlingsdokument från Word, OpenOffice osv, se till att spara dem i XML-format, eftersom XML är helt vanlig text utan dolda koder.

30.10. Säkerhetskopiering

Systemet för versionshantering befriar dig inte från behovet att göra regelbundna säker-hetskopior. Versionshanterinegn räddar inget data åt dig. Att förska återskapa förlorat data tar mycket länre tid än det tog att skapa det från början.

För din egen skull: Säkerhetskopiera!

Page 314: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LATHUND TILL THONNY

RÄKNA MED PYTHON 312

31. Lathund till Thonny 3.1

31.1. Thonnys menysystem

File Edit View Run Device Tools Help .

Det finns sju menyer på menyraden, som används för styrning av hur miljön fungerar, körning och avlusning av program, samt olika hjälpfunktioner. De vanligaste menyalter-nativen finns dessutom som snabbknappar eller genvägar på ikonraden under menyerna. Du kan använda båda metoderna att styra de vanligaste operationerna.

Thonny fungerar likadant som alla andra redigeringsprogram. De vanliga snabbkomman-dona Ctrl-X, Crtl-C, Ctrl-V, Ctrl-Z m fl kan användas. De flesta menyalternativ har snabbkommandon, som du bör lära dig, som f7 istället för Run > Step into.

31.1.1. File-menyn – hantering av filer New: Tömmer alla fönster och gör miljön klar för inmatning av ett nytt program. Du bör ha sparat ditt förra program först.

Open... Hämtar in en befintlig python-fil i utvecklingsmiljön.

Recent files Visar en lista med de python-filer du nyligen öppnat, så det ska vara lättare att öppna dem igen.

Close: Stänger det program som ligger på den främsta fliken i programredigeraren. Se till at spara programmet först.

Close all: Stänger alla programflikar i programredigeraren. Se till att de är sparade.

Save: Sparar det inmatade programmet under det filnamn du angav tidigare.

Save As... Sparar det inmatade programmet under nytt filnamn.

Rename... Döper om en python-fil. I sjelva verket visas en Spara som-ruta, men när du sparar filen under nytt namn försvinner den gamla förekomsten.

Print... Skriver ut en fil. Funktionen startar ett program som har en installerad skrivar-drivrutin att skriva ut med, som exempelvis en webbläsare.

Exit: Avslutar Thommy och återgår till operativsystemet. Skulle något program vara osparat kommer du att tillfrågas om du vill spara det.

Högerklicka i Files-vyn ger en ruta kallad Create new file. Du får namnge filen och den hamnar som en ny tom flik i programredigeraren. Det är en sammanslagning av New och Save as.

31.1.2. Edit-menyn – funktioner för textredigering Edit-menyn gäller bara i programredigeraren och kan också kallas fram genom att höger-klicka i denna vy.

Undo: Ångrar senaste åtgärden, som att radera eller flytta en programsats, ett nyckelord eller en variabel.

Redo: Sätter tillbaka det du nyss ångrade.

Cut, Copy, Paste: Det vanliga, klipp ut, kopiera eller klistra in den markerade texten.

Select all: Markerar all text i programredigeraren.

Page 315: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LATHUND TILL THONNY

RÄKNA MED PYTHON 313

Comment out, Uncomment: Om du tillfälligtvis vill ta bort en sats ur programmet för att prova hur det fungerar utan den, kan du kommentera bort den, alltså göra om den till en kommentar genomnatt sätta in kommentartecknen ## i början av den markerade ra-den med Comment out. När du ångrat dig, tar du bort kommentartecknen med Un-comment. Du kan naturligtvis sudda ## med delete-tangenten också. Det fungerar lika bra.

Toggle comment: Fungerar som föregående kommandon, men växlar mellan kommen-terad och icke kommenterad sats.

Auto-complete: Tar fram en liten listruta med de vanligaste fortsättningarna på den sats du just börjat på. Ett tryck på Ctrl-mellanslag gör samma sak. Navigera i listan med upp-åt- och nedåtpilarna och välj med Enter. Det hjälper dig att undvika stavfel på de reserve-rade orden.

Find & Replace: Sök och byt en text i programmet. Du kan välja sökritning och om sök-ningen ska bry sig om gemener och versaler eller acceptera all varianter (PRINT, print, Print).

Clear shell: Tömmer terminalvyn. Enbart ett kosmetiskt kommando, om du vill ha en snyggare terminalvy utan eventuella felmeddelanden. Det kommer nog fler, ska du se.

31.1.3. View-menyn – hantering och organisation av fönstren AST: Visar (eller stänger) AST-vyn (Abstract Syntax Tree) som ger en närmare titt på grammatiken.

Assistant: Visar (eller stänger) Assistant-vyn, som ger en närmare förklaring av olika typer av fel och dessutom ger genvägar ut på Internet.

Exception: Visar (eller stänger) Exception-vyn, som förklarar olika undantag, allvarliga programfel som kan uppkomma. Du kan också visa de programsatser i bakomliggande pythonprogram eller bibliotek som stött på felet.

Files: Visar (eller stänger) Files-vyn med katalogträdet på din disk eller nätverkskatalog.

Heap: Visar (eller stänger) Heap-vyn som visar hur programmet ligger i datorns minne.

Help: Visar (eller stänger) Help-vyn, där mycket enkel hjälpinformation kan visas med Help > Help contents.

Notes: Visar (eller stänger) Notes-vyn som är ett textfönster där du kan skriva egna min-nesanteckningar kring arbetet i Thonny. Anteckningarna är inte kopplade till någon python-fil utan finns kvar i Notes-fönstret varje gång du öppnar Thonny.

Object inspector: Visar (eller stänger) Object inspector med noggrann information om varje variabel och funktion.

Outline: Visar (eller stänger) Outline-vyn som visar en översikt av alla funktioner.

Shell: Visar (eller stänger) terminalvyn, där du kommunicerar med direkt med python-tolken.

Stack: Visar (eller stänger) Stack-vyn som används för djupgående felsökning, lite för djupgående för denna bok.

Variables: Visar (eller stänger) variabelvyn där du får direkt information om alla de va-riabler som används i programmet. Klickar du på en variabel, visas ytterligare informa-tion i Object inspector, om denna vy är öppen.

Page 316: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LATHUND TILL THONNY

RÄKNA MED PYTHON 314

Increase, decrease font size: Gör större eller mindre skrivtecken i vyerna. Du kan själv anpassa teckenstorleken efter ditt behag.

Focus editor, shell: Sätter markören i programredigeraren respektive terminalvyn. Det-samma åstadkoms genom att du klickar i respektive vy.

31.1.4. Run-menyn – körning och avlusning av program Run current script: Körkommandot. Kör det program som ligger på den främsta fliken i programredigeraren.

Debug current script (nicer): Avlusningskommandot som du normalt ska använda. Börjar avlusning av det program som ligger på den främsta fliken i programredigeraren. För att detta ska fungera måste programmet vara körbart, alltså fritt från syntaktiska fel.

Debug current script (faster): Ett mindre nogräknat avlusningskommando som inte går på djupet i varje programsats utan bara visar programmets flöde.

Debug current script (birdseye): Ett avlusningskommando som kräver installation av en yttre avlusare.

Step over: Avlusaren kör det markerade kodblocket och hoppar vidare till nästa, utan att gå in på detaljer.

Step into: När avlusaren markerat ett kodblock kan du välja Step into för att börja ana-lysera detaljerna i blocket. Detta är det normala stegningskommandot vid avlusning.

Step out: Om du använt Step into och är mitt i avlusningen av en sats, men vill komma vidare kan du välja Step out för att komma vidare till nästa sats.

Resume: Avslutar avlusningen och kör programmet till slut.

Run to cursor: I avlusningsläge körs programmet fram till den rad där markören står, för vidare avlusning. Snabbspolning framåt.

Step back: Backar avlusningen en programsats.

Run current script in terminal: Kör python-programmet men matar ut utskrifterna i Windows terminalfönster cmd.exe, det som på andra ställen i Thonny kallas System shell eller DOS-fönster, istället för i terminalvyn.

Dock user windows: (av/på) Om du använder Turtle graphics för grafik, kan detta kom-mando få Turtle-fönstren att bli kvar främst på skärmen, så att du kan redigera pro-grammet och se resultatet samtidigt.

Pygame zero mode: (av/på) Byter driftläge så att du kan skriva och köra Pygame Zero-program.

Stop/restart backend: Samma som stopp-ikonen, sätter ovillkorligen stopp för skenan-de program.

Interrupt execution: Stoppalternativet som bara stannar programmet utan att tömma variablerna.

31.1.5. Device-menyn Device-menyn används för styrning av externa enheter som drivs med programspråket MicroPython. Hantering av externa enheter kräver ett antal insticksmoduler som levera-ras med i Thonny 3.0 och senare. Med denna meny kan du mata ut ett python-program till den externa enheten, eller undersöka vilka python-programn som finns i den, alternativt starta och stoppa den externa enheten. PocketBeagle som anv’nds i boken Digitalslöjd är inte en sådan enhet.

Page 317: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

LATHUND TILL THONNY

RÄKNA MED PYTHON 315

31.1.6. Tools-menyn – inställningar i miljön Manage packages... Öppnar en dialogruta där du kan undersöka dina packages, se ver-sioner, installera flera etc.

Open system shell... I Windows öppnar detta alternativ den inbyggda MS-DOS-tolken, DOS-fönstret, eller kommandotolken cmd.exe.

Export usage logs... Matar ut loggfilen för all felsökning du gjort detta arbetspass.

Clean up Thonny 2.1 data folder... Versioner av Thonny före version 3 installerades i en annan katalog på hårddisken. Denna används inte längre och kan tömmas med detta menyalternativ. för att spara plats på disken. Har du ingen tidigare verison av Thonny kan du bortse från detta.

Open Thonny program folder... Öppnar en utforskare som visar var Thonny är instal-lerat.

Open Thonny data folder... Öppnar en utforskare som visar Thonnys interna datafiler.

Manage plug-ins... Visar de insticksmoduler som finns tillgängliga för import och hur de är beroende av varandra.

Options... Öppnar en dialogruta med fyra flikar där du kan ange grundläggande alterna-tiv för visningen i Thonny. Ett alternativ du definitivt ska slå på är Show line numbers på Editor-fliken så att du får radnummer i programredigeraren. Det är ovärderligt vid felsökning.

Under fliken Theme & font kan du dessutom välja olika färgteman, allt från nattsvart till antikt sepia, och olika teckensnitt och storlekar i fönstren. Det kan vara viktgit för den med nedsatt syn att välja ett extra tydligt teckensnitt och ange extra höga kontraster.

31.1.7. Help-menyn – hjälp- och versionsinformation Help contents: Öppnar Help-vyn, med mycket grundläggande hjälptext om körning och avlusning. Om du stängt Help-vyn i View-menyn, öppnas den igen.

Version history: Öppnar en webbläsare och hämtar en sida från github.com som visar hela utvecklings- och ändringshistoriken för Thonny. Där kan du också se vilka fel som åtgärdats i programmet.

Report problems: Öppnar en webbläsare och hämtar en sida från github.com där du kan logga in och berätta för programutvecklarna om problem du stött på med Thonny.

About Thonny: Visar bland annat vilken version av Thonny du använder. Du ska inte ha en version äldre än 3.1 som släpptes 2018.

Page 318: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

BILAGOR

RÄKNA MED PYTHON 316

32. Bilagor

URL:erna till alla dessa bilagor finns under sina respektive underrubriker, under huvud-rubriken Referensavdelning på http://huvudrutin.se/index.php/lankar

32.1. Läs mer på Wikipedia

Wikipedia är en utmärkt källa till teknisk kunskap. Läs mer om fibonaccitalen, olika tal-system, siffrornas historia, slumptal enligt Mersenne-Twister, äldre talsystem och få SI-systemet i sammanfattning.

32.2. Om Huvudrutin AB

Allmän information om förlaget: http://huvudrutin.se

32.3. Om Python

Du kan göra fantastiska stordåd med Python, men det är viktigt att du känner till alla detaljer. Läs mer om avrundningsfel, beskrivning av Python, dokumentation på engelska, exceptions, förenklande funktioner, förenkling i symbolisk matematik, historik kring Python, Matplotlib allmänt, Matplotlib dokumentation, Matplotlib setp()-funktionen, NumPy, Random-funktionen, reserverade ord, SciPy, Secrets-funktionen, skiftlägets be-tydelse, SymPys diagramritarrutiner och tabellritare i textform.

32.4. Om Thonny

Thonnys hem på Internet med installaitonsinstruktioner: http://thonny.org.

Thonny är för närvarande på engelska, men det finns planer på att skapa en svensksprå-kig version. Vissa standardtexter i Thonny kan ändå vara på svenska, eftersom de kom-mer från det underliggande operativsystemet.

32.5. Om versionshantering

Versionshantering utförs med versionssystemen Git eller Subversion.

32.6. Om SQL och databaser

Här kan du läsa allt om relationsdatabaser, Structured_Query_Language (SQL) och ta till dig kurser i SQL.

32.7. Om Internet

Internet är mycket komplexare än du någonsin trott. Här finns artiklar om Internets uppbyggnad, Internet i Sverige, hur Internet överlever tack vare redundansen, hur och varför du ska ta din realtid från de svenska atomklockorna och slutligen allt hur man bygger upp ett nationellt optiskt stamnät i detalj. Det kommer att ta dig månader att läsa. Mycket nöje.

Page 319: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

BILAGOR

RÄKNA MED PYTHON 317

32.8. Om IT-hot

Ingen är särskilt medveten om eller intresserad av de IT-hot och den cyberbrottslighet som drabbar i stort sett alla företag, skolor och organisationer numera. Här tar vi upp hur de trojanska hästarna sprider sig i organisationerna, och i Sunets IT-säkerhetshandbok kan du läsa om vad du ska göra för att undvika hoten.

32.9. Bildförteckning

Foton i denna bok har följande upphovsmän.

Caroline Hayenhjelm ...................................................... 22, 27, 36, 41, 45, 60, 72, 88, 93, 250 Elwood Overholt ............................................................................................................. 85, 264

ArkDes ............................................................................................................................... 298 Guido van Rossum .................................................................................................................... 9 Jörgen Städje........................................... 30, 40, 48, 56, 63, 105, 106, 131, 176, 236, 257, 274 NASA ..................................................................................................................................... 281 Thord Nilson ................................................................................................................. 284, 285 All grafik, alla flödesschemor, principskisser, diagram och skärmbilder är gjorda av Jörgen Städje.

Clip Art: Corel Corporation 1997, ”free to use, modify and publish”.

Page 320: från AB Provexemplar Huvudrutin 079-0770292huvudrutin.se/wp-content/uploads/2019/04/RmP-20190410.pdf · 16.3. Övningar på CSV-filer 181 17. IX Arbeta med SQL-databaser .....182

Provex

empla

r från

Huvud

rutin

AB

079-0

7702

92

Räkna med Python

Huvudrutin ABISBN 978-91-639-8043-5

Programmering är inte bara roligt och spännande, utan öppnar också oanade möjligheter att utforska vad som händer inom matematik. Räkna med Python vägleder dig in i programmeringsspråket Python och introducerar olika matematik-verktyg.

Den ligger till grund för boken Digitalslöjd, som riktas mot teknikämnet.

Författaren Jörgen Städje har skrivit denna bok tillsammans med programmeraren Cecilia Widell.