<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki.math.se/wikis/dd100n_0701/skins/common/feed.css?42b"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>Programmeringsteknik - Nya sidor [sv]</title>
		<link>http://wiki.math.se/wikis/dd100n_0701/index.php/Special:Newpages</link>
		<description>Programmeringsteknik</description>
		<language>sv</language>
		<generator>MediaWiki 1.9.3</generator>
		<lastBuildDate>Wed, 13 May 2026 02:54:12 GMT</lastBuildDate>
		<item>
			<title>FAQ</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/FAQ</link>
			<description>&lt;p&gt;Sammanfattning: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==FAQ==&lt;br /&gt;
&lt;br /&gt;
# '''Jag vill inte ha ny rad mellan min utskrifter. SVAR''': Skriv ett komma(,) efter print-satsen, t ex &amp;lt;code&amp;gt;print &amp;quot;Strumpor och&amp;quot;,&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Felmeddelandet &amp;quot;TypeError: cannot concatenate 'str' and 'int' objects&amp;quot; SVAR''': Om du skriver ut både strängar och tal i samma print-sats kan du behöva konvertera talen till strängar: &amp;lt;code&amp;gt;print frukten + &amp;quot; kostar &amp;quot; + str(pris)&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Hur gör man formatterad utskrift? SVAR''': Exempel: &lt;br /&gt;
#:&amp;lt;pre&amp;gt;&lt;br /&gt;
#:print &amp;quot;      Sko      Storlek    Pris&amp;quot;&lt;br /&gt;
#:print &amp;quot;%10s%8i%12.2f&amp;quot;%(skonamn,storlek,pris)&lt;br /&gt;
#:&amp;lt;/pre&amp;gt; &lt;br /&gt;
#:Här är skonamn en sträng som skrivs ut i tio positioner (%10s), storlek ett heltal som skrivs ut i åtta positioner (%8i) och pris ett flyttal som skrivs ut i tolv positioner med två decimaler (%12.2f). Dokumentation finns på [http://docs.python.org/lib/typesseq-strings.html]&lt;br /&gt;
# '''Felfönstret &amp;quot;Already executing&amp;quot; dyker upp. SVAR''': När du kör program från IDLE tänk på att avbryta en gammal körning (t ex med ctrl+c) innan du kör programmet igen.&lt;br /&gt;
# ''' En if-sats fungerar inte. SVAR''': Tänk på att använda rätt datatyper. En sträng med en etta &amp;quot;1&amp;quot; är inte samma som heltalet 1. Om du läst in rader från en fil och jämför med dem i if-satsen kan problemet vara ett &amp;quot;\n&amp;quot; sist i den inlästa raden som måste städas bort med &amp;lt;code&amp;gt;raden.strip()&amp;lt;/code&amp;gt;&lt;br /&gt;
# '''Felmeddelandet &amp;quot;invalid_syntax&amp;quot; SVAR''': Om du inte ser felet direkt kan det vara raden innan som är fel.&lt;br /&gt;
## Har du glömt kolon(:) på raden innan om du använder if, while eller for?&lt;br /&gt;
## Har du tabbat in raderna efter kolon?&lt;br /&gt;
## Saknas ett citattecken, en parentes &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt; eller en klammer &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt; på raden innan?&lt;br /&gt;
## Kolla tabbar, även kommentarer med tre &amp;lt;code&amp;gt;'&amp;lt;/code&amp;gt;-tecken måste tabbas rätt! Matcha med det stycke ovan som ska ha samma intabbning. 	&lt;br /&gt;
## Python har rätt, det finns ett fel någonstans!&lt;br /&gt;
# ''' &amp;quot;None&amp;quot; skrivs ut på skärmen. SVAR''': En funktion utan return-sats returnerar None. Troligen har du råkat anropa en sån funktion i en print-sats, t ex &amp;lt;code&amp;gt;print skriv_ut()&amp;lt;/code&amp;gt; Lösningen är att anropa funktionen utan print (eller låta funktionen returnera den sträng som ska skrivas ut).&lt;br /&gt;
# ''' Nyckeln jag söker efter i en dictionary fungerar inte. SVAR''': Om du läst in nycklarna från en fil kan problemet vara ett &amp;quot;\n&amp;quot; sist i den inlästa raden som måste städas bort med &amp;lt;code&amp;gt;raden.strip()&amp;lt;/code&amp;gt;&lt;br /&gt;
# ''' När jag läst in en rad från fil och skriver ut den på skärmen så skrivs en extra tomrad ut. SVAR''': Varje rad du läser in från filrn har ett radbrytningtecken &amp;quot;\n&amp;quot; i slutet. Du får enklast bort detta genom att på varje rad du läser från filen använda funktionen strip(). I stället för: &amp;lt;code&amp;gt;raden = filen.readline()&amp;lt;/code&amp;gt; skriver du: &amp;lt;code&amp;gt;raden = filen.readline.strip()&amp;lt;/code&amp;gt; &lt;br /&gt;
# '''När jag läser in filen så läses inget in, men det har fungerat förut. SVAR''': Kontrollera att filen finns. Öppna filen (med t ex WordPad) och kolla så den innehåller något. Spara och stäng filen igen.&lt;br /&gt;
# '''Jag använder sys.exit() för att avbryta programmet, men då får jag en massa röd text i IDLE. SVAR''': Lägg in en &lt;br /&gt;
#:&amp;lt;pre&amp;gt;&lt;br /&gt;
#:try: ... except SystemExit:&lt;br /&gt;
#:&amp;lt;/pre&amp;gt; &lt;br /&gt;
#:runt ditt anrop av main så slipper du den röda texten.&lt;br /&gt;
# '''Jag har skrivit en klass och får felmeddelandet &amp;quot;NameError: global name 'namn' is not defined&amp;quot; SVAR''': Har du kommit ihåg att skriva &amp;lt;code&amp;gt;self&amp;lt;/code&amp;gt; framför alla förekomster av dina attribut?&lt;br /&gt;
# '''Jag försöker skriva ut en rad streck med en slinga, men får mellanslag mellan varje tecken, så här - - -, istället för det jag vill ha ---. Hur ska jag göra för att Python inte ska lägga in mellanslagen automatiskt? SVAR''': I modulen sys finns en variabel som inför varje print håller reda på om ett mellanslag ska skrivas ut eller inte. Man kan själv ställa om variabeln så här:&lt;br /&gt;
::&amp;lt;pre&amp;gt;&lt;br /&gt;
::import sys&lt;br /&gt;
::for i in range(5): &lt;br /&gt;
:::print &amp;quot;-&amp;quot;,&lt;br /&gt;
:::sys.stdout.softspace = False&amp;lt;/pre&amp;gt;&lt;/div&gt;</description>
			<pubDate>Fri, 29 Jun 2007 14:16:06 GMT</pubDate>			<dc:creator>KTH.SE:u1ndpe5c</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:FAQ</comments>		</item>
		<item>
			<title>10. P-uppgift: redovisning</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/10._P-uppgift:_redovisning</link>
			<description>&lt;p&gt;Sammanfattning: /* Redovisning */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Redovisning==&lt;br /&gt;
&lt;br /&gt;
''P-uppgiften är individuell och får inte lösas i grupp.''&lt;br /&gt;
&lt;br /&gt;
När du är godkänd på samtliga moment på kursen (sex tester och sex &lt;br /&gt;
inlämningsuppgifter) är det dags att lämna in det färdiga programmet &lt;br /&gt;
som görs på vanligt sätt under rubriken &amp;quot;P-uppgift Slutinlämning&amp;quot;. &lt;br /&gt;
Glöm inte bort att skicka med alla filer till programmet dvs även &lt;br /&gt;
text-filer. Du kontaktas därefter för att bestämma datum för den &lt;br /&gt;
muntliga redovisningen som görs på KTH i Stockholm.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Under redovisningen är det du som ska visa vad och hur du har gjort &lt;br /&gt;
för att lösa uppgiften och du ska också kunna motivera dina val. &lt;br /&gt;
Naturligtvis avnjuter vi också en provkörning av programmet med all &lt;br /&gt;
möjlig och omöjlig indata.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Granskningen kontrolleras vid samma tillfälle så den behöver ej vara &lt;br /&gt;
godkänd innan redovisningen.&lt;br /&gt;
&lt;br /&gt;
Glöm ej att ta med legitimation. Tänk också på att tiderna är &lt;br /&gt;
ungefärliga så ni kan få vänta något.&lt;/div&gt;</description>
			<pubDate>Wed, 27 Jun 2007 14:52:46 GMT</pubDate>			<dc:creator>KTH.SE:u1ndpe5c</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:10._P-uppgift:_redovisning</comments>		</item>
		<item>
			<title>9. P-uppgift: granskning</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/9._P-uppgift:_granskning</link>
			<description>&lt;p&gt;Sammanfattning: /* Inlämningsuppgift: granskning */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Granskning==&lt;br /&gt;
&lt;br /&gt;
Innan det färdiga programmet kan redovisas för en handledare ska det testas (granskas) av en kurskamrat. Vid testen ska din granskare kritiskt granska ditt program, testköra det och fylla i ett granskningsprotokoll. Denna granskning är ett obligatoriskt moment. (Varje kursdeltagare måste granska en uppgift, och alla uppgifter som ska redovisas måste granskas först.) Syftet med granskningen är att du genom att kritiskt granska en annans program ska få en ökad förståelse för hur man ska (och inte ska) programmera.&lt;br /&gt;
&lt;br /&gt;
Här är granskningsprotokollet som ni ska fylla i. Förklaringar till de olika punkterna finns lite längre ned på den här sidan.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Namn: &lt;br /&gt;
Födelsedag: &lt;br /&gt;
Uppgift: &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Användarvänlighet&lt;br /&gt;
&lt;br /&gt;
_ Informativa utskrifter / lättbegripligt grafiskt gränssnitt&lt;br /&gt;
_ Enkel inmatning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Programmerarvänlighet&lt;br /&gt;
&lt;br /&gt;
_ Vettiga namn&lt;br /&gt;
_ Kommentarer&lt;br /&gt;
_ Konsekvent språk&lt;br /&gt;
_ Konsekvent typografi&lt;br /&gt;
_ Felhantering&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Strukturering&lt;br /&gt;
&lt;br /&gt;
_ Lämplig uppdelning i funktioner&lt;br /&gt;
_ Lämplig uppdelning i klasser (ej obligatoriskt)&lt;br /&gt;
_ Temporära variabler så lokalt som möjligt&lt;br /&gt;
_ Återanvändbara funktioner/klasser&lt;br /&gt;
_ In- och utdata till funktioner&lt;br /&gt;
_ Flexibelt/utbyggbart program&lt;br /&gt;
_ Ingen kodupprepning&lt;br /&gt;
_ Ingen hårdkodning&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Följande punkter är nödvändiga (måste alltid åtgärdas)&lt;br /&gt;
&lt;br /&gt;
_ Uppfyller kraven i lydelsen&lt;br /&gt;
_ Detaljförståelse&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Granskare: &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Användarvänlighet===&lt;br /&gt;
&lt;br /&gt;
====Informativa utskrifter====&lt;br /&gt;
Programmet ska tala om för användaren vad programmet gör i varje steg och vad för inmatning som förväntas. Ett dåligt exempel kan se ut så här.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Ge tal1  : 26&lt;br /&gt;
och tal2 : 54&lt;br /&gt;
29 31 37 41 43 47 53&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man ska inte behöva titta i en manual eller ännu värre, i själva programkoden för att förstå vad som händer. Programmet måste vara självinstruerande.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Hej och välkommen till primtalsprogrammet. Programmet&lt;br /&gt;
skriver ut alla primtal i ett intervall du definierar.&lt;br /&gt;
&lt;br /&gt;
Ange undre gränsen i intervallet: 26&lt;br /&gt;
Ange högre gränsen i intervallet: 54&lt;br /&gt;
De primtal som finns mellan 26 och 54 är:&lt;br /&gt;
29 31 37 41 43 47 53&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den senare varianten är mycket lättare att förstå när man kör programmet.&lt;br /&gt;
&lt;br /&gt;
====Enkel inmatning====&lt;br /&gt;
&lt;br /&gt;
Inmatningen ska inte vara onödigt krånglig.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;...&lt;br /&gt;
Vill du boka en biljett?ja&lt;br /&gt;
Varifrån åker du? Arlanda&lt;br /&gt;
Vart ska du åka? Kastrup&lt;br /&gt;
Vilken månad ska du åka? Mars&lt;br /&gt;
Vilken dag ska du åka? 25&lt;br /&gt;
Vill du boka returbiljett?ja&lt;br /&gt;
Vilken månad ska du tillbaka? April&lt;br /&gt;
Vilken dag ska du tillbaka? 5&lt;br /&gt;
Det går tyvärr inget flyg den 25 mars.&lt;br /&gt;
Försök igen&lt;br /&gt;
&lt;br /&gt;
Vill du boka en biljett?ja&lt;br /&gt;
Varifrån åker du? Arlanda&lt;br /&gt;
Vart ska du åka? Kastrup&lt;br /&gt;
Vilken månad ska du åka? Mars&lt;br /&gt;
...&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Förutom att vara väldigt sen med att kläcka ur sig att det inte finns något flyg den önskade resdagen så verkar det inte finnas något sätt att boka en mängd biljetter. Att boka en klassresa med det systemet skulle vara väldigt enerverande.&lt;br /&gt;
&lt;br /&gt;
===Programmerarvänlighet===&lt;br /&gt;
&lt;br /&gt;
====Vettiga namn====&lt;br /&gt;
&lt;br /&gt;
Programmet ska ha intuitiva namn på variablerna. För den som skrivit programmet är allt självklart, men inte för andra.&lt;br /&gt;
&lt;br /&gt;
Nedanstående programkod är ganska svår att tyda&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;namn = 0&lt;br /&gt;
kalle = 0&lt;br /&gt;
while kalle &amp;lt; len(pelle):&lt;br /&gt;
    if pelle[kalle] &amp;gt; namn:&lt;br /&gt;
        namn = pelle[kalle]&lt;br /&gt;
    kalle = kalle + 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Här följer samma kod med andra variabelnamn.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;max = 0&lt;br /&gt;
i = 0&lt;br /&gt;
while i &amp;lt; len(lista):&lt;br /&gt;
    if lista[i] &amp;gt; max:&lt;br /&gt;
         max = lista[i]&lt;br /&gt;
    i = i + 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man ser nu lättare vad koden gör, nämligen sparar undan det högsta värdet i listan till variablen max. Fortfarande är inte namnet på listan optimalt. Vad för slags värden innehåller den? Är det löner, skottstatistik eller vad?&lt;br /&gt;
&lt;br /&gt;
När det gäller en funktion eller metod brukar ett bra namn oftast vara ett verb som beskriver vad den gör eller vad den returnerar. Booleska funktioner (som returnerar True/False) bör ha ett namn som talar om hur läget är det fall den returnerar True.&lt;br /&gt;
&lt;br /&gt;
Namnet på en klass kan vara ett substantiv som beskriver vad objektet representerar. Variabler och är också substantiv.&lt;br /&gt;
&lt;br /&gt;
Att komma på bra namn kräver en del arbete!&lt;br /&gt;
&lt;br /&gt;
====Kommentarer====&lt;br /&gt;
&lt;br /&gt;
Alla klasser och funktioner måste kommenteras. Syftet med klassen/funktionen ska framgå. Det ska räcka att läsa kommentaren för att förstå hur en funktion ska användas (man ska inte behöva sätta sig in i hela koden).&lt;br /&gt;
&lt;br /&gt;
För att kunna förstå och sätta sig in i hur en klass fungerar är det särskilt viktigt att man förklarar och kommenterar alla attribut (klassvariabler) som används i klassen.&lt;br /&gt;
&lt;br /&gt;
In- och utdata till funktioner måste kommenteras. Det gäller både returvärden och&lt;br /&gt;
parametrar. Om funktionen är en metod och den ändrar något attribut ska detta också kommenteras.&lt;br /&gt;
&lt;br /&gt;
Kommentarerna ska inte förklara hur Python fungerar. Förutsättningen är att den som läser källkoden redan vet hur man programmerar. Kommentarer som förklarar t ex att en if-sats gör ett val och att en slinga upprepar något ska inte vara med vid redovisningen. Den som redovisar måste själv veta sådant utan anteckningar.&lt;br /&gt;
&lt;br /&gt;
====Konsekvent språk====&lt;br /&gt;
&lt;br /&gt;
Språkvalet ska vara konsekvent. Alla variabel-, klass- och funktionsnamn på ett språk. Alla kommentarer på ett språk. Det är OK att ha engelska variabel/metodnamn och kommentera på svenska. Undvik svengelska (sejva svenska språket).&lt;br /&gt;
&lt;br /&gt;
====Konsekvent typografi====&lt;br /&gt;
&lt;br /&gt;
Programmet ska ha en genomgående typografi. Namn som är sammansatta av flera ord kan t ex skrivas ihop genom att inleda varje nytt ord med stor bokstav, eller genom att skilja orden åt med understrykning. Variabel- och metodnamn brukar inledas med med liten bokstav och klasser med stor bokstav.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;class EnBraKlass&lt;br /&gt;
def enMetodSomTarTreParametrar(x, y, z)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Felhantering====&lt;br /&gt;
&lt;br /&gt;
Extrauppgiften för betyg C innehåller oftast felhantering, dvs att programmet kan hantera fel som kan uppstå. T ex kan det vara en slinga som upprepar inmatning tills korrekta värden kommer in. Ofta är den bästa lösningen att man skriver en funktion som tar hand om inläsningen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Ange täljare: 1000&lt;br /&gt;
Ange nämnare: 0&lt;br /&gt;
Oj oj, nämnaren får inte vara noll. Försök igen.&lt;br /&gt;
Ange nämnare: 10&lt;br /&gt;
&lt;br /&gt;
1000 delat med 10 blir 100&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kan också behöva lägga till särfall (exceptions) för att ta hand om fel som annars skulle ge felavbrott.&lt;br /&gt;
&lt;br /&gt;
===Strukturering===&lt;br /&gt;
&lt;br /&gt;
====Lämplig uppdelning i klasser====&lt;br /&gt;
&lt;br /&gt;
Data som hör ihop (t ex namn, födelsedata och adressuppgifter för en person) kan samlas genom att dom får vara attribut i en klass. Funktioner som hör ihop kan bli metoder i en klass. Olika klasser för olika uppgifter.&lt;br /&gt;
&lt;br /&gt;
====Lämplig uppdelning i funktioner/metoder====&lt;br /&gt;
&lt;br /&gt;
Bäst är det med specialiserade funktioner som bara gör en sak.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;def lasFranFilen():&lt;br /&gt;
    filnamn = raw_input(&amp;quot;Vad heter filen?&amp;quot;)&lt;br /&gt;
    infil = open(filnamn,&amp;quot;r&amp;quot;)&lt;br /&gt;
    lista = infil.readLines()&lt;br /&gt;
    lista2 = []&lt;br /&gt;
    for element in lista:&lt;br /&gt;
        if type(element) == type(0):&lt;br /&gt;
            lista2.add(element)&lt;br /&gt;
    return lista2&amp;lt;/pre&amp;gt;	&lt;br /&gt;
&lt;br /&gt;
Koden ovan gör flera saker; frågar efter en fil, läser in alla data från filen, stoppar in heltalen i en heltalsvektor och returnerar denna. Det vore bättre att dela upp dessa uppgifter på flera funktioner så att funktionsanropen blir:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;namn = fragaFil()&lt;br /&gt;
fildata = laesFranFil(filnamn)&lt;br /&gt;
intresseantaTal = konvertera(fildata)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programmet blir då mer flexibelt: Funktionen fragaFil kan skrivas om till ett grafiskt GUI där man klickar på rätt fil. Funktionen laesFranFil kan användas i andra sammanhang då man vill läsa från fil. Man kan skicka fildatat till en ny metod som kontrollerar data innan man anropar konvertera.&lt;br /&gt;
&lt;br /&gt;
====Temporära variabler så lokalt som möjligt====&lt;br /&gt;
&lt;br /&gt;
Se till att tillfälliga variabler skapas så lokalt som möjligt. En variabel som bara används inuti en slinga i en metod ska inte vara ett attribut i klassen, utan en lokal variabel i metoden.&lt;br /&gt;
&lt;br /&gt;
====Återanvändbara funktioner/klasser====&lt;br /&gt;
&lt;br /&gt;
En del uppgifter kan delas upp i klasser som går att återanvända i andra program. T ex kan en klass som representerar ett spelkort användas i olika kortspelsprogram.&lt;br /&gt;
&lt;br /&gt;
Funktioner ska om möjligt vara skrivna så att dom går att använda i andra sammanhang. Ett knep är att se till att alla indata ges som parametrar. Ett annat är att specialisera funktionerna, så att varje funktion bara gör en liten del.&lt;br /&gt;
&lt;br /&gt;
====In- och utdata till funktioner====&lt;br /&gt;
&lt;br /&gt;
Var noga med in och utdata till funktionerna. En del funktioner som t.ex. bara skriver ut på skärmen kan vara parameterlösa och inte returnera något. Övriga funktioner bör ha alla indata som parametrar och utdata som returvärden.&lt;br /&gt;
&lt;br /&gt;
====Flexibelt/utbyggbart program====&lt;br /&gt;
&lt;br /&gt;
Skriv ditt program så att det lätt att utöka och bygga ut. Några exempel: I ett program som samlar data om pokemon ska man kunna lägga till fler pokemon utan att gå in och ändra i programmet. Om ett program läser in från fil ska det vara lätt att byta till en annan fil. Om man vill lägga till en beräkning så ska det vara enkelt att stoppa in en funktion för det, utan att behöva ändra på många ställen i programmet.&lt;br /&gt;
&lt;br /&gt;
====Ingen kodupprepning====&lt;br /&gt;
&lt;br /&gt;
Ett vanligt nybörjarfel när man programmerar är att använda taktiken klippa och klistra när samma sak ska göras på flera ställen i programmet. Detta leder dock till kod som är väldigt svår att underhålla. Om man ändrar på ett ställe måste man göra samma ändring på flera parallellställen. Det går i regel att skriva om koden till en funktion med parametrar och returvärde.&lt;br /&gt;
&lt;br /&gt;
====Ingen hårdkodning====&lt;br /&gt;
&lt;br /&gt;
Förekommer talet 5 på flera ställen i programmet? Om man behöver använda siffervärden kan dessa deklareras som konstanter.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ANTALSPELARE = 5;&lt;br /&gt;
PI =3.14;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Följande punkter är nödvändiga (måste alltid åtgärdas för godkänt)===&lt;br /&gt;
&lt;br /&gt;
====Uppfyller kraven i lydelsen====&lt;br /&gt;
&lt;br /&gt;
Programmet måste uppfylla kraven i P-uppgiftslydelsen. Det är inte tillåtet att förenkla uppgiften. Den som vill göra några förändringar måste förankra det med kursledaren först, och kunna visa en bekräftelse (ett ebrev t.ex.) på att kursledaren godkänt kravförändringar.&lt;br /&gt;
&lt;br /&gt;
====Detaljförståelse====&lt;br /&gt;
&lt;br /&gt;
Den som redovisar ska kunna redogöra för alla detaljer i koden, t ex vad variablerna innehåller, vad funktionerna gör och vad som skulle hända om handledaren tog bort en rad ur programmet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inlämningsuppgift: granskning==&lt;br /&gt;
&lt;br /&gt;
Hitta en studiekamrat som har kommit lika långt som du i kursen så att ni kan granska varandras program.&lt;br /&gt;
Använd gärna forumet som heter &amp;quot;Hitta granskare&amp;quot;. Observera att det är obligatoriskt både att granska någon annans program och att få sitt eget program granskat.&lt;br /&gt;
&lt;br /&gt;
Var inte för snäll när du går igenom programmet. Granskningen kan underkännas om du inte ens försökt kritisera programmet som du granskat. Och den som blir granskad är tacksam för alla fel du upptäcker, eftersom dom kan åtgärdas för redovisningen.&lt;br /&gt;
&lt;br /&gt;
Skapa en fil med namnet granskningsprotokoll.txt, klistra in mallen ovan,&lt;br /&gt;
fyll i protokollet (skriv in namn och sätt ett kryss på alla moment som är&lt;br /&gt;
godkända) och lämna in det på vanligt sätt under rubriken &amp;quot;P-uppgift Granskning&amp;quot;.&lt;br /&gt;
Filen måste vara i textformat.&lt;br /&gt;
&lt;br /&gt;
Granskningen kommer att rättas i samband med den muntliga redovisningen slutinlämningen.&lt;/div&gt;</description>
			<pubDate>Wed, 27 Jun 2007 14:52:29 GMT</pubDate>			<dc:creator>KTH.SE:u1ndpe5c</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:9._P-uppgift:_granskning</comments>		</item>
		<item>
			<title>8. P-uppgift: prototyp</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/8._P-uppgift:_prototyp</link>
			<description>&lt;p&gt;Sammanfattning: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Prototyp==&lt;br /&gt;
&lt;br /&gt;
När ditt kodskelett har blivit godkänt så är det dags att börja arbeta med en prototyp av programmet. Prototypen behöver inte implementera all funktionalitet. I biblioteksexemplet har vi valt att starta med inläsning och utskrift till fil. Vi har också lagt till de två första funktionerna i menyn: att söka på titel och att söka på författare.&lt;br /&gt;
&lt;br /&gt;
När man jobbar med att skriva kod så upptäcker man ofta att den ursprungliga kodskelettet måste modifieras. Studera koden i exemplet nedan noggrannt och lägg märke till ändringarna.&lt;br /&gt;
&lt;br /&gt;
* Klassen Bibliotek har bytt namn till Catalog, ett namn som beskriver klassen bättre. Ett objekt av den här klassen representerar ju inte ett helt bibliotek utan bara en bibliotekskatalog.&lt;br /&gt;
&lt;br /&gt;
* Många av metoderna i Catalog-klassen har ändrats. När vi började skriva koden så märkte vi att många av de ursprungliga metoderna i klassen Bibliotek gjorde två helt skilda saker: de gjorde både operationer på biblioteksdatabasen samtidigt som de skötte det textbaserade användargränssnittet. En bättre lösning är att metoderna i klassen Catalog endast hanterar databasoperationerna. Användargränsnittet har vi implementerat separat med hjälp av ett antal funktioner.&lt;br /&gt;
&lt;br /&gt;
* Vi har nu bestämt hur data ska lagras på fil och varit noga med att dokumentera detta i programmet. Denna viktiga information saknades helt i kodskelettet.&lt;br /&gt;
&lt;br /&gt;
* Lägg märke till att det finns en extra utskrift (som inte ska vara med i det färdiga programmet) i huvudprogrammet. Just efter att vi har läst in data från filen och skapat en ny Catalog så skriver vi ut innehållet i listan &amp;lt;code&amp;gt;books&amp;lt;/code&amp;gt;. Den här typen av testutskrifter är mycket användbara för att kolla att programmet fungerar som man har tänkt sig och för att leta efter eventuella fel.&lt;br /&gt;
&lt;br /&gt;
* När vi skrev koden så upptäckte vi ibland att vi upprepade samma kod på flera ställen. Det brukar vara en tydlig indikation på att det är lämpligt att introducera en ny funktion. Ett exempel är hjälpfunktionen &amp;lt;code&amp;gt;are_equal&amp;lt;/code&amp;gt; som kollar om två strängar är lika så när som på små och stora bokstäver samt överflödiga blanktecken i början och slutet av strängarna. Den här funktionen la vi till eftersom samma kod dök upp i de båda funktionerna &amp;lt;code&amp;gt;search_title&amp;lt;/code&amp;gt; och &amp;lt;code&amp;gt;search_author&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Når vi skrev programmet så upptäckte vi att det fanns ett stort antal utskrifter som alla började med blanktecken: &amp;lt;code&amp;gt;print '    text...'&amp;lt;/code&amp;gt;. För att slippa skriva om samma sak, en form av onödig hårdkodning, och för att lättare kunna ändra programmet i framtiden så införde vi istället konstanten &amp;lt;code&amp;gt;INDENT = '   '&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Eftersom vi har planer på att göra extrauppgiften för betyg A, att lägga till ett grafiskt användargränssnitt, så har vi försökt att skilja ut den kod som hanterar kommunikationen till användaren från den kod som hanterar logiken för databasen. På det sättet blir det mycket enklare när vi ska byta ut textgränssnittet mot ett grafiskt gränssnitt. Målet är inte bara att få programmet att fungera, utan också att utforma det på ett sådant sätt att det är lätt att förstå och modifiera i framtiden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# -*- coding: iso8859-1 -*-&lt;br /&gt;
&lt;br /&gt;
# Titel: Bibliotek (prototyp)&lt;br /&gt;
# Författare: Stefan Nilsson&lt;br /&gt;
# Datum: 2007-06-29&lt;br /&gt;
#&lt;br /&gt;
# Det här är ett program för hantering av enklare biblioteksrutiner.&lt;br /&gt;
#&lt;br /&gt;
# Programmet lagrar böckerna i en fil med namnet &amp;quot;bibliotek.txt&amp;quot;&lt;br /&gt;
# mellan körningarna. Varje rad innehåller en bok beskriven på&lt;br /&gt;
# följande format:&lt;br /&gt;
#&lt;br /&gt;
#    &amp;lt;AUTHOR&amp;gt;/&amp;lt;TITLE&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# eller&lt;br /&gt;
#&lt;br /&gt;
#    &amp;lt;AUTHOR&amp;gt;/&amp;lt;TITLE&amp;gt;/Utlånad&lt;br /&gt;
#&lt;br /&gt;
# om boken är utlånad. Exempel på datafil:&lt;br /&gt;
#&lt;br /&gt;
#    Bälter/Programmeringsteknik med Python/Utlånad&lt;br /&gt;
#    Bälter/Pythonvetaren&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------  En klass som beskriver en bok.  --------&lt;br /&gt;
# Attribut:&lt;br /&gt;
#    author - namnet på författaren&lt;br /&gt;
#    title - bokens titel&lt;br /&gt;
#    isBorrowed - en variabel som är True om boken är utlånad.&lt;br /&gt;
#&lt;br /&gt;
class Book:&lt;br /&gt;
    # Skapar en ny bok.&lt;br /&gt;
    def __init__(self, author, title):&lt;br /&gt;
        self.author = author&lt;br /&gt;
        self.title = title&lt;br /&gt;
        self.isBorrowed = False&lt;br /&gt;
&lt;br /&gt;
    # Returnerar en sträng som beskriver boken.&lt;br /&gt;
    # Format: &amp;lt;author&amp;gt;: &amp;lt;title&amp;gt; (utlånad)&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        author_and_title = self.author + ': ' + self.title&lt;br /&gt;
        if self.isBorrowed:&lt;br /&gt;
            return author_and_title + ' (utlånad)'&lt;br /&gt;
        else:&lt;br /&gt;
            return author_and_title&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------  En klass som beskriver en bibliotekskatalog.  --------&lt;br /&gt;
# Attribut:&lt;br /&gt;
#    books - en lista som innehåller samtliga böcker.&lt;br /&gt;
#&lt;br /&gt;
class Catalog:&lt;br /&gt;
    # Skapar en bibliotekskatalog med de böcker som finns i filen.&lt;br /&gt;
    def __init__(self, filename):&lt;br /&gt;
        self.books = list()&lt;br /&gt;
        file = open(filename, 'rU')&lt;br /&gt;
        for line in file:&lt;br /&gt;
            parts = line.strip().split('/')&lt;br /&gt;
            if (len(parts) &amp;gt;= 2):&lt;br /&gt;
                book = Book(parts[0], parts[1])&lt;br /&gt;
                if len(parts) == 3:&lt;br /&gt;
                    book.isBorrowed = True&lt;br /&gt;
                self.books.append(book)&lt;br /&gt;
        file.close()&lt;br /&gt;
&lt;br /&gt;
    # Sparar hela bibliotekskatalogen i en fil.&lt;br /&gt;
    def save(self, filename):&lt;br /&gt;
        file = open(filename, 'wU')&lt;br /&gt;
        for book in self.books:&lt;br /&gt;
            file.write(book.author + '/' + book.title)&lt;br /&gt;
            if book.isBorrowed:&lt;br /&gt;
                file.write('/Utlånad')&lt;br /&gt;
            file.write('\n')&lt;br /&gt;
        file.close()&lt;br /&gt;
&lt;br /&gt;
    # Returnerar boken om den finns, annars None.&lt;br /&gt;
    # Skiljer inte på små och stora bokstäver.&lt;br /&gt;
    def find_title(self, title):&lt;br /&gt;
        for book in self.books:&lt;br /&gt;
            if are_equal(title, book.title):&lt;br /&gt;
                return book&lt;br /&gt;
        return None&lt;br /&gt;
&lt;br /&gt;
    # Returnerar en lista på böcker av en viss författare.&lt;br /&gt;
    # Return en tom lista om det inte finns några böcker.&lt;br /&gt;
    # Skiljer inte på stora och små bokstäver.&lt;br /&gt;
    def find_author(self, author):&lt;br /&gt;
        book_list = list()&lt;br /&gt;
        for book in self.books:&lt;br /&gt;
            if are_equal(author, book.author):&lt;br /&gt;
                book_list.append(book)&lt;br /&gt;
        return book_list&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------  Hjälpfunktioner  --------&lt;br /&gt;
    &lt;br /&gt;
# Returnerar True om s1 och s2 är lika.&lt;br /&gt;
# Skiljer inte på små och stora bokstäver och tar bort&lt;br /&gt;
# eventuella blanktecken i början och slutet av strängen.&lt;br /&gt;
def are_equal(s1, s2):&lt;br /&gt;
    return s1.strip().upper() == s2.strip().upper()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------  Funktioner för textgränssnitt  --------&lt;br /&gt;
&lt;br /&gt;
INDENT = '  ' # Tomma tecken i början av indragna rader&lt;br /&gt;
&lt;br /&gt;
# Skriver ut valmenyn.&lt;br /&gt;
def print_menu():&lt;br /&gt;
    print INDENT, 'T  söka på Titel.'&lt;br /&gt;
    print INDENT, 'F  söka på Författare.'&lt;br /&gt;
    print INDENT, 'L  Låna bok.'&lt;br /&gt;
    print INDENT, 'Å  Återlämna bok.'&lt;br /&gt;
    print INDENT, 'N  lägga in Ny bok.'&lt;br /&gt;
    print INDENT, 'B  ta Bort bok.'&lt;br /&gt;
    print INDENT, 'A  lista Alla böcker.'&lt;br /&gt;
    print INDENT, 'S  Sluta.'&lt;br /&gt;
&lt;br /&gt;
# Läser in och returnerar första bokstaven i användarens val.&lt;br /&gt;
# Omvandlar liten bokstav till stor.&lt;br /&gt;
def choose():&lt;br /&gt;
    choice = raw_input('Vad vill du göra? ')&lt;br /&gt;
    return choice[0].upper()&lt;br /&gt;
&lt;br /&gt;
# Söker på titel.&lt;br /&gt;
def search_title(catalog):&lt;br /&gt;
    title = raw_input('Vilken titel vill du söka efter? ')&lt;br /&gt;
    book = catalog.find_title(title)&lt;br /&gt;
    if (book == None):&lt;br /&gt;
        print INDENT, 'Hittade ingen bok med den titeln.'&lt;br /&gt;
    else:&lt;br /&gt;
        print INDENT, book&lt;br /&gt;
&lt;br /&gt;
# Söker på författare.&lt;br /&gt;
def search_author(catalog):&lt;br /&gt;
    author = raw_input('Vilken författare vill du söka efter? ')&lt;br /&gt;
    book_list = catalog.find_author(author)&lt;br /&gt;
    if len(book_list) == 0:&lt;br /&gt;
        print INDENT, 'Hittade inga böcker av den författaren.'&lt;br /&gt;
    else:&lt;br /&gt;
        print INDENT, 'Hittade', len(book_list), 'böcker'&lt;br /&gt;
        for book in book_list:&lt;br /&gt;
            print INDENT, book&lt;br /&gt;
&lt;br /&gt;
# Lånar en bok.&lt;br /&gt;
def borrow_book(catalog):&lt;br /&gt;
    return&lt;br /&gt;
&lt;br /&gt;
# Återlämnar en bok.&lt;br /&gt;
def return_book(catalog):&lt;br /&gt;
    return&lt;br /&gt;
&lt;br /&gt;
# Lägger till en ny bok.&lt;br /&gt;
def add_book(catalog):&lt;br /&gt;
    return&lt;br /&gt;
&lt;br /&gt;
# Tar bort en bok.&lt;br /&gt;
def delete_book(catalog):&lt;br /&gt;
    return&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------  Huvudprogram  --------&lt;br /&gt;
&lt;br /&gt;
print 'Välkommen till biblioteksprogrammet!'&lt;br /&gt;
&lt;br /&gt;
FILENAME = 'bibliotek.txt'&lt;br /&gt;
catalog = Catalog(FILENAME)&lt;br /&gt;
&lt;br /&gt;
# Testutskrift&lt;br /&gt;
print 'Antal böcker:', len(catalog.books)&lt;br /&gt;
for book in catalog.books:&lt;br /&gt;
    print book&lt;br /&gt;
&lt;br /&gt;
print_menu()&lt;br /&gt;
&lt;br /&gt;
choice = choose();&lt;br /&gt;
while choice != 'S':&lt;br /&gt;
    if choice == 'T':&lt;br /&gt;
        search_title(catalog)&lt;br /&gt;
    if choice == 'F':&lt;br /&gt;
        search_author(catalog)&lt;br /&gt;
    choice = choose()&lt;br /&gt;
&lt;br /&gt;
catalog.save(FILENAME)&lt;br /&gt;
&lt;br /&gt;
print INDENT, 'Välkommen åter!'&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inlämningsuppgift: prototyp==&lt;br /&gt;
&lt;br /&gt;
Skriv en prototyp till din P-uppgift och lämna in den på vanligt sätt under rubriken &amp;quot;P-uppgift Prototyp&amp;quot;.&lt;/div&gt;</description>
			<pubDate>Wed, 27 Jun 2007 14:51:57 GMT</pubDate>			<dc:creator>KTH.SE:u1ndpe5c</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:8._P-uppgift:_prototyp</comments>		</item>
		<item>
			<title>7. P-uppgift: kodskelett</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/7._P-uppgift:_kodskelett</link>
			<description>&lt;p&gt;Sammanfattning: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==P-uppgift==&lt;br /&gt;
&lt;br /&gt;
Kursens sista moment är en större, personlig programmeringsuppgift i Python; en P-uppgift. Uppgifterna är tänkta att vara något så när svåra och tidskrävande, räkna med 40-80 timmar. Betyget i kursen ges av detta moment.&lt;br /&gt;
&lt;br /&gt;
P-uppgiften redovisas i fyra steg, kodskelett, prototyp, granskning och slutredovisning (se nedan). Slutredovisningen görs på KTH och du kan boka en tid när du är klar med de tre första momenten.&lt;br /&gt;
&lt;br /&gt;
Uppgiftslydelsen till din P-uppgift hämtar du från studentportalen. (Du måste dock vara klar med testet i avsnitt&amp;amp;nbsp;1 innan du kan hämta din P-uppgift.)&lt;br /&gt;
&lt;br /&gt;
P-uppgifterna är uppdelade i en grunduppgift och tre extrauppgifter som du kan göra för att få högre betyg. Extrauppgifterna för betyg B och C går att lösa med hjälp av de delar av Python som vi gått igenom hittills i kursen.&lt;br /&gt;
&lt;br /&gt;
I extrauppgiften för betyg A ska du göra ett grafiskt användargränssnitt till ditt program och det ingår i uppgiften att lära sig detta på egen hand, till exempel genom att läsa på nätet om Pythons inbyggda GUI-verktyg som heter Tkinter. En samling bra länkar finns under rubriken&lt;br /&gt;
[[huvudsida#GUI-länkar|GUI-länkar]] på kursens [[huvudsida]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==P-uppgiftens delmoment==&lt;br /&gt;
&lt;br /&gt;
===Kodskelett===&lt;br /&gt;
&lt;br /&gt;
Innan programmet skrivs ska en specifikation i form av ett kodskelett lämnas in. Syftet är att du ska tänka igenom problemet innan du försöker lösa det. Kodskelettet ska innehålla följande delar:&lt;br /&gt;
&lt;br /&gt;
* En inledande kommentar som kortfattat beskriver vad programmet gör och hur det är implementerat.&lt;br /&gt;
* Funktioner (utan kod) med kommentarer.&lt;br /&gt;
* Klasser med attribut och metoder (om du använder klasser), men utan kod.&lt;br /&gt;
&lt;br /&gt;
===Prototyp===&lt;br /&gt;
&lt;br /&gt;
En prototyp är en första körbar version av programmet som innehåller den mest grundläggande funktionaliteten. I det här skedet behöver programmet ännu inte har fullt utbyggd felhantering, eventuella extrauppgifter behöver inte vara implementerade och vissa delar av programmet kan innehålla funktioner som ännu inte utför sin uppgift. Syftet med att lämna in en protyp är att vi ska kunna ge tips och råd om förbättringar och ändringar redan innan programmet är helt klart.&lt;br /&gt;
&lt;br /&gt;
===Granskning===&lt;br /&gt;
&lt;br /&gt;
Innan det färdiga programmet kan redovisas för en handledare på KTH ska det testas (granskas) av en kurskamrat. Vid testen ska din granskare kritiskt granska ditt program, testköra det och fylla i ett granskningsprotokoll. Denna granskning är ett obligatoriskt moment. (Varje kursdeltagare måste granska en uppgift, och alla uppgifter som ska redovisas för handledare måste granskas först.) Syftet med granskningen är att du genom att kritiskt granska en annans program ska få en ökad förståelse för hur man ska (och inte ska) programmera.&lt;br /&gt;
&lt;br /&gt;
===Slutredovisning===&lt;br /&gt;
&lt;br /&gt;
När du är klar med de tre första momenten så är det dags att välja en tid för slutredovisning på KTH. Uppgiftslydelsen, en utskrift av programmet samt granskningsprotokollet ska medföras till slutredovisningen. Observera att vi (för att förhindra fusk) jämför din lösning mot en databas som innehåller alla tidigare inlämningar som gjorts på kursen.&lt;br /&gt;
&lt;br /&gt;
Betyget på kursen bestäms i samband med slutredovisningen. Det finns sex betygssteg, A-F, där A är det högsta betyget. A-E är alla godkända betyg och F är underkänt. Man får betyg&lt;br /&gt;
&lt;br /&gt;
* F om man har fler än 3 påpekanden eller inte uppfyller samtliga nödvändiga punkter i granskningsprotokollet.&lt;br /&gt;
* E om man har 1-3 påpekanden och uppfyller samtliga nödvändiga punkter i granskningsprotokollet.&lt;br /&gt;
* D om man har ett perfekt program (ett program utan påpekanden).&lt;br /&gt;
* C om man har uppfyllt villkoren för betyg D och dessutom har gjort extrauppgift C.&lt;br /&gt;
* B om man har uppfyllt villkoren för betyg C och dessutom har gjort extrauppgift B.&lt;br /&gt;
* A om man har uppfyllt villkoren för betyg B och dessutom har gjort extrauppgift A.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Krav på P-uppgiftslösningen==&lt;br /&gt;
&lt;br /&gt;
Utöver kraven på funktionalitet som finns i uppgiftslydelsen gäller detta alltid:&lt;br /&gt;
&lt;br /&gt;
* Programmet ska vara kommenterat upptill med författare, datum och ev revisionsdatum. Överkommentera inte programmet i övrigt. Tänk på att det är kvalitet och inte kvantitet på kommentarer som räknas.&lt;br /&gt;
* Programmet ska vara användarvänligt och presentera sig vid programstart. Tydliga instruktioner ska ges på skärmen. Det ska vara lätt att förstå vad programmet skriver ut. Det är tillåtet att anta att indatafiler är felfria om inte annat anges i uppgiftslydelsen.&lt;br /&gt;
* Programmet ska vara vettigt uppdelat i funktioner, och eventuellt klasser. Funktioner ska inte vara alltför långa (max en skärmsida). Det ska vara lätt att i efterhand gå in och förstå och ändra i programmet. Robust, flexibelt och lättläst är nyckelord.&lt;br /&gt;
* Varje variabel och funktion ska vara försedd med kommentarer. Ange vad variabeln representerar och vad funktionen gör. För funktioner bör man också ange vad indata (parametrar) och utdata (retur-värde) betyder. Det ska räcka att läsa kommentar och funktionshuvud för att förstå hur en funktion ska användas.&lt;br /&gt;
* Namn på variabler och funktioner ska vara vettiga. Alla deklarerade namn ska vara på samma språk, liksom alla kommentarer (engelska namn och svenska kommentarer är OK). Koden skall vara snyggt formaterad.&lt;br /&gt;
* Nästan identiska kodstycken ska inte upprepas. Gör i stället generella funktioner. Inför inte i onödan begränsningar. Inför konstanter för sådant som man kan tänkas vilja ändra framöver (om man skulle vilja arbeta vidare med din lösning) och för tal som inte ska ändras och går att beskriva med namn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Fiktiv P-uppgift==&lt;br /&gt;
&lt;br /&gt;
I de sista avsnitten av kursen kommer vi att gå igenom ett exempel som visar hur en P-uppgiften kan se ut och hur de olika inlämningsmomenten är tänkta att fungera. Den fiktiva uppgiften går ut på att göra ett program för hantering av enklare biblioteksrutiner. Uppgiftslydelsen ser ut så här:&lt;br /&gt;
&lt;br /&gt;
===Bibliotek===&lt;br /&gt;
&lt;br /&gt;
LÄS ANVISNINGARNA PÅ KURSENS WEBBPLATS INNAN DU BÖRJAR MED UPPGIFTEN!&lt;br /&gt;
&lt;br /&gt;
'''Varudeklaration:''' Datastrukturer, sökning, sortering, filhantering, grafik.&lt;br /&gt;
&lt;br /&gt;
Skriv ett program för hantering av enklare biblioteksrutiner. Programmet ska kunna söka efter&lt;br /&gt;
böcker både med avseende på författare och titel. Man ska även kunna låna och lämna tillbaka&lt;br /&gt;
böcker, lägga in nya böcker i registret och ta bort gamla böcker, samt skriva ut en lista på&lt;br /&gt;
skärmen över alla böcker. Böckerna ska sorteras med avseende på författare.&lt;br /&gt;
&lt;br /&gt;
Böckerna ska lagras på en textfil som du får skriva in själv. Din fil behöver inte innehålla&lt;br /&gt;
fler än tio böcker men ditt program ska gå att använda även för ett stort antal böcker.&lt;br /&gt;
&lt;br /&gt;
'''Exempel:'''&lt;br /&gt;
&amp;lt;pre&amp;gt;Välkommen till biblioteksprogrammet!&lt;br /&gt;
   T söka på Titel.&lt;br /&gt;
   F söka på Författare.&lt;br /&gt;
   L Låna bok.&lt;br /&gt;
   Å Återlämna bok.&lt;br /&gt;
   N lägga in Ny bok.&lt;br /&gt;
   B ta Bort bok.&lt;br /&gt;
   A lista Alla böcker.&lt;br /&gt;
   S Sluta.&lt;br /&gt;
&lt;br /&gt;
Vad vill du göra? F&lt;br /&gt;
   Vilken författare vill du söka efter? Bälter&lt;br /&gt;
   Hittade 2 böcker&lt;br /&gt;
   Bälter: Programmeringsteknik med Python (utlånad)&lt;br /&gt;
   Bälter: Pythonvetaren&lt;br /&gt;
&lt;br /&gt;
Vad vill du göra? L&lt;br /&gt;
   Ange titeln på den bok du vill låna: Pythonvetaren&lt;br /&gt;
&lt;br /&gt;
Vad vill du göra? s&lt;br /&gt;
   Välkommen åter!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Tips:''' Skriv programmet i etapper. Börja med att läsa in böckerna från fil och skriva ut dem igen. Utöka sedan programmet stegvis.&lt;br /&gt;
&lt;br /&gt;
'''Extrauppgift, betyg C:''' Inför felkontroll för användarens inmatning och filers existens.&lt;br /&gt;
&lt;br /&gt;
'''Extrauppgift, betyg B:''' Låt programmet hålla reda på vem som lånat boken och vilket datum den ska återlämnas. Användaren ska kunna be om en lista på alla personer som lånat böcker, och vilka de lånat. Böcker som borde varit tillbakalämnade ska markeras.'Man ska också kunna få en lista på enbart personer som har böcker hemma vars datum gått ut tillsammans med dessa böcker och hur mycket personen är skyldig i böter. Kolla upp bötesregler på biblioteket!&lt;br /&gt;
&lt;br /&gt;
'''Extrauppgift, betyg A:''' Gör ett grafiskt användargränssnitt till programmet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kodskelett till bibliotek==&lt;br /&gt;
&lt;br /&gt;
I kodskelettet hoppar vi över extrauppgifterna. Eftersom uppgiften handlar om att lagra böcker i en databas så kan det vara lämpligt att ha en klass som heter Book som innehåller all information om en bok. Databasen kan vi representera som en lista av Book-objekt. De olika valaternativen i menyn implementerar vi med hjälp av funktioner. Eftersom kodskelettet kommer att utgöra basen för vårt program så ser vi till att programmet går att kompilera redan nu trots att det ännu inte innehåller fungerande kod. Det är därför samtliga metoder innehåller kommandot &amp;lt;code&amp;gt;return&amp;lt;/code&amp;gt; i stället för riktig kod.&lt;br /&gt;
&lt;br /&gt;
Observera att det ska finnas kommentarer till samtliga klasser, metoder och funktioner. Kommentaren i början av en klass ska beskriva vad klassen represerar samt en förklaring av klassens samtliga attribut (klassvariabler).&lt;br /&gt;
&lt;br /&gt;
Exempel på ett kodskelett för den fiktiva P-uppgiften:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# -*- coding: iso8859-1 -*-&lt;br /&gt;
&lt;br /&gt;
# Titel: Bibliotek&lt;br /&gt;
# Författare: Stefan Nilsson&lt;br /&gt;
# Datum: 2007-06-28&lt;br /&gt;
#&lt;br /&gt;
# Det här är ett program för hantering av enklare biblioteksrutiner.&lt;br /&gt;
# Programmet lagrar böckerna i en fil med namnet &amp;quot;bibliotek.txt&amp;quot;&lt;br /&gt;
# mellan körningarna.&lt;br /&gt;
&lt;br /&gt;
# En klass som beskriver en bok:&lt;br /&gt;
#    author - namnet på författaren&lt;br /&gt;
#    title - bokens titel&lt;br /&gt;
#    isBorrowed - en variabel som är True om boken är utlånad.&lt;br /&gt;
class Book:&lt;br /&gt;
    # Skapar en ny bok.&lt;br /&gt;
    def __init__(self, author, title):&lt;br /&gt;
        self.author = author&lt;br /&gt;
        self.title = title&lt;br /&gt;
        self.isBorrowed = False&lt;br /&gt;
&lt;br /&gt;
    # Returnerar en sträng som beskriver boken&lt;br /&gt;
    def string(self):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
# En klass som beskriver en bibliotekskatalog:&lt;br /&gt;
#    books - en lista som innehåller samtliga böcker.&lt;br /&gt;
class Bibliotek:&lt;br /&gt;
    # Skapar en bibliotekskatalog med de böcker som finns i filen.&lt;br /&gt;
    def __init__(self, filename):&lt;br /&gt;
        self.books = list()&lt;br /&gt;
&lt;br /&gt;
    # Sparar hela bibliotekskatalogen i en fil.&lt;br /&gt;
    def save(self, filename):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Skriver ut valmenyn.&lt;br /&gt;
    def meny(self):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Läser in och returnerar användarens val.&lt;br /&gt;
    def choose(self):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Söker på en titel.&lt;br /&gt;
    def findTitle(self, title):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Söker på en författare.&lt;br /&gt;
    def findAuthor(self, author):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Lånar en bok.&lt;br /&gt;
    def borrowBook(self, book):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Återlämnar en bok.&lt;br /&gt;
    def returnBook(self, book):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Lägger till en ny bok:&lt;br /&gt;
    def addBook(self, book):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Tar bort en bok:&lt;br /&gt;
    def deleteBook(self, book):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    # Returnerar en lista över alla böcker:&lt;br /&gt;
    def listBooks(self):&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
# Huvudprogram&lt;br /&gt;
&lt;br /&gt;
FILENAME = 'bibliotek.txt'&lt;br /&gt;
bibliotek = Bibliotek(FILENAME)&lt;br /&gt;
&lt;br /&gt;
# choice = '';&lt;br /&gt;
# while choice != 'S':&lt;br /&gt;
#     bibliotek.meny()&lt;br /&gt;
#     choice = bibliotek.choose()&lt;br /&gt;
#     # Utför detta val.&lt;br /&gt;
&lt;br /&gt;
bibliotek.save(FILENAME)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Det här kodskelettet är inte avsett att vara varken perfekt eller komplett. Det är inte bara koden som saknas; vi kommer också att behöva modifiera både funktioner och kommentarer efterhand som projektet fortskrider.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inlämningsuppgift: kodskelett&lt;br /&gt;
&lt;br /&gt;
Skriv ett kodskelett till din P-uppgift och lämna in den på vanligt sätt under&lt;br /&gt;
rubriken &amp;quot;P-uppgift Kodskelett&amp;quot;.&lt;/div&gt;</description>
			<pubDate>Wed, 27 Jun 2007 14:51:29 GMT</pubDate>			<dc:creator>KTH.SE:u1ndpe5c</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:7._P-uppgift:_kodskelett</comments>		</item>
		<item>
			<title>6. Klasser</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/6._Klasser</link>
			<description>&lt;p&gt;Sammanfattning: /* Exempel: Husdjursprogrammet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Objektorientering==&lt;br /&gt;
&lt;br /&gt;
Objektorienterad programmering är ett sätt att kombinera data&lt;br /&gt;
och funktioner för att bilda ''objekt''. Objekten är ofta modeller&lt;br /&gt;
av verkliga ting. Om vi vill skriva ett program för att simulera &lt;br /&gt;
ett rymdskepp kan vi till exempel ha hastighet och lägeskoordinater &lt;br /&gt;
som data. Rymdskeppets funktioner kan vara att accelerera i en viss &lt;br /&gt;
riktning och att rotera.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Rymdskepp.jpg|Två rymdskepp|center]]&lt;br /&gt;
&lt;br /&gt;
För att kunna använda objekt i sitt program måste man först definiera&lt;br /&gt;
en ''klass''. Klassen beskriver vilka data ett objekt ska kunna&lt;br /&gt;
innehålla och vilka funktioner det ska ha. Om vi definierat en klass&lt;br /&gt;
för rymdskepp kan vi sedan skapa hur många rymdskepps-objekt vi vill!&lt;br /&gt;
&lt;br /&gt;
'''Fråga: Vi vill skriva ett program för att lägga patiens. Vilken av följande klasser ska vi definiera i programmet?'''&lt;br /&gt;
# Poäng&lt;br /&gt;
# Spader&lt;br /&gt;
# Kort&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Klassen Kort, så att vi kan skapa många kort-objekt som kan användas i patiensen. &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Husdjursobjekt.jpg|frame|right]]&lt;br /&gt;
Det stora exemplet i det här avsnittet kommer att handla om ett virtuellt&lt;br /&gt;
husdjur. Ett husdjur kan ju ha många egenskaper, men vi väljer ut två att&lt;br /&gt;
ta med i vår klass: ''namn'' och ''skick'' (ett heltal som talar om hur den känner&lt;br /&gt;
sig just nu). Användaren får själv välja namn på sitt husdjur, och husdjurets&lt;br /&gt;
skick ska påverkas av hur den behandlas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Attribut==&lt;br /&gt;
&lt;br /&gt;
De variabler som används för att lagra data som hör till objektet&lt;br /&gt;
kallas ''attribut''. Våra husdjursobjekt ska alltså ha attributen&lt;br /&gt;
&amp;lt;code&amp;gt;namn&amp;lt;/code&amp;gt; och &amp;lt;code&amp;gt;skick&amp;lt;/code&amp;gt;. Om man har flera objekt &lt;br /&gt;
av samma typ är attributens värde helt oberoende av varandra. &lt;br /&gt;
Två olika husdjur får ha olika namn och olika skick.&lt;br /&gt;
&lt;br /&gt;
Det finns en synlig skillnad mellan attribut och vanliga variabler.&lt;br /&gt;
Inuti klassen använder man alltid ordet ''self'' när man vill komma åt&lt;br /&gt;
ett attribut. Man kan till exempel skriva så här:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
self.namn = &amp;quot;Fido&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Med ''self'' menar man objektet självt.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Fråga: Anta att vi jobbar med ett program för vitvaruhandeln. Vilka av följande alternativ skulle passa som attribut för ett spis-objekt?'''&lt;br /&gt;
[[Bild:Spis.jpg|frame|right]]&lt;br /&gt;
# bredd&lt;br /&gt;
# energiklass&lt;br /&gt;
# ugnsvolym&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Alla alternativen skulle passa bra som attribut! &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Metoder==&lt;br /&gt;
&lt;br /&gt;
Funktionerna som hör till ett objekt kallas ''metoder''. För att en&lt;br /&gt;
funktion ska bli en metod måste den definieras inuti klassen.&lt;br /&gt;
Den första parametern i en metod måste alltid vara ''self''. &lt;br /&gt;
Via self kan metoden använda objektets attribut.&lt;br /&gt;
&lt;br /&gt;
Säg att vi vill ha en metod som ger vårt husdjur bannor (i uppfostrande&lt;br /&gt;
syfte). Metoden ska visa bannorna, och även minska värdet på skick eftersom&lt;br /&gt;
husdjuret blir på sämre humör.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def banna(self):&lt;br /&gt;
        print&lt;br /&gt;
        print &amp;quot;- Fy på dig&amp;quot;, self.namn, &amp;quot;!&amp;quot;&lt;br /&gt;
        self.skick -= 3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Som synes skriver man en metod precis som en funktion, sånär som&lt;br /&gt;
på ordet self. Samma regler för parametrar och returvärden gäller.&lt;br /&gt;
&lt;br /&gt;
Husdjursklassen ska så småningom få metoder som gör följande:&lt;br /&gt;
[[Bild:GauginPuppies.jpg|left|frame]]&lt;br /&gt;
* skapar ett husdjursobjekt och ger attributen värden&lt;br /&gt;
* visar i vilket skick husdjuret är&lt;br /&gt;
* bannar husdjuret&lt;br /&gt;
* matar husdjuret&lt;br /&gt;
* leker med husdjuret&lt;br /&gt;
* tar avsked av husdjuret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
'''Fråga: I en internetbutik vill vi ha ett objekt som representerar en kundvagn. Vilka av följande kan tänkas bli metoder i ett kundvagns-objekt?'''&lt;br /&gt;
# lägga ner en vara i kundvagnen&lt;br /&gt;
# beräkna totalpriset för alla varor i kundvagnen&lt;br /&gt;
# räkna ut dagens vinst för internetbutiken&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Alla utom sista alternativet - det hör &lt;br /&gt;
inte till själva kundvagnen.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Speciella metoder: konstruktorn och str==&lt;br /&gt;
&lt;br /&gt;
Metoder får man döpa precis som man vill. Men &lt;br /&gt;
det finns ett par metodnamn som har speciell betydelse för Python.&lt;br /&gt;
Här tar vi upp två av dessa. Metodnamnen börjar och slutar med&lt;br /&gt;
två understrykningstecken, så det finns ingen risk att man råkar&lt;br /&gt;
välja namnen av misstag.&lt;br /&gt;
&lt;br /&gt;
''Konstruktorn'' är en speciell metod som man skriver för att ''initiera''&lt;br /&gt;
objekt, dvs ge objektets attribut de värden de ska ha från början.&lt;br /&gt;
Konstruktorn anropas automatiskt varje gång ett objekt skapas. &lt;br /&gt;
I Python måste man döpa sin konstruktor till &amp;lt;code&amp;gt;__init__&amp;lt;/code&amp;gt; (alltså init&lt;br /&gt;
med två understrykningstecken både före och efter).&lt;br /&gt;
&lt;br /&gt;
Konstruktorn för vårt husdjursobjekt kommer att se ut så här:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def __init__(self, djurnamn):&lt;br /&gt;
        self.namn = djurnamn&lt;br /&gt;
        self.skick = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tegel.jpg|frame|right]]&lt;br /&gt;
&lt;br /&gt;
Den här konstruktorn har två parametrar, self (som ju alltid måste vara med) &lt;br /&gt;
och djurnamn. Raden &amp;lt;code&amp;gt;self.namn = djurnamn&amp;lt;/code&amp;gt; skapar attributet ''namn'' och&lt;br /&gt;
initierar det till värdet av parametern djurnamn. På samma sätt skapar&lt;br /&gt;
raden &amp;lt;code&amp;gt;self.skick = 0&amp;lt;/code&amp;gt; attributet ''skick'' och initierar&lt;br /&gt;
det till noll. Varje gång man gör ett nytt objekt kommer konstruktorn att anropas.&lt;br /&gt;
&lt;br /&gt;
Den andra specialmetoden vi ska ta upp här heter &amp;lt;code&amp;gt;__str__&amp;lt;/code&amp;gt;, och det&lt;br /&gt;
speciella med den är att den anropas varje gång man försöker skriva ut ett&lt;br /&gt;
objekt med &amp;lt;code&amp;gt;print&amp;lt;/code&amp;gt;. Här kan man alltså tala om hur man vill&lt;br /&gt;
att objektets data ska skrivas ut. Exempel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return self.namn + &amp;quot;*&amp;quot; + str(self.skick)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Metoden &amp;lt;code&amp;gt;__str__&amp;lt;/code&amp;gt; är särskilt användbar under tiden man arbetar&lt;br /&gt;
med programmet, för att det blir enklare att göra kontrollutskrifter.&lt;br /&gt;
&lt;br /&gt;
'''Fråga: Vilket av följande måste en konstruktor ha?'''&lt;br /&gt;
# parametern self&lt;br /&gt;
# en parameter för varje attribut&lt;br /&gt;
# ett returvärde&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Parametern self är det enda som måste vara med. Attributen kan få värden via parametrar (som namn ovan), men det är inte nödvändigt. Konstruktorn ska inte ha något returvärde.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Klassen==&lt;br /&gt;
&lt;br /&gt;
För att kunna skapa ett objekt måste man först definiera en klass. &lt;br /&gt;
Det är i klassen man skriver de metoder som objektet ska ha.&lt;br /&gt;
Klasser brukar ha namn som börjar med versal, så att man lätt&lt;br /&gt;
ska kunna se att det är en klass. Så här långt har vi hunnit i vår husdjursklass hittills:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# En klass som beskriver ett virtuellt husdjur.&lt;br /&gt;
# Attribut:&lt;br /&gt;
#    namn - djurets nanm&lt;br /&gt;
#    skick - ett heltal som beskriver djurets skick&lt;br /&gt;
class Husdjur:&lt;br /&gt;
&lt;br /&gt;
    # Konstruktorn&lt;br /&gt;
    def __init__(self, djurnamn):&lt;br /&gt;
        self.namn = djurnamn&lt;br /&gt;
        self.skick = 0&lt;br /&gt;
&lt;br /&gt;
    # För utskrift med print&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return self.namn + &amp;quot;*&amp;quot; + str(self.skick)&lt;br /&gt;
&lt;br /&gt;
    # Ger husdjuret bannor. Skick minskas.&lt;br /&gt;
    def banna(self):&lt;br /&gt;
        print&lt;br /&gt;
        print &amp;quot;- Fy på dig&amp;quot;, self.namn, &amp;quot;!&amp;quot;&lt;br /&gt;
        self.skick -= 3&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Med en klass är det likadant som med en funktion - det händer&lt;br /&gt;
inget förrän man använder den i huvudprogrammet. För att skapa&lt;br /&gt;
ett Husdjurs-objekt kan vi skriva:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
djur = Husdjur(&amp;quot;Muffin&amp;quot;)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Det som händer här är att konstruktorn &amp;lt;code&amp;gt;__init__&amp;lt;/code&amp;gt;&lt;br /&gt;
anropas, så att attributen skapas och initieras. Sen returneras&lt;br /&gt;
ett Husdjurs-objekt, som lagras i variabeln &amp;lt;code&amp;gt;djur&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu har vi ett husdjursobjekt i variabeln &amp;lt;code&amp;gt;djur&amp;lt;/code&amp;gt;. Hur&lt;br /&gt;
anropar vi en av djurets metoder? Just nu finns bara metoden&lt;br /&gt;
&amp;lt;code&amp;gt;banna&amp;lt;/code&amp;gt; att välja på:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
djur.banna()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
När vi vill komma åt ett attribut inuti klassen använder vi ju en punkt,&lt;br /&gt;
och ett liknande skrivsätt använder man alltså när man vill anropa en&lt;br /&gt;
metod från ett objekt.&lt;br /&gt;
&lt;br /&gt;
'''Fråga: Kan man skriva Husdjur.banna()?'''&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Nej, man kan bara banna ett husdjursobjekt, inte hela klassen. &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Exempel: Husdjursprogrammet==&lt;br /&gt;
&lt;br /&gt;
Här följer hela programmet, först Husdjurs-klassen, och sedan huvudprogrammet. &lt;br /&gt;
Lägg märke till att alla metoderna i klassen är indenterade.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# En klass som beskriver ett virtuellt husdjur.&lt;br /&gt;
# Attribut:&lt;br /&gt;
#    namn - djurets nanm&lt;br /&gt;
#    skick - ett heltal som beskriver djurets skick&lt;br /&gt;
class Husdjur:&lt;br /&gt;
&lt;br /&gt;
    # Konstruktorn, initierar attributen namn och skick.&lt;br /&gt;
    def __init__(self, djurnamn):&lt;br /&gt;
        self.namn = djurnamn&lt;br /&gt;
        self.skick = 0&lt;br /&gt;
&lt;br /&gt;
    # Visar husdjurets namn och skick&lt;br /&gt;
    def visaSkick(self):       &lt;br /&gt;
        print self.namn, &amp;quot;är &amp;quot;,&lt;br /&gt;
        if self.skick &amp;gt; 5:&lt;br /&gt;
            print &amp;quot;glad: (^_^)&amp;quot;&lt;br /&gt;
        elif self.skick &amp;gt; 0:&lt;br /&gt;
            print &amp;quot;trött: (T_T)&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            print &amp;quot;hungrig: ('o')&amp;quot;&lt;br /&gt;
        print&lt;br /&gt;
&lt;br /&gt;
    # Ger husdjuret bannor. Skick minskas.&lt;br /&gt;
    def banna(self):&lt;br /&gt;
        print&lt;br /&gt;
        print &amp;quot;- Fy på dig&amp;quot;, self.namn, &amp;quot;!&amp;quot;&lt;br /&gt;
        self.skick -= 3&lt;br /&gt;
&lt;br /&gt;
    # Ger husdjuret mat. Skick ökar.&lt;br /&gt;
    def mata(self, mat):&lt;br /&gt;
        print&lt;br /&gt;
        for i in range(mat):&lt;br /&gt;
            print &amp;quot;GLUFS&amp;quot;,&lt;br /&gt;
        self.skick += mat&lt;br /&gt;
&lt;br /&gt;
    # Leker med husdjuret. Skick kan öka eller minska.&lt;br /&gt;
    def leka(self):&lt;br /&gt;
        print&lt;br /&gt;
        if self.skick &amp;lt; 0:&lt;br /&gt;
            self.skick -= 1&lt;br /&gt;
            print self.namn, &amp;quot; vill inte leka.&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            self.skick += 1&lt;br /&gt;
            print &amp;quot;~~~~~~~~~~~ WHEEEEEEE! ~~~~~~~~~~~&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Skriver ut avskedet.&lt;br /&gt;
    def avsked(self):&lt;br /&gt;
        print&lt;br /&gt;
        print &amp;quot;Hejdå,&amp;quot;, self.namn, &amp;quot;kommer att sakna dig!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Här slutar Husdjursklassen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#  --------  Här börjar huvudprogrammet -----------&lt;br /&gt;
djurnamn = raw_input(&amp;quot;Vad vill du döpa ditt husdjur till? &amp;quot;)&lt;br /&gt;
djur = Husdjur(djurnamn)&lt;br /&gt;
djur.visaSkick()&lt;br /&gt;
svar = raw_input(&amp;quot; Vill du \n  banna \n  mata \n  leka med \n ditt husdjur? &amp;quot; )&lt;br /&gt;
while svar:&lt;br /&gt;
    if svar[0]==&amp;quot;m&amp;quot;:&lt;br /&gt;
        bullar = input(&amp;quot;Hur många bullar? &amp;quot;)&lt;br /&gt;
        djur.mata(bullar)    &lt;br /&gt;
    elif svar[0]==&amp;quot;b&amp;quot;:&lt;br /&gt;
        djur.banna()&lt;br /&gt;
    elif svar[0]==&amp;quot;l&amp;quot;:&lt;br /&gt;
        djur.leka()&lt;br /&gt;
    else:&lt;br /&gt;
        print &amp;quot;Hursa? &amp;quot;&lt;br /&gt;
    djur.visaSkick()&lt;br /&gt;
    svar = raw_input(&amp;quot; Vill du \n  banna \n  mata \n  leka med \n ditt husdjur? &amp;quot; )&lt;br /&gt;
djur.avsked()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provkör programmet och svara på följande frågor.&lt;br /&gt;
&lt;br /&gt;
* '''Fråga: Hur många objekt skapas i programmet?'''&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Bara ett - variabeln djur. &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Fråga: När metoden visaSkick skriver ut att husdjuret är trött - vilka värden har attributet skick då?'''&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Attributet skick har något av värdena 1,2,3,4 eller 5&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Fråga: Hur avslutar man programmet?'''&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;När man trycker på Retur avslutas programmet. Lägg gärna till en print-sats som upplyser användaren om det! &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Fråga: Hur många metoder finns det i klassen Husdjur?'''&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Det finns sex metoder, inklusive konstruktorn.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* '''Fråga: Kan man få programmet att krascha?'''&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Javisst, prova att skriva tre (istället för 3) när du matar husdjuret med bullar. Här skulle det behövas lite felhantering!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sortering av en lista med objekt==&lt;br /&gt;
&lt;br /&gt;
Oftast skapar man fler än ett objekt i sitt program. Då är det praktiskt&lt;br /&gt;
att spara objekten i en lista. En lista med objekt kan enkelt sorteras efter&lt;br /&gt;
sina attribut. Men på något sätt måste man ange vilket attribut man vill&lt;br /&gt;
sortera på. Är det namn eller skick?&lt;br /&gt;
&lt;br /&gt;
Så här kan sortering av en lista skrivas:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   lista.sort(key = lambda x:x.attr)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parametern &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; i sort visar att man vill ange vilket attribut&lt;br /&gt;
man vill sortera på. Uttrycket &amp;lt;code&amp;gt;lambda x:x.attribut&amp;lt;/code&amp;gt; är som en&lt;br /&gt;
liten funktion i miniatyr där parametern står före kolonet och returvärdet efter.&lt;br /&gt;
Om vi tänker oss att x är objektet så är attr det av objektets attribut som vi&lt;br /&gt;
vill sortera på.&lt;br /&gt;
 &lt;br /&gt;
Om det attribut man sorterar på är en sträng görs sorteringen&lt;br /&gt;
efter bokstavsordning. Är attributet ett tal så blir objekten sorterade i&lt;br /&gt;
stigande ordning. Vi förenklar Husdjursklassen en aning och visar &lt;br /&gt;
med exemplet nedan hur sorteringen kan göras i praktiken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import random&lt;br /&gt;
&lt;br /&gt;
# En klass som beskriver ett virtuellt husdjur.&lt;br /&gt;
# Attribut:&lt;br /&gt;
#    namn - djurets nanm&lt;br /&gt;
#    skick - ett heltal som beskriver djurets skick&lt;br /&gt;
class Husdjur:&lt;br /&gt;
&lt;br /&gt;
    # Konstruktorn, initierar attributen namn och skick.&lt;br /&gt;
    def __init__(self, djurnamn):&lt;br /&gt;
        self.namn = djurnamn&lt;br /&gt;
        self.skick = random.randrange(-5,6)&lt;br /&gt;
        &lt;br /&gt;
    # För utskrift av ett objekt med print&lt;br /&gt;
    def __str__(self):&lt;br /&gt;
        return self.namn + &amp;quot;*&amp;quot; + str(self.skick)&lt;br /&gt;
    &lt;br /&gt;
#  -------  Här slutar Husdjursklassen ---------&lt;br /&gt;
&lt;br /&gt;
# En funktion för utskrift av listan&lt;br /&gt;
def skrivListan(listan):&lt;br /&gt;
    for o in listan:&lt;br /&gt;
        print o,&lt;br /&gt;
    print &amp;quot;\n&amp;quot;&lt;br /&gt;
&lt;br /&gt;
#  --------  Här börjar huvudprogrammet ---------&lt;br /&gt;
&lt;br /&gt;
djurlista = [Husdjur(&amp;quot;Missan&amp;quot;), Husdjur(&amp;quot;Blixten&amp;quot;), Husdjur(&amp;quot;Fido&amp;quot;), Husdjur(&amp;quot;Miso&amp;quot;)]&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Så här ser listan ut från början:&amp;quot;&lt;br /&gt;
skrivListan(djurlista)&lt;br /&gt;
&lt;br /&gt;
djurlista.sort(key = lambda husdjur:husdjur.namn)&lt;br /&gt;
print &amp;quot;Nu är listan sorterad efter namn, i bokstavsordning:&amp;quot;&lt;br /&gt;
skrivListan(djurlista)&lt;br /&gt;
        &lt;br /&gt;
djurlista.sort(key = lambda husdjur:husdjur.skick)&lt;br /&gt;
print &amp;quot;Nu är listan sorterad efter skick, i stigande ordning:&amp;quot;&lt;br /&gt;
skrivListan(djurlista)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Fråga: Hur gör man om man vill sortera i avtagande istället för i stigande ordning?'''&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Man kan enkelt vända på listan efter sorteringen med djurlista.reverse()&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
&lt;br /&gt;
Dags för test nummer 6. Testet hittar du som vanligt under rubriken Examination&lt;br /&gt;
på kursens förstasida. Även detta test rättas automatiskt och du har möjlighet&lt;br /&gt;
att göra om testet flera gånger om du inte lyckas på första försöket.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inlämningsuppgift 3 (Nöjesfält)==&lt;br /&gt;
&lt;br /&gt;
''Inlämningsuppgiften är individuell och får inte lösas i grupp.''&lt;br /&gt;
&lt;br /&gt;
[[Bild:Rollercoaster.jpg|frame|right]]&lt;br /&gt;
Du ska skriva ett program som simulerar ett nöjesfält. &lt;br /&gt;
Använd objekt för att representera attraktionerna.&lt;br /&gt;
En attraktion kan till exempel ha namn, minimilängd (för att få åka), &lt;br /&gt;
antal passagerare och magpirrfaktor. Den ska kunna göra reklam för sig,&lt;br /&gt;
startas, stoppas och haverera.&lt;br /&gt;
&lt;br /&gt;
Skriv också ett huvudprogram där användaren får välja mellan tre olika&lt;br /&gt;
attraktioner. Vald attraktion ska startas, kanske haverera&lt;br /&gt;
(slumpa fram haverier) och stannas. När attraktionen är igång&lt;br /&gt;
ska det synas på skärmen, till exempel med ''Iiiih'' &lt;br /&gt;
från berg-och-dalbanan, skratt från lustiga huset och så vidare.&lt;br /&gt;
&lt;br /&gt;
Kravet för att bli godkänd är att du med ditt program visar att du&lt;br /&gt;
kan skriva en egen klass med attribut och metoder, och använda den&lt;br /&gt;
i ett program. I övrigt har du fria händer!&lt;br /&gt;
&lt;br /&gt;
Programmet ska finnas i en fil med namnet &amp;lt;code&amp;gt;Uppgift3.py&amp;lt;/code&amp;gt;. Följ den här mallen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Programmeringsteknik webbkurs KTH inlämningsuppgift 3.&lt;br /&gt;
# &amp;lt;Ditt namn&amp;gt;&lt;br /&gt;
# &amp;lt;Datum&amp;gt;&lt;br /&gt;
# &amp;lt;Kort beskrivning av vad programmet gör&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Programkod&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innan du skickar in programmet så ska du testa att det fungerar. Se till att du har provat alla klassens metoder, och fått se alla utskrifter som ditt program gör.&lt;br /&gt;
&lt;br /&gt;
När du har testat ditt program grundligt så går du till studentportalen och klickar dig fram till Inlämningsuppgift&amp;amp;nbsp;3 och där lämnar du in filen Uppgift3.py. Observera att filen Uppgift3.py måste vara i textformat - vilket den automatiskt blir om du skapar den med hjälp av IDLE. Detta för att vi ska kunna prova och testköra ditt program.&lt;/div&gt;</description>
			<pubDate>Wed, 27 Jun 2007 14:49:29 GMT</pubDate>			<dc:creator>KTH.SE:u1ndpe5c</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:6._Klasser</comments>		</item>
		<item>
			<title>Ordlista</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/Ordlista</link>
			<description>&lt;p&gt;Sammanfattning: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==&amp;lt;span id=&amp;quot;operatorer&amp;quot;&amp;gt;Kortfattad programmerings- och Pythonordlista&amp;lt;/span&amp;gt;==&lt;br /&gt;
&lt;br /&gt;
'''=''' är »tilldelningsoperatorn« (assignment operator). Den används för att ge en variabel ett värde. Variablen står först på raden, sen likhetstecknet, och sist det värde som variabeln ska få. Exempel x = 5&lt;br /&gt;
&lt;br /&gt;
'''==''' är »lika med«-operatorn som ger True om de två värden som jämförs är lika, och annars False.&lt;br /&gt;
&lt;br /&gt;
'''not''' är »negerings«-operatorn som ger True om den står framför ett uttryck som har värdet False, och False&lt;br /&gt;
om den står framför ett uttryck som har värdet True.&lt;br /&gt;
&lt;br /&gt;
'''!=''' är »skilt från«-operatorn som ger True om de två värden som jämförs är olika, och annars False.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;''' är »mindre än«-operatorn som ger True om värdet av det första uttrycket är mindre än&lt;br /&gt;
värdet av det andra uttrycket, och annars False.&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;='''är »mindre än eller lika med«-operatorn som ger True om värdet av det första uttrycket är mindre än&lt;br /&gt;
eller lika med värdet av det andra uttrycket, och annars False.&lt;br /&gt;
&lt;br /&gt;
'''&amp;gt;''' är »större än«-operatorn som ger True om värdet av det första uttrycket är större än&lt;br /&gt;
värdet av det andra uttrycket, och annars False.&lt;br /&gt;
&lt;br /&gt;
'''&amp;gt;='''är »större än eller lika med«-operatorn som ger True om värdet av det första uttrycket är större än&lt;br /&gt;
eller lika med värdet av det andra uttrycket, och annars False.&lt;br /&gt;
&lt;br /&gt;
'''and''' är »och«-operatorn som ger True om bägge uttrycken är True, annars False.&lt;br /&gt;
&lt;br /&gt;
'''or''' är »eller«-operatorn som ger True om minst ett av uttrycken till är True, annars False.&lt;br /&gt;
&lt;br /&gt;
'''()''' är vanliga (runda) parenteser som används till parameterlistan i funktioner och aritmetiska uttryck.&lt;br /&gt;
&lt;br /&gt;
'''[]''' är hakparenteser (square brackets) som man använder för att ange index (elementnummer) i listor.&lt;br /&gt;
&lt;br /&gt;
'''%''' är resten (modulo) vid heltalsdivision. Ex: 7 % 3 blir 1 medan 6 % 3 blir 0 och 5 % 3 blir 2.&lt;br /&gt;
&lt;br /&gt;
' (apostrof, Unicode U+0027) används för att skriva strängar. Exempel: 'k', '\t'&lt;br /&gt;
(tabulatortecken), '\u0b87' (Unicodetecken nummer b87).&lt;br /&gt;
&lt;br /&gt;
&amp;quot; (citattecken, Unicode U+0022) används också för att skriva strängar. Exempel: &amp;quot;hejsan&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''+ - * /'''är tecknen som används som operatorer för de fyra räknesätten. Observera att om bägge&lt;br /&gt;
operanderna i en division är heltal blir det heltalsdivision (ingen avrundning: 9/10 blir 0). Se&lt;br /&gt;
prioritetsordning.&lt;br /&gt;
&lt;br /&gt;
'''+=''' och '''-=''' är förkortade skrivsätt för uppräkning och nedräkning.&lt;br /&gt;
&lt;br /&gt;
'''#''' är kommentartecknet. Allt som står efter detta tecken på en rad ignoreras av Python-tolken,&lt;br /&gt;
nästan, see åäö.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;; semikolon används för att skilja på Python-satser som står på samma rad.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;a&amp;quot;&amp;gt;A&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''adress''' är ett unikt tal som representerar en minnesposition i datorns internminne.&lt;br /&gt;
&lt;br /&gt;
'''algoritm''', instruktionsföljd för lösning av problem.&lt;br /&gt;
&lt;br /&gt;
'''array''' se [[#l|l]]ista.&lt;br /&gt;
&lt;br /&gt;
'''assignment''', se [[#t|t]]illdelning&lt;br /&gt;
&lt;br /&gt;
'''avlusa''', hitta och rätta fel i program.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;b&amp;quot;&amp;gt;B&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''bibliotek''', se [[#k|k]]atalog&lt;br /&gt;
&lt;br /&gt;
'''binära tal''' är det sätt som en dator lagrar information (även text). Talen representerar en tvåpotens.&lt;br /&gt;
Ex: Det binära talet 10001 (skrivs också 100012) betyder egentligen 1*24 + 0*23 + 0*22 + 0*21 +&lt;br /&gt;
1*20 = 1710 (utläses sjutton i basen 10, eller 17 decimalt och betyder analogt 1*101 + 7*100).&lt;br /&gt;
&lt;br /&gt;
'''bit''', minsta minnesenheten i en dator. Innehåller hög eller låg spänning, eller olika&lt;br /&gt;
magnetiseringsriktningar för att representera värdet noll eller ett. Flera (vanligen åtta) bitar som&lt;br /&gt;
gruppers ihop bildar en byte (bitgrupp).&lt;br /&gt;
&lt;br /&gt;
'''block''', en följd indenterade kodrader&lt;br /&gt;
&lt;br /&gt;
'''browser''' (eng) webbläsare, t ex Mozilla, Safari och MS Internet Explorer.&lt;br /&gt;
&lt;br /&gt;
'''bug''' (eng) lus, fel i program. Enligt uråldriga programmerarsägner uppstod namnet på femtiotalet&lt;br /&gt;
när ett fel i en dator visade sig ha orsakats av en insekt (bug) som kortslöt några ledningar.&lt;br /&gt;
&lt;br /&gt;
'''byte''', bitgrupp om vanligen 8 bitar.&lt;br /&gt;
&lt;br /&gt;
==D==&lt;br /&gt;
'''debugga''', se [[#a|a]]vlusa.&lt;br /&gt;
&lt;br /&gt;
'''directory''', se [[#k|k]]atalog.&lt;br /&gt;
&lt;br /&gt;
'''division''', se [[#operatorer|/]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;e&amp;quot;&amp;gt;E&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''editor''', se [[#r|redigeringsprogram]].&lt;br /&gt;
&lt;br /&gt;
'''elif''', se [[#i|if]]&lt;br /&gt;
&lt;br /&gt;
'''eller''', villkorsoperator se [[#operatorer|&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
'''else''', se [[#i|if]]&lt;br /&gt;
&lt;br /&gt;
'''evaluera''' betyder ungefär beräkna, men kan användas även om det inte ingår några tal, t ex&lt;br /&gt;
att evaluera ett uttryck som resulterar i en sträng.&lt;br /&gt;
&lt;br /&gt;
'''exekvering.''' Vad en dator gör när den utför ett program, dvs går igenom programkoden&lt;br /&gt;
och utför den.&lt;br /&gt;
&lt;br /&gt;
'''exekveringsavbrott.''' När ettfel som uppstår under körning av ett program får programmet att&lt;br /&gt;
krascha. Kan t ex bero på indata som programmet inte är anpassat för eller att man går utanför en&lt;br /&gt;
listas gränser. Använd spårutskrifter för att ta reda på var och varför det blir fel.&lt;br /&gt;
&lt;br /&gt;
'''expression''' se [[#u|uttryck]]&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;f&amp;quot;&amp;gt;F&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''False''', booleskt värde som representerar ett falskt påstående (icke uppfyllt villkor). Se även&lt;br /&gt;
[[#T|T]]rue.&lt;br /&gt;
&lt;br /&gt;
'''falskt''', se [[#f|False]].&lt;br /&gt;
&lt;br /&gt;
'''felsökning''', se [[#a|avlusning]], [[#e|exekveringsavbrott]] och [[#k|kompileringsfel]].&lt;br /&gt;
&lt;br /&gt;
'''fil''', datorernas motsvarighet till pappersdokument. En fil kan innehålla t ex en text, ett program, en&lt;br /&gt;
film, ett ljud, eller en bild.&lt;br /&gt;
&lt;br /&gt;
'''filnamn''', till skillnad mot pappersdokument måste alla filer namnges. Hur detta görs beror på&lt;br /&gt;
vilket operativsystem datorn använder. Specialtecken som åäö kan ställa till problem i filnamn&lt;br /&gt;
eftersom åäö hanteras olika i olika operativsystem.&lt;br /&gt;
&lt;br /&gt;
'''flöde''', se [[#p|programflöde]].&lt;br /&gt;
&lt;br /&gt;
'''flyttal''', se [[#r|reella tal]].&lt;br /&gt;
&lt;br /&gt;
'''for''' en slinga för att gå igenom en följd värden, t ex element i en lista eller rader i en fil.&lt;br /&gt;
&lt;br /&gt;
'''function invocation''' se [[#f|funktionsanrop]].&lt;br /&gt;
&lt;br /&gt;
'''funktion''', är en namngiven grupp av variabeldeklarationer och satser som kan anropas&lt;br /&gt;
vid behov. I funktionsdeklarationen anger man vilken kod som skall utföras när funktionen&lt;br /&gt;
anropas. Funktionsdeklarationen innefattar funktionens namn, en parameterlista (som kan vara&lt;br /&gt;
tom), och ett block som innehåller koden.&lt;br /&gt;
&lt;br /&gt;
'''funktionsanrop''' medför att den kod som finns i funktionen utförs. Anropsparametrarna används&lt;br /&gt;
för att förse funktionen med indata. Funktionen kan dessutom vidarebefordra utdata till den&lt;br /&gt;
anropande koden genom en retursats (return).&lt;br /&gt;
&lt;br /&gt;
==G==&lt;br /&gt;
'''gemen''' bokstav är detsamma som liten bokstav. Se även versal.&lt;br /&gt;
&lt;br /&gt;
'''gränssnitt''' är kontaktytan mellan två enheter, t ex människa och maskin, borrmaskin och borrar.&lt;br /&gt;
&lt;br /&gt;
==H==&lt;br /&gt;
'''hexadecimalt''' tal har basen sexton. Siffrorna tio till femton representeras med bokstäverna&lt;br /&gt;
1010 = A16, 1110 = B16, osv. Basen 16 skrivs ibland H, t ex kan 1710 skrivas 11H .&lt;br /&gt;
&lt;br /&gt;
'''HTML''', Hyper Text Markup Language, språk som används för att göra layout av framför&lt;br /&gt;
webbsidor. Se http://www.atiger.pp.se/sida.html.&lt;br /&gt;
&lt;br /&gt;
'''hårdkoda''', progammerarslang för att frångå principerna om att göra program anpassningsbara.&lt;br /&gt;
Jämför med att skruva fast möbler i golv och väggar i stället för att bara ställa dit dem.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;i&amp;quot;&amp;gt;I&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''if...else''' används i villkorssatser. De indenterade satserna som står före else utförs endast om&lt;br /&gt;
villkoret efter if blir True, annars utförs de indenterade satserna efter else. Både else och satsen efter&lt;br /&gt;
else kan utelämnas. Flera villkor kan kombineras med elif.&lt;br /&gt;
&lt;br /&gt;
'''implementera''', göra program körbara på dator (till skillnad från t ex skissa på papper).&lt;br /&gt;
&lt;br /&gt;
'''import''' används för att importera paket och enskilda funktioner till ett Pythonprogram.&lt;br /&gt;
&lt;br /&gt;
'''ingenting''' är ett värde som är svårt att representera på en dator eftersom alla minnesutrymmen&lt;br /&gt;
innehåller någonting. För tal används vanligen värdet 0; för strängar är det vanligt att använda en&lt;br /&gt;
tom sträng (&amp;quot;&amp;quot;). I Python kan man dessutom använda None för att representera att en variabel inte&lt;br /&gt;
har något värde.&lt;br /&gt;
&lt;br /&gt;
'''initialize''' se [[#i|i]]nitiera&lt;br /&gt;
&lt;br /&gt;
'''initiera''' en variabel innebär att ge den ett startvärde.&lt;br /&gt;
&lt;br /&gt;
'''inläsning''' från tangentbord görs vanligen med raw_input() eller input(). Se även [[#u|u]]tmatning.&lt;br /&gt;
&lt;br /&gt;
'''inmatning''', se [[#i|i]]nläsning.&lt;br /&gt;
&lt;br /&gt;
'''input()''', funktion i Python som läser indata från tangentbordet och tolkar det som det vore ett&lt;br /&gt;
uttryck i Python. Bra för att läsa tal. Vill man läsa inmatningen utan tolkning, t ex för att läsa text&lt;br /&gt;
använder man istället raw_input()&lt;br /&gt;
&lt;br /&gt;
'''inte''', se [[#operatorer|not]]&lt;br /&gt;
&lt;br /&gt;
'''iteration''', datorjargong för upprepning, vanligen i samband med while- och for-slingor.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;k&amp;quot;&amp;gt;K&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''katalog''', (directory, bibliotek) förvaringsutrymme för filer och kataloger.&lt;br /&gt;
&lt;br /&gt;
'''koda''', programmerarjargong för skriva programkod.&lt;br /&gt;
&lt;br /&gt;
'''kommentar''', rad i Python som börjar med # och därför ignoreras av Python-tolken. Används för&lt;br /&gt;
att förklara saker för programmeraren som inte framgår direkt av koden.&lt;br /&gt;
&lt;br /&gt;
'''kompilator''' översätter ett program från källkod (människoläsbart format) till maskinkod.&lt;br /&gt;
&lt;br /&gt;
'''kompilera''', översätta källkodsprogram med en kompilator.&lt;br /&gt;
&lt;br /&gt;
'''kompileringsfel'''. Fel som uppstår när en kompilator inte kan översätta källkoden.&lt;br /&gt;
&lt;br /&gt;
'''källkod''' är det normala sättet att representera ett program i ett format läsbart för människor. Alla&lt;br /&gt;
Pythonexempel i denna kurs är källkod. Se även maskinkod.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;l&amp;quot;&amp;gt;L&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''Lista''' är en ordnad följd av element. Varje element har ett unikt nummer från 0 till n-1, där n är&lt;br /&gt;
listans storlek. För att manipulera enskilda element i en vektor måste man använda ett heltalsindex&lt;br /&gt;
för att komma åt det. Vanligen använder man for-slingor för att gå igenom alla&lt;br /&gt;
element i en lista.&lt;br /&gt;
&lt;br /&gt;
'''litteral''' är källkodsrepresentationen av ett värde av primitiv typ, strängtyp, eller None. Exempel:&lt;br /&gt;
&amp;quot;hello&amp;quot;, 'k', 8, 1.0E4, True, None.&lt;br /&gt;
&lt;br /&gt;
'''logiska uttryck,''' uttryck med värdet True eller False. Se t ex and, or och not.&lt;br /&gt;
&lt;br /&gt;
'''logiskt fel''', fel som beror på att programmeraren inte tänkt igenom programmet ordentligt.&lt;br /&gt;
Programmet går att kompilera och köra utan felavbrott, men det gör fel saker. Använd&lt;br /&gt;
spårutskrifter för att hitta felet.&lt;br /&gt;
&lt;br /&gt;
'''loop''' se [[#s|s]]linga, [[#w|w]]hile eller [[#f|f]]or.&lt;br /&gt;
&lt;br /&gt;
'''läsa''', vad ett program gör för att komma åt nya indata. Ett program kan läsa från tangentbordet,&lt;br /&gt;
musen och filer.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;m&amp;quot;&amp;gt;M&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''maskinkod''', program som kompilerats för att passa en viss datortyp (och kan därmed inte flyttas&lt;br /&gt;
till andra sorters datorer.&lt;br /&gt;
&lt;br /&gt;
'''matematiska uttryck''', se [[#operatorer|+-*/]]&lt;br /&gt;
&lt;br /&gt;
'''method invocation''' se [[#f|f]]unktionsanrop&lt;br /&gt;
&lt;br /&gt;
'''metod''' är en funktion som är definierad i en klass.&lt;br /&gt;
&lt;br /&gt;
'''metodanrop,''' se [[#f|f]]unktionsanrop.&lt;br /&gt;
&lt;br /&gt;
'''metoddeklaration,''' se [[#m|m]]etod.&lt;br /&gt;
&lt;br /&gt;
'''minne''' finns av två sorter: primärminne (internminne) och sekundärminne (externminne). I&lt;br /&gt;
primärminnet befinner sig programmet när det körs och där finns också alla variabler som&lt;br /&gt;
används. På sekundärminnet (t ex disketter och CD-skivor) lagras information i filer.&lt;br /&gt;
&lt;br /&gt;
'''modulo''' rest vid heltalsdivision, se [[#operatorer|%]]&lt;br /&gt;
&lt;br /&gt;
==N==&lt;br /&gt;
'''negation,''' se [[#operatorer|not]]&lt;br /&gt;
&lt;br /&gt;
'''None''' är en litteral som anger att en variabel saknar värde. Se även [[#i|i]]ngenting.&lt;br /&gt;
&lt;br /&gt;
'''nyckelord''' eller reserverat ord är ett fördeklarerat ord i Python som inte får användas som&lt;br /&gt;
identifierare: and, assert, break, class, continue, def, del, elif, else, except, exec, finally, for, from,&lt;br /&gt;
global, if, import, in, is, lambda, not, or, pass, print, raise, return, try, while, yield.&lt;br /&gt;
&lt;br /&gt;
==O==&lt;br /&gt;
'''och,''' se [[#operatorer|and]]&lt;br /&gt;
&lt;br /&gt;
'''operator''' är en symbol som representerar en operation i ett programspråk. Additionsoperatorn +&lt;br /&gt;
och tilldelningsoperatorn = är exempel på operatorer i Python.&lt;br /&gt;
&lt;br /&gt;
'''or,''' se [[#e|e]]ller.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;p&amp;quot;&amp;gt;P&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''parameter''' är antingen en anropsparameter, det värde som skickas till en funktion vid ett&lt;br /&gt;
funktionsanrop, eller en formell parameter, den identifierare man använder för att namnge en&lt;br /&gt;
parameter i funktionsdeklarationen. Den formella parametern får sitt värde från anropsparametern&lt;br /&gt;
vid funktionsanropet och är en lokal variabel i funktionen.&lt;br /&gt;
&lt;br /&gt;
'''parse''' analysera eller tolka. I datorsammanhang vanligen att tolka en följd av tecken eller ord.&lt;br /&gt;
&lt;br /&gt;
'''print,''' se [[#u|u]]tskrift.&lt;br /&gt;
&lt;br /&gt;
'''prioritetsordning''' anger i vilken ordning operationer ska utföras. T ex ska 3+4*5 evalueras till 23&lt;br /&gt;
(inte 35) eftersom multiplikation har högre prioritet än addition.&lt;br /&gt;
&lt;br /&gt;
'''program''', instruktionsföljd för dator.&lt;br /&gt;
&lt;br /&gt;
'''programflöde''', ordningsföljden i vilken satserna i ett program utförs.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;r&amp;quot;&amp;gt;R&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''random''', modul som innehåller funktioner för slumptal.&lt;br /&gt;
&lt;br /&gt;
'''random()''' funktion i random som returnerar ett slumptal mellan 0 och 1.&lt;br /&gt;
&lt;br /&gt;
'''raw_input()''', funktion i Python som läser indata från tangentbordet som en sträng. Vill man tolka&lt;br /&gt;
inmatningen som det vore ett uttryck i Python, t ex om man vill läsa tal, använder man istället&lt;br /&gt;
input()&lt;br /&gt;
&lt;br /&gt;
'''read''', se [[#i|i]]nläsning&lt;br /&gt;
&lt;br /&gt;
'''redigeringsprogram''' (editor), program som kan användas för att ändra innehållet i filer.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;s&amp;quot;&amp;gt;S&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''sammansatt villkor''' är villkor som kombineras med and eller or. Se [[#l|logiskt uttryck]].&lt;br /&gt;
&lt;br /&gt;
'''sant,''' se [[#t|T]]rue.&lt;br /&gt;
&lt;br /&gt;
'''sats''' är den minsta kompletta operationen i ett program, motsvaras oftast av en rad i programmet.&lt;br /&gt;
&lt;br /&gt;
'''slinga''' (loop, snurra) är ett antal satser i ett program som utförs för alla element i en följd &lt;br /&gt;
eller så länge ett villkor är sant. I Python skapar man slingor med for eller while.&lt;br /&gt;
&lt;br /&gt;
'''slumptal''' kan fås t ex med hjälp av random().&lt;br /&gt;
&lt;br /&gt;
'''snurra,''' se [[#s|s]]linga&lt;br /&gt;
&lt;br /&gt;
'''snygg kod''' är kod som är korrekt, lättläst och lätt att ändra.&lt;br /&gt;
&lt;br /&gt;
'''spårutskrift''' utskrift som används för att man ska se vad som händer när programmet körs, så att man ska kunna hitta fel i programmet.&lt;br /&gt;
&lt;br /&gt;
'''statement''' se [[#s|s]]ats&lt;br /&gt;
&lt;br /&gt;
'''syntax''' är regler för hur satser i ett program ska skrivas i programspråket.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;t&amp;quot;&amp;gt;T&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''tilldelning''' (assignment) ger en variabel ett nytt värde. En tilldelning kan göras med&lt;br /&gt;
tilldelningsoperatorn =. När man använder tilldelningsoperatorn kommer uttrycket i högerledet att&lt;br /&gt;
evalueras och det resulterande värdet kopieras till variabeln i vänsterledet. Se även = i början av&lt;br /&gt;
detta index. Exempel:&lt;br /&gt;
n = 17 # n får värdet 17&lt;br /&gt;
i = 42 * n # i får värdet 714&lt;br /&gt;
v[2] = i-14 # tredje elementet i v får värdet 700&lt;br /&gt;
v[n] = 4711 # artonde elementet i v får värdet 4711&lt;br /&gt;
&lt;br /&gt;
'''tom sträng''' representeras av två citattecken (&amp;quot;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
'''True''', booleskt värde som representerar ett sant påstående (uppfyllt villkor). Se även [[#f|F]]alse.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;u&amp;quot;&amp;gt;U&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''Unicode''' är den standardiserade 16-bitars teckenkod som används bland annat för att representera&lt;br /&gt;
tecken i Python. Unicode innehåller de tecken som behövs för att kunna skriva texter på alla&lt;br /&gt;
vanligt förekommande språk.&lt;br /&gt;
&lt;br /&gt;
'''upprepa,''' se [[#s|s]]linga.&lt;br /&gt;
&lt;br /&gt;
'''utmatning,''' se [[#u|u]]tskrift.&lt;br /&gt;
&lt;br /&gt;
'''utskrift''', ge information till användaren genom att skriva text (till skillnad från att rita ut något).&lt;br /&gt;
För skärmutskrift används vanligen print&lt;br /&gt;
&lt;br /&gt;
'''uttryck''' (expression) är en av beståndsdelarna i en sats. Ett uttryck består av operatorer och&lt;br /&gt;
operander. Operanderna kan vara variabler, funktionsanrop, metodanrop eller litteraler. Det går att&lt;br /&gt;
beräkna värdet av ett uttryck.&lt;br /&gt;
&lt;br /&gt;
==V==&lt;br /&gt;
'''variabel''' är en identifierare (ett namn) i ett program som representerar en minnesposition där ett värde lagras när programmet körs.&lt;br /&gt;
&lt;br /&gt;
'''vektor''' se [[#l|l]]ista.&lt;br /&gt;
&lt;br /&gt;
'''villkor''' eller booleska uttryck kan bildas med booleska värden (True och False) eller variabler och&lt;br /&gt;
funktioner (med booleska värden) och med jämförelseoperatorer. Resultatet är ett värde&lt;br /&gt;
som antingen är True eller False. Används i bland annat if-satser och while-slingor. &lt;br /&gt;
Exempel: Om minaPengar innehåller ett tal så är uttrycket&lt;br /&gt;
minaPengar &amp;gt; 0 sant (True) om minaPengar har ett värde större än noll. Uttrycket är falskt (False)&lt;br /&gt;
om minaPengar är noll eller negativt. Flera villkor kan kombineras med logiska operatorer (not, and,&lt;br /&gt;
or). Värdet av ett villkor kan sparas i en variabel. &lt;br /&gt;
&lt;br /&gt;
'''villkorssats''' (conditional statement) är en sats som gör det möjligt att välja mellan ett eller flera&lt;br /&gt;
alternativa satser beroende på om ett villkor är uppfyllt eller inte. I Python skapar man&lt;br /&gt;
villkorssatser med if.&lt;br /&gt;
&lt;br /&gt;
==&amp;lt;span id=&amp;quot;w&amp;quot;&amp;gt;W&amp;lt;/span&amp;gt;==&lt;br /&gt;
'''while'''-slinga, ett sätt att åstadkomma upprepning.&lt;br /&gt;
&lt;br /&gt;
==ÅÄÖ==&lt;br /&gt;
Åäö brukar ställa till det i alla programmeringsspråk. Man kan inte använda åäö i variabelnamn.&lt;br /&gt;
Ibland får man dessutom problem när man använder det i utskrifter. Ofta försvinner dessa problem&lt;br /&gt;
om man först i programmet skriver en kommentar:&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#-*-coding: iso-8859-1-*-&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2007 11:40:25 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:Ordlista</comments>		</item>
		<item>
			<title>5. Filer</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/5._Filer</link>
			<description>&lt;p&gt;Sammanfattning: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Filer==&lt;br /&gt;
&lt;br /&gt;
Information som man vill ha kvar p&amp;amp;aring; en dator sparas p&amp;amp;aring; fil. Det kan t&amp;amp;nbsp;ex r&amp;amp;ouml;ra sig om ett brev som har skapats med hj&amp;amp;auml;lp av ett ordbehandlingsprogram, en bild som har skapats av ett ritningsprogram eller en kamera osv. Filer sparas p&amp;amp;aring; l&amp;amp;aring;ngtidsminnen som t ex datorns skivminne (h&amp;amp;aring;rddisken). N&amp;amp;auml;r man sparat en fil p&amp;amp;aring; h&amp;amp;aring;rddisken kommer filen att finnas kvar d&amp;amp;auml;r &amp;amp;auml;ven n&amp;amp;auml;r man har startat om datorn eller t&amp;amp;nbsp;ex n&amp;amp;auml;r det blir str&amp;amp;ouml;mavbrott. D&amp;amp;auml;rf&amp;amp;ouml;r &amp;amp;auml;r det bra att spara den programkod man skriver p&amp;amp;aring; en fil f&amp;amp;ouml;r senare bearbetning. Dels f&amp;amp;ouml;r att det s&amp;amp;auml;llan blir r&amp;amp;auml;tt f&amp;amp;ouml;rsta g&amp;amp;aring;ngen, dels f&amp;amp;ouml;r att n&amp;amp;auml;r man v&amp;amp;auml;l provk&amp;amp;ouml;rt kommer man p&amp;amp;aring; fler saker man &amp;amp;ouml;nskar av programmet.&lt;br /&gt;
&lt;br /&gt;
Filer kan delas upp i tre sorter:&lt;br /&gt;
&lt;br /&gt;
* Vanliga filer: som inneh&amp;amp;aring;ller data (t ex text eller bildinformation).&lt;br /&gt;
* Katalog eller mapp: som inneh&amp;amp;aring;ller andra filer.&lt;br /&gt;
* L&amp;amp;auml;nkar, genv&amp;amp;auml;gar eller alias: En fil som refererar till en fil.&lt;br /&gt;
&lt;br /&gt;
Kataloger anv&amp;amp;auml;nds f&amp;amp;ouml;r att organisera filer och program. Kataloger kan inneh&amp;amp;aring;lla andra kataloger. T ex kan man spara alla filer som har skapats i samband med sommarkursen under katalogen &amp;amp;rdquo;sommarkurs&amp;amp;rdquo;. Strukturen kallas i datorsammanhang ofta f&amp;amp;ouml;r ett filtr&amp;amp;auml;d.&lt;br /&gt;
&lt;br /&gt;
L&amp;amp;auml;nkar anv&amp;amp;auml;nds t ex f&amp;amp;ouml;r att man ska kunna hitta samma fil p&amp;amp;aring; flera st&amp;amp;auml;llen. En bildfil kan ta stor plats och en popul&amp;amp;auml;r bild kan man vilja ha med p&amp;amp;aring; m&amp;amp;aring;nga st&amp;amp;auml;llen. F&amp;amp;ouml;r att slippa kopiera bilden l&amp;amp;auml;gger man d&amp;amp;aring; ist&amp;amp;auml;llet l&amp;amp;auml;nkar till den. L&amp;amp;auml;nkarna tar n&amp;amp;auml;stan ingen plats alls.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Filhantering==&lt;br /&gt;
&lt;br /&gt;
P&amp;amp;aring; n&amp;amp;auml;stan alla datorer finns det ett grafiskt anv&amp;amp;auml;ndargr&amp;amp;auml;nssnitt (det du ser p&amp;amp;aring; sk&amp;amp;auml;rmen) som kan anv&amp;amp;auml;ndas f&amp;amp;ouml;r att organisera filer med hjälp av musen, kortkommandon eller ett filhanteringsprogram.&lt;br /&gt;
&lt;br /&gt;
Filer, kataloger och l&amp;amp;auml;nkar har d&amp;amp;aring; grafiska symboler som kallas f&amp;amp;ouml;r ikoner. F&amp;amp;ouml;ljande bilder visar hur olika ikoner ser ut i ett Mac/OS X operativsystem:&lt;br /&gt;
&lt;br /&gt;
[[Bild:800176.jpg]] [[Bild:800177.jpg]] [[Bild:800178.jpg]]&lt;br /&gt;
&lt;br /&gt;
I programmeringssammanhang &amp;amp;auml;r det v&amp;amp;auml;ldigt vanligt att anv&amp;amp;auml;nda tangentbordskommandon f&amp;amp;ouml;r filhanteringen, t ex för att utföra:&lt;br /&gt;
&lt;br /&gt;
* F&amp;amp;ouml;rflyttning i filtr&amp;amp;auml;det.&lt;br /&gt;
* Kopiering av filer.&lt;br /&gt;
* Radering av filer.&lt;br /&gt;
&lt;br /&gt;
Allt detta kan man också göra i ett pythonprogram. I den här kursen begränsar vi oss dock till att visa hur man kan skapa textfiler och läsa och skriva i sådana filer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Textfiler i Python==&lt;br /&gt;
&lt;br /&gt;
Antag att det redan finns en fil som heter &amp;lt;code&amp;gt;kompisar.txt&amp;lt;/code&amp;gt; med följande innehåll:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Anna Bok&lt;br /&gt;
Caesar Davidson&lt;br /&gt;
Erling Franson&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Här är ett pythonprogram som läser innehållet i filen, rad för rad, och lagrar strängarna i en lista med namnet &amp;lt;code&amp;gt;friends&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;friends = []&lt;br /&gt;
file = open('kompisar.txt', 'rU')&lt;br /&gt;
for line in file:&lt;br /&gt;
    friends.append(line)&lt;br /&gt;
file.close()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Funktionen &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt; öppnar filen men namnet &amp;lt;code&amp;gt;kompisar.txt&amp;lt;/code&amp;gt; för läsning (&amp;lt;code&amp;gt;r&amp;lt;/code&amp;gt; betyder &amp;quot;read&amp;quot;, &amp;lt;code&amp;gt;U&amp;lt;/code&amp;gt; betyder &amp;quot;Universal newline mode&amp;quot; och är en mekanism i Python som översätter de olika tecknen för radslut som förekommer i olika operativsystem till standardtecknet &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt;). Med hjälp av en &amp;lt;code&amp;gt;for&amp;lt;/code&amp;gt;-sats går vi igenom filen rad för rad.&lt;br /&gt;
När man är klar med filen så bör man stänga den med hjälp av funktionen &amp;lt;code&amp;gt;close&amp;lt;/code&amp;gt;. Så länge en fil är öppen så har ditt program ensamrätt på den här filen och andra processor på datorn kan inte komma åt den. Om man glömmer att göra &amp;lt;code&amp;gt;close()&amp;lt;/code&amp;gt; så sker det automatiskt när programmet avslutas.&lt;br /&gt;
&lt;br /&gt;
Om man vill skapa en helt ny fil med namnet &amp;lt;code&amp;gt;kollegor.txt&amp;lt;/code&amp;gt; så kan man göra så här. Om det redan finns en fil med namnet &amp;lt;code&amp;gt;kollegor.txt&amp;lt;/code&amp;gt; så skriver man istället över innehållet i den filen. '''Var försiktig.'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;file = open('kollegor.txt', 'w')&lt;br /&gt;
file.write('Gustav Hast\n')&lt;br /&gt;
file.write('Ingemar Johansson\n')&lt;br /&gt;
file.close()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I det här fallet så ger man parametern &amp;lt;code&amp;gt;'w'&amp;lt;/code&amp;gt; (som betyder 'write') till &amp;lt;code&amp;gt;open&amp;lt;/code&amp;gt;-funktionen. Observera att man själv måste skriva ut radslutstecken om man vill att filen ska innehålla flera rader. Tecknet &amp;lt;code&amp;gt;\n&amp;lt;/code&amp;gt; är ett specialtecken som används i strängar för att markera ett radslut.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
&lt;br /&gt;
Dags för test nummer 5. Testet hittar du som vanligt under rubriken Examination&lt;br /&gt;
på kursens förstasida. Även detta test rättas automatiskt och du har möjlighet&lt;br /&gt;
att göra om testet flera gånger om du inte lyckas på första försöket.&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2007 09:53:39 GMT</pubDate>			<dc:creator>KTH.SE:u1ndpe5c</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:5._Filer</comments>		</item>
		<item>
			<title>0. Kursinformation</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/0._Kursinformation</link>
			<description>&lt;p&gt;Sammanfattning: /* Examination */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Välkommen till kursen==&lt;br /&gt;
&lt;br /&gt;
I den här distanskursen på 6hp får du lära dig grunderna i&lt;br /&gt;
programmering i programspråket Python. Kursen läses helt i&lt;br /&gt;
egen takt på distans via nätet. Enda undantaget är den&lt;br /&gt;
avslutande muntliga redovisningen som sker vid KTH,&lt;br /&gt;
Vallhallavägen, Stockholm. Laborationerna redovisas dels via&lt;br /&gt;
nätet och dels vid den avslutande muntliga redovisningen.&lt;br /&gt;
&lt;br /&gt;
==Målgrupp==&lt;br /&gt;
&lt;br /&gt;
Kursen är avsedd för alla som vill lära sig grunderna i&lt;br /&gt;
programmering men är också konstruerad för att passa in i&lt;br /&gt;
några av KTH:s utbildningsprogram.&lt;br /&gt;
&lt;br /&gt;
Kursen är i stort sett identisk med en kurs som går på KTH&lt;br /&gt;
för S, Open, CL, Media och I. Läser du kursen nu så kommer du alltså att få det lite lugnare när den går för ditt program&lt;br /&gt;
(eller så kan du hoppa på någon annan rolig kurs då).&lt;br /&gt;
&lt;br /&gt;
Om du går på något av programmen T, BD, M, P, K eller Bio&lt;br /&gt;
kommer du att få  tillgodoräkna dig 3hp av kursen i numeriska &lt;br /&gt;
metoder och programmering. Dessutom har du klarat av&lt;br /&gt;
ytterligare 3hp i din strävan mot examen.&lt;br /&gt;
&lt;br /&gt;
Om du går E, F eller D så är kursen en mycket god&lt;br /&gt;
förberedelse för  programmeringskursen i årskurs 1, men den&lt;br /&gt;
kan inte ersätta den kursen eller räknas in i examen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kursmål==&lt;br /&gt;
&lt;br /&gt;
Kursens övergripande mål är att självständigt och i grupp&lt;br /&gt;
kunna lösa problem genom att konstruera program på upp till&lt;br /&gt;
femhundra rader i ett modernt programspråk.&lt;br /&gt;
&lt;br /&gt;
Efter godkänd kurs ska du kunna&lt;br /&gt;
&lt;br /&gt;
* följa reglerna i programspråkets syntax,&lt;br /&gt;
* tillämpa och redogöra för regler för god programmeringsstil (såsom användarvänlighet, kommentarer, felhantering, strukturering, flexibilitet),&lt;br /&gt;
* upptäcka och korrigera programmeringsfel,&lt;br /&gt;
* modifiera givna program,&lt;br /&gt;
* överföra data mellan fil och program,&lt;br /&gt;
* identifiera behovet av och använda styrstrukturer (villkorssatser och slingor),&lt;br /&gt;
* dela upp ett större problem i hanterliga delar och konstruera funktioner för dessa,&lt;br /&gt;
* använda de datastrukturer som finns inbyggda i programspråket, samt välja datastrukturer som passar för det aktuella problemet,&lt;br /&gt;
* utveckla enkla grafiska användargränssnitt,&lt;br /&gt;
* granska andras program&lt;br /&gt;
&lt;br /&gt;
för att ha möjlighet att&lt;br /&gt;
&lt;br /&gt;
* använda programmering för att lösa problem,&lt;br /&gt;
* tillämpa problemlösningsmetodiken även inom andra områden än programmering,&lt;br /&gt;
* diskutera programutveckling med experter,&lt;br /&gt;
* bedöma kommersiella program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Anmälan och registrering==&lt;br /&gt;
&lt;br /&gt;
Antagning och registrering sker efter att du börjat jobba med&lt;br /&gt;
kursmaterialet och slutfört det första momentet.&lt;br /&gt;
&lt;br /&gt;
Grundläggande behörighet (avslutad gymnasieutbildning eller&lt;br /&gt;
motsvarande inklusive svenska, matematik och engelska) krävs&lt;br /&gt;
för att bli antagen. Även om du inte uppfyller behörighetskraven&lt;br /&gt;
just nu, har du möjlighet att arbeta med kursen.&lt;br /&gt;
Poängen på kursen kommer då att registreras när du,&lt;br /&gt;
eventuellt senare, uppfyller behörighetskraven.&lt;br /&gt;
Du kan direkt sätta igång och arbeta i kursen så&lt;br /&gt;
fort du erhållit användarnamn för inloggning.&lt;br /&gt;
&lt;br /&gt;
Det är ditt eget ansvar att styrka din behörighet. Det gör du genom att kontrollera att dina meriter finns registrerade på www.studera.nu eller skicka in vidimerade kopior på handlingar som styrker din behörighet enligt anvisningarna på kursens informationssida http://www.kth.se/rcn/kursutbud/datavetenskap/1.13634&lt;br /&gt;
&lt;br /&gt;
Programstudenter på KTH anmäler sig till kursen genom att få kursen vald av sin studievägledare.&lt;br /&gt;
&lt;br /&gt;
För att bli formellt registrerad på kursen i Ladok (högskolans&lt;br /&gt;
databas) måste du vara behörig samt bekräfta din studieplats.&lt;br /&gt;
Detta gör du genom att logga in till kursen och påbörja dina&lt;br /&gt;
studier.&lt;br /&gt;
Du måste också räknas som aktiv på kursen. Detta innebär att&lt;br /&gt;
du måste slutföra det första avsnittet för att få en formell&lt;br /&gt;
registrering på kursen. Om du inte slutför det&lt;br /&gt;
avsnittet i kursen kommer ingen antagning eller registrering att&lt;br /&gt;
äga rum.&lt;br /&gt;
&lt;br /&gt;
Du bestämmer själv när du vill starta och hur länge du håller&lt;br /&gt;
på. Det finns inga bundna tider och du kan anpassa dig helt&lt;br /&gt;
efter dina övriga planer. Det finns inte heller några formella&lt;br /&gt;
krav på att du slutför kurserna inom en given tid (såvida du&lt;br /&gt;
inte söker studiemedel och då måste uppfylla CSN:s krav på&lt;br /&gt;
prestationer innan du söker studiemedel nästa gång).&lt;br /&gt;
&lt;br /&gt;
===Omregistrering===&lt;br /&gt;
&lt;br /&gt;
Om du har påbörjat kursen en tidigare termin så har du kvar&lt;br /&gt;
din studieplats och är välkommen att fortsätta arbeta med&lt;br /&gt;
kursen under läsåret tills du är färdig. Om du önskar&lt;br /&gt;
utnyttja denna möjlighet är det bara att fortsätta att jobba&lt;br /&gt;
i kursen genom att logga in med ditt användarnamn.&lt;br /&gt;
&lt;br /&gt;
===Avregistrering===&lt;br /&gt;
&lt;br /&gt;
Följande gäller för avregistrering på högskolekurser: Har&lt;br /&gt;
studenten inte alls, eller knappt, börjat kan vi avregistrera.&lt;br /&gt;
Sker avanmälan inom tre veckor från kursstart registreras&lt;br /&gt;
&amp;quot;tidigt avbrott&amp;quot; vilket gör det möjligt att söka om till&lt;br /&gt;
samma kurs (i de fall där det är viktigt). Vid senare datum&lt;br /&gt;
registreras &amp;quot;avbrott&amp;quot; som medför att man begär omregistrering&lt;br /&gt;
om man vill återuppta sina studier på kursen.&lt;br /&gt;
&lt;br /&gt;
==Examination==&lt;br /&gt;
&lt;br /&gt;
Under kursens gång finns det sex stycken automaträttade test.&lt;br /&gt;
Det finns också tre stycken inlämningsuppgifter som skickas&lt;br /&gt;
in och rättas av en assistent. Observera att lösningar till samtliga uppgifter&lt;br /&gt;
ska göras individuell.&lt;br /&gt;
&lt;br /&gt;
Kursen avslutas med ett större programmeringsprojekt,&lt;br /&gt;
en så kallad P-uppgift, som redovisas i fyra steg: tre&lt;br /&gt;
inlämningar och en avslutande redovisning som man gör&lt;br /&gt;
personligen på KTH i Stockholm.&lt;br /&gt;
&lt;br /&gt;
För att bli godkänd på kursen måste man vara klar&lt;br /&gt;
med de sex testen och alla inlämningsuppgifter samt&lt;br /&gt;
besöka KTH för en muntlig redovisning av P-uppgiften.&lt;br /&gt;
Samtliga moment utom den avslutande muntliga redovisningen&lt;br /&gt;
görs på distans.&lt;br /&gt;
&lt;br /&gt;
Kursmomenten rapporteras på följande sätt till Ladok:&lt;br /&gt;
&lt;br /&gt;
* LAB1 (1,5hp) blir man godkänd på när man gjort inlämningsuppg 1-3.&lt;br /&gt;
* LAB2 (1,5hp) blir man godkänd på när man gjort test 1-6.&lt;br /&gt;
* LAB3 (3hp) blir man godkänd på när man gjort samtliga uppgifter i bilda samt den muntliga redovisningen på KTH.&lt;br /&gt;
&lt;br /&gt;
Betyget på kursen bestäms helt av den avslutande P-uppgiften.&lt;br /&gt;
Det finns sex betygssteg, A-F, där A är det högsta betyget.&lt;br /&gt;
A-E är alla godkända betyg och F är underkänt.&lt;br /&gt;
De exakt reglerna för betygsättningen hittar du i&lt;br /&gt;
avsnitt 7-10 som handlar om P-uppgiften.&lt;/div&gt;</description>
			<pubDate>Tue, 26 Jun 2007 09:24:35 GMT</pubDate>			<dc:creator>KTH.SE:u1ndpe5c</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:0._Kursinformation</comments>		</item>
		<item>
			<title>Macintosh OS X: Öppna terminalfönster</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/Macintosh_OS_X:_%C3%96ppna_terminalf%C3%B6nster</link>
			<description>&lt;p&gt;Sammanfattning: Ny sida: ==Öppna terminal på Macintosh==      &amp;lt;p&amp;gt;På OS X-datorer fås ett terminalfönster med programmet &amp;quot;X11&amp;quot; (eller Terminal om du inte har X11). I Finder (klicka på den glada blå gubben i D...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Öppna terminal på Macintosh==&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;På OS X-datorer fås ett terminalfönster med programmet &amp;quot;X11&amp;quot; (eller Terminal om du inte har X11). I Finder (klicka på den glada blå gubben i Dock) trycker du ner kommando-A (dvs tryck i turordning utan att släppa någon tangent: äppel/sevärdhetstangenten bredvid mellanslagstangenten–skift-A). I mappen som öppnas finns det en mapp som heter &amp;quot;Verktygsprogram&amp;quot; (&amp;quot;Utilities&amp;quot; om du har en engelsk version) och i den finns programmet X11 (och/eller Terminal). Dubbelklicka som vanligt för att starta det.&amp;lt;/p&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 25 Jun 2007 14:12:46 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:Macintosh_OS_X:_%C3%96ppna_terminalf%C3%B6nster</comments>		</item>
		<item>
			<title>Köra Pyton i Windows</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/K%C3%B6ra_Pyton_i_Windows</link>
			<description>&lt;p&gt;Sammanfattning: Ny sida: ==Köra Python på en Windowsdator==      &amp;lt;p&amp;gt;När du startar python får du en kommandotolk. Där du kan skriva in pythoninstruktioner och de utförs direkt. Så här ser det ut om man vill...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Köra Python på en Windowsdator==&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;När du startar python får du en kommandotolk. Där du kan skriva in pythoninstruktioner och de utförs direkt. Så här ser det ut om man vill skriva ut &amp;quot;Hej&amp;quot;.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Bild:python_tolk.jpg]]&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Om man vill skriva större program och spara programmet måste man starta en texteditor där man skriver in programinstruktionerna. Man kan använda notepad eller den inbyggda editorn som man startar så här:&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:python_start_edit.jpg]]&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Skriv programmet i det nya fönstret.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
[[Bild:python_edit.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Spara programmet i en fil.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Bild:python_save.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Döp programmet med filändelsen &amp;lt;em&amp;gt;.py&amp;lt;/em&amp;gt; i exemplet nedan sparas programmet som &amp;lt;em&amp;gt;mitt_program.py&amp;lt;/em&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:python_file_name.jpg]]&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Kör ditt program genom att välja &amp;lt;em&amp;gt;run module&amp;lt;/em&amp;gt; i Run-menyn.&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Bild:python_run_module.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Programmet körs i fönstret med pythontolken.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Bild:python_run_result.jpg]]&lt;/div&gt;</description>
			<pubDate>Mon, 25 Jun 2007 14:08:51 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:K%C3%B6ra_Pyton_i_Windows</comments>		</item>
		<item>
			<title>Python hjälp</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/Python_hj%C3%A4lp</link>
			<description>&lt;p&gt;Sammanfattning: Ny sida: ==Att få hjälp med Python==      &amp;lt;p&amp;gt;Du kan läsa mer om Python med den inyggda hjälpen. I Windows startar du hjälpen antingen via start-knappen eller inifrån Python:&amp;lt;/p&amp;gt;      [[Bild:st...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Att få hjälp med Python==&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Du kan läsa mer om Python med den inyggda hjälpen. I Windows startar du hjälpen antingen via start-knappen eller inifrån Python:&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Bild:start_python_help.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Välj &amp;lt;em&amp;gt;tutorial&amp;lt;/em&amp;gt; från startsidan och sedan det avsnitt du vill läsa mer om.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:python_help_start.jpg]]&lt;/div&gt;</description>
			<pubDate>Mon, 25 Jun 2007 14:04:54 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:Python_hj%C3%A4lp</comments>		</item>
		<item>
			<title>Starta Python i Windows</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/Starta_Python_i_Windows</link>
			<description>&lt;p&gt;Sammanfattning: /* Att starta Pyton */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Att starta Python==&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;När du installerat Python kan du starta Python via startknappen. Beroende på operativsystem, språk och inställningar kan det se lite olika ut. På Windows 2000 ser det ut så här:&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Bild:starta_python.jpg]]&lt;/div&gt;</description>
			<pubDate>Mon, 25 Jun 2007 14:00:03 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:Starta_Python_i_Windows</comments>		</item>
		<item>
			<title>Windows: Installation och start av Python</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/Windows:_Installation_och_start_av_Python</link>
			<description>&lt;p&gt;Sammanfattning: /* Installation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Installera Python-tolk på Windowsdator==&lt;br /&gt;
&amp;lt;p&amp;gt;Här följer instruktioner för hur du installerar Python på en Windowsdator.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Efter installationen kan du klicka på någon av följande länkar för att få mer information om hur du använder Python.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Starta Python i Windows]]&lt;br /&gt;
&lt;br /&gt;
[[Köra Pyton i Windows]]&lt;br /&gt;
&lt;br /&gt;
[[Python hjälp]]&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Gå till [http://www.python.org Pythons hemsida]. Välj download i menyn till vänster. Tryck på länken Windows installer.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Bild:Ladda_ner.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Kör installationsprogrammet genom att trycka på &amp;lt;em&amp;gt;run&amp;lt;/em&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Bild:Run_inst.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Vänta medan programmet laddas ner.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Bild:Venta.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;När installationsprogrammet startar kan det hända att du får en varning att inte köra programmet. Kör programmet ändå.&amp;lt;/p&amp;gt;&lt;br /&gt;
[[Bild:varning.jpg]]&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Installationsprogrammet ställer en rad frågor. Den första frågan gäller var du ska installera python. Om du vill ändra på den föreslagna sökvägen gör du det här annars trycker du &amp;lt;em&amp;gt;next&amp;lt;/em&amp;gt; för att komma vidare.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
[[Bild:var_installera.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Om du inte vill installera allting kan du välja bort paket annars trycker du &amp;lt;em&amp;gt;next&amp;lt;/em&amp;gt; för att komma vidare.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Bild:vad_installera.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Vänta medan programmet installeras.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Bild:venta_igen.jpg]]&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Tryck på &amp;lt;em&amp;gt;finish&amp;lt;/em&amp;gt; för att avsluta  installationen&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
[[Bild:klar.jpg]]&lt;/div&gt;</description>
			<pubDate>Mon, 25 Jun 2007 13:41:53 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:Windows:_Installation_och_start_av_Python</comments>		</item>
		<item>
			<title>Länk till instruktioner för Python-tolk</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/L%C3%A4nk_till_instruktioner_f%C3%B6r_Python-tolk</link>
			<description>&lt;p&gt;Sammanfattning: /* Python tolk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Python tolk==&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;p&amp;gt;För att kunna provköra exemplen och egen kod behöver du en Python-tolk. Du som har en Linux eller Macintosh OS X-dator har redan en sådan på datorn. Om du använder en Windows-dator måste du först installera den. Du klarar dig även utan tolk än så länge, men det blir roligare när man kan prova själv. Det finns också en hel utvecklingsmiljö till Python som heter IDLE och är gratis. Mer information om Python kan du hitta på [http://www.python.org/ Pythons hemsida]. IDLE går att hämta [http://www.python.org/download/ här] och fungerar på såväl Windows, Mac OS X som Linux.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;För att komma åt tolken behöver du dessutom öppna ett terminalfönster. Ett terminalfönster används för att skriva kommandon direkt till datorn utan att använda det grafiska gränssnittet. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;p&amp;gt;Nedan finns länkar till öppnings- och installationsanvisningar för olika operativsystem.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
[[Windows: Installation och start av Python]]&lt;br /&gt;
&lt;br /&gt;
[[Macintosh OS X: Öppna terminalfönster]]&lt;br /&gt;
&lt;br /&gt;
==Starta Python, alla datortyper==&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Oavsett vilken datortyp du har, när du väl har öppnat ett terminalfönster kan du starta Python på två olika sätt. Dels kan du låta tolken köra ett redan skrivet program genom att skriva &amp;quot;python filnamn&amp;quot; i terminalfönstret (där filnamnet är namnet på det program du vill köra). Dels kan du starta tolken i interaktiv mod genom att skriva enbart &amp;quot;python&amp;quot; och trycka retur i terminalfönstret (observera att Unix-datorer (som Linux och OS X) skiljer på versaler och gemena (stora och små bokstäver) i terminalfönstret). Detta går att göra även i Windows från ett terminalfönster (se 4.3 hur man öppnar ett sådant) men om du ändå har installerat IDLE enligt ovan är det enklare att använda det.&amp;lt;/p&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;p&amp;gt;Startar du på det första sättet gäller det att hålla reda på var filen finns (mer om det i avsnitt 4 Filhantering), men det går enkelt att ändra i programmet med något redigeringsprogram. Startar du på det andra sättet kommer varje sats du skriver att tolkas omedelbart av tolken, vilket kan vara både bra och dåligt. En nackdel är dock att ändringar i ett program kan bara korrigeras genom att du skriver om programmet rad för rad.&amp;lt;/p&amp;gt;&lt;/div&gt;</description>
			<pubDate>Mon, 25 Jun 2007 13:11:36 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:L%C3%A4nk_till_instruktioner_f%C3%B6r_Python-tolk</comments>		</item>
		<item>
			<title>4. Filhantering</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/4._Filhantering</link>
			<description>&lt;p&gt;Sammanfattning: /* Inlämningsuppgift 2 (Rondelet) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Vad har man funktioner till?==&lt;br /&gt;
&lt;br /&gt;
Stora program är besvärligare att konstruera än små.&lt;br /&gt;
Men man kan göra det enklare för sig genom att dela&lt;br /&gt;
upp programmet i funktioner. En funktion är som ett&lt;br /&gt;
litet delprogram i programmet.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Snigeltavling.jpg]]&lt;br /&gt;
&lt;br /&gt;
När man anordnar tävlingar med riktiga sniglar tar det mycket&lt;br /&gt;
lång tid innan deltagarna kommer i mål. Vi ska istället skriva&lt;br /&gt;
ett litet program som simulerar en tävling mellan två sniglar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
             ---------------------------------------------------&lt;br /&gt;
             |          VEM HAR DEN SNABBASTE SNIGELN?         |&lt;br /&gt;
             |                                                 |&lt;br /&gt;
             |  Här får din snigel tävla mot en vältränad      |&lt;br /&gt;
             |  racersnigel. Skriv in namnet på din snigel     |&lt;br /&gt;
             |  så sätter tävlingen igång!                     |&lt;br /&gt;
             ---------------------------------------------------&lt;br /&gt;
Vad heter din snigel? Ebba&lt;br /&gt;
Klara...färdiga...gå!&lt;br /&gt;
&lt;br /&gt;
        Ebba: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @&lt;br /&gt;
Racersnigeln: - - - - - - - - - - - - - - - - - - - - - - - - - - - @&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Det här loppet tog en oväntad vändning, Ebba vann!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Dela upp ett problem i funktioner==&lt;br /&gt;
&lt;br /&gt;
För att programmet ska bli enklare att skriva bestämmer vi&lt;br /&gt;
först vilka funktioner vi ska ha. Det är inte alls självklart&lt;br /&gt;
hur programmet ska delas upp i funktioner; samma problem&lt;br /&gt;
kan lösas på många olika sätt! Vi vill se till att varje&lt;br /&gt;
funktion har ett enda uppdrag.&lt;br /&gt;
&lt;br /&gt;
Här är ett förslag på uppdelning:&lt;br /&gt;
&lt;br /&gt;
# Skriv ut informationsrutan och läs in namnet på snigeln&lt;br /&gt;
# Simulera tävlingen och rita upp banorna&lt;br /&gt;
# Skriv ut vem som vann&lt;br /&gt;
&lt;br /&gt;
Ettan och tvåan består av flera olika moment. Vi gör det&lt;br /&gt;
ännu enklare för oss genom att dela upp i ännu mindre delar:&lt;br /&gt;
&lt;br /&gt;
# Skriv ut informationsrutan&lt;br /&gt;
# Läs in namnet på en snigel&lt;br /&gt;
# Simulera tävlingen&lt;br /&gt;
# Rita upp en snigels bana&lt;br /&gt;
# Skriv ut vem som vann&lt;br /&gt;
&lt;br /&gt;
Vi börjar med att skriva in dessa moment som kommentarer i&lt;br /&gt;
filen snigel.py, för att vi ska hålla reda på vad som&lt;br /&gt;
är kvar att göra. Då får vi också en kommentar för varje&lt;br /&gt;
funktion, så att det syns vad som händer var.&lt;br /&gt;
&lt;br /&gt;
[[Bild:Books.jpg|thumb]]&lt;br /&gt;
'''Fråga: Tänk om vi ville skriva ett program för stavningskontroll, i vilka funktioner skulle vi då dela upp det?'''&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Till exempel följande:  inläsning av ordlistan, kontroll av ett ord mot ordlistan, utskrift av rättelseförslag &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Definiera en funktion==&lt;br /&gt;
&lt;br /&gt;
Först kommer funktionshuvudet (första raden i funktionen). Exempel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def visaInformation():&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Bild:Huvud.jpg|thumb|left]]&lt;br /&gt;
Funktionshuvudet består av fyra delar.&lt;br /&gt;
* Ordet def (talar om att en funktion ska definieras här)&lt;br /&gt;
* Funktionens namn, gärna ett verb som beskriver vad funktionen gör&lt;br /&gt;
* Ett par parenteser ()&lt;br /&gt;
* Ett kolon&lt;br /&gt;
&lt;br /&gt;
Under funktionshuvudet kommer funktionskroppen, som helt enkelt är&lt;br /&gt;
en följd av indenterade satser som funktionen ska utföra.&lt;br /&gt;
Så här ser hela funktionen ut:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Skriver ut informationsrutan&lt;br /&gt;
def visaInformation():&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
             ---------------------------------------------------&lt;br /&gt;
             |          VEM HAR DEN SNABBASTE SNIGELN?         |&lt;br /&gt;
             |                                                 |&lt;br /&gt;
             |  Här får din snigel tävla mot en vältränad      |&lt;br /&gt;
             |  racersnigel. Skriv in namnet på din snigel     |&lt;br /&gt;
             |  så sätter tävlingen igång!                     |&lt;br /&gt;
             ---------------------------------------------------&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(För att kunna skriva en sträng som sträcker sig över flera rader&lt;br /&gt;
så startar och avslutar vi strängen med tre stycken &amp;quot;-tecken.&lt;br /&gt;
Vanliga trängar, som börjar och slutar med enkelt&lt;br /&gt;
citattecken, kan nämligen inte innehålla radbrytningar.)&lt;br /&gt;
&lt;br /&gt;
Lägg till koden ovan i din fil snigel.py och provkör.&lt;br /&gt;
&lt;br /&gt;
Men vad nu - programmet skriver inte ut något alls?&lt;br /&gt;
Gå vidare till nästa avsnitt för att få reda på varför!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Anropa en funktion==&lt;br /&gt;
&lt;br /&gt;
Satserna i funktionskroppen utförs inte om inte funktionen&lt;br /&gt;
anropas. Anropet ska stå längst ner i programmet, under&lt;br /&gt;
funktionsdefinitionerna. Den delen av programmet kallar vi&lt;br /&gt;
huvudprogrammet.&lt;br /&gt;
&lt;br /&gt;
Anropet består bara av funktionens namn följt av ett parentespar.&lt;br /&gt;
Om du lägger till anropet sist i ditt program ska alltihop se ut så här:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Skriver ut informationsrutan&lt;br /&gt;
def visaInformation():&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
             ---------------------------------------------------&lt;br /&gt;
             |          VEM HAR DEN SNABBASTE SNIGELN?         |&lt;br /&gt;
             |                                                 |&lt;br /&gt;
             |  Här får din snigel tävla mot en vältränad      |&lt;br /&gt;
             |  racersnigel. Skriv in namnet på din snigel     |&lt;br /&gt;
             |  så sätter tävlingen igång!                     |&lt;br /&gt;
             ---------------------------------------------------&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Läs in namnet på en snigel&lt;br /&gt;
# Simulera tävlingen&lt;br /&gt;
# Rita upp en snigels bana&lt;br /&gt;
# Skriv ut vem som vann&lt;br /&gt;
&lt;br /&gt;
visaInformation()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Spara i filen snigel.py och provkör!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skicka utdata från en funktion (returvärden)==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Brev.jpg|right|Ett brev]]&lt;br /&gt;
Då ger vi oss på nästa funktion, som ska läsa in namnet på en snigel.&lt;br /&gt;
Namnet på snigeln är utdata från funktionen. Den som kör programmet&lt;br /&gt;
och knappar in namnet tycker förstås att det är indata, men&lt;br /&gt;
ur funktionens synvinkel är det nåt som ska skickas ut.&lt;br /&gt;
&lt;br /&gt;
För att skicka ut ett värde ur funktionen skriver vi ordet&lt;br /&gt;
return följt av den variabel vi vill skicka ut värdet på.&lt;br /&gt;
Funktionen som läser in namnet kommer att se ut så här:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def lasNamn():&lt;br /&gt;
    namn = raw_input(&amp;quot;Vad heter din snigel? &amp;quot;)&lt;br /&gt;
    return namn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
När vi ska anropa funktionen måste vi ta hänsyn till att den&lt;br /&gt;
returnerar ett värde. Därför skriver vi anropet i en tilldelningssats,&lt;br /&gt;
med en variabel till vänster som får ta emot det returnerade värdet.&lt;br /&gt;
Variabeln behöver inte ha samma namn som variabeln i return-satsen&lt;br /&gt;
inuti funktionen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dinSnigelsNamn = lasNamn()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
När den här satsen utförs av Python kommer följande att hända. Först&lt;br /&gt;
anropas funktionen lasNamn, som läser in namnet och returnerar det.&lt;br /&gt;
Sen kommer det returnerade värdet att lagras i variabel dinSnigelsNamn.&lt;br /&gt;
&lt;br /&gt;
Vi lägger in den nya i filen snigel.py och provkör.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Skriver ut informationsrutan&lt;br /&gt;
def visaInformation():&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
             ---------------------------------------------------&lt;br /&gt;
             |          VEM HAR DEN SNABBASTE SNIGELN?         |&lt;br /&gt;
             |                                                 |&lt;br /&gt;
             |  Här får din snigel tävla mot en vältränad      |&lt;br /&gt;
             |  racersnigel. Skriv in namnet på din snigel     |&lt;br /&gt;
             |  så sätter tävlingen igång!                     |&lt;br /&gt;
             ---------------------------------------------------&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Läs in namnet på en snigel&lt;br /&gt;
def lasNamn():&lt;br /&gt;
    namn = raw_input(&amp;quot;Vad heter din snigel? &amp;quot;)&lt;br /&gt;
    return namn&lt;br /&gt;
&lt;br /&gt;
# Simulera tävlingen&lt;br /&gt;
# Rita upp en snigels bana&lt;br /&gt;
# Skriv ut vem som vann&lt;br /&gt;
&lt;br /&gt;
visaInformation()&lt;br /&gt;
dinSnigelsNamn = lasNamn()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Men hur ska vi veta om det fungerade eller inte?&lt;br /&gt;
Jo, vi lägger in en kontrollutskrift&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
print &amp;quot;Din snigel heter alltså&amp;quot;, dinSnigelsNamn&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
allra sist i programmet. Kontrollutskrifter är ett enkelt sätt&lt;br /&gt;
att se om programmet fungerar som det ska, och är till stor&lt;br /&gt;
nytta när man försöker ta reda på varför programmet inte gör&lt;br /&gt;
som det ska.&lt;br /&gt;
&lt;br /&gt;
Provkör igen. När programmet fungerar kan du ta bort kontrollutskriften!&lt;br /&gt;
&lt;br /&gt;
Det här är viktigt, så vi tar ett exempel till, den här gången med&lt;br /&gt;
två returvärden. Nästa funktion ska simulera tävlingen, på det&lt;br /&gt;
här viset:&lt;br /&gt;
* Sniglarna startar bägge på startstrecket, dvs vid 0&lt;br /&gt;
* Vi skriver ut Klara...färdiga...gå&lt;br /&gt;
* Och startar själva tävlingen, som representeras av en while-slinga&lt;br /&gt;
* I varje varv i slingan låter vi sniglarna ta varsitt skutt av slumpmässig längd&lt;br /&gt;
* När någon av sniglarna (eller bägge) passerar mållinjen så avbryter vi&lt;br /&gt;
* Sist returnerar vi bägge sniglarnas slutpositioner&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def tavling():&lt;br /&gt;
    snigelbana1 = 0&lt;br /&gt;
    snigelbana2 = 0&lt;br /&gt;
    print &amp;quot;Klara...färdiga...gå! \n&amp;quot;&lt;br /&gt;
    while snigelbana1 &amp;lt; DISTANS and snigelbana2 &amp;lt; DISTANS:&lt;br /&gt;
        snigelbana1 += random.randrange(5)&lt;br /&gt;
        snigelbana2 += random.randrange(5)&lt;br /&gt;
    return snigelbana1, snigelbana2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I return-satsen allra sist kan vi se att två värden&lt;br /&gt;
returneras, åtskilda med kommatecken. Givetvis måste vi då också&lt;br /&gt;
ta emot två värden i huvudprogrammet.&lt;br /&gt;
&lt;br /&gt;
Den distans (i centimeter) som sniglarna ska tillryggalägga&lt;br /&gt;
representeras av konstanten DISTANS. En variabel som ska&lt;br /&gt;
ha ett konstant värde under hela programmet brukar man&lt;br /&gt;
skriva med stora bokstäver, VERSALER. Python bryr sig inte om det, men&lt;br /&gt;
andra människor som läser programmet kan se vad man menar.&lt;br /&gt;
Vi definierar DISTANS överst i huvudprogrammet, och frågar&lt;br /&gt;
oss om den kommer att synas inuti funktionen?&lt;br /&gt;
&lt;br /&gt;
Lägg in den nya funktionen i snigel.py, enligt nedan. Glöm inte&lt;br /&gt;
att lägga in kontrollutskrifter av snigelbana1 och snigelbana2&lt;br /&gt;
innan du provkör!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import random&lt;br /&gt;
&lt;br /&gt;
# Skriver ut informationsrutan&lt;br /&gt;
def visaInformation():&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
             ---------------------------------------------------&lt;br /&gt;
             |          VEM HAR DEN SNABBASTE SNIGELN?         |&lt;br /&gt;
             |                                                 |&lt;br /&gt;
             |  Här får din snigel tävla mot en vältränad      |&lt;br /&gt;
             |  racersnigel. Skriv in namnet på din snigel     |&lt;br /&gt;
             |  så sätter tävlingen igång!                     |&lt;br /&gt;
             ---------------------------------------------------&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Läser in namnet på användarens snigel&lt;br /&gt;
def lasNamn():&lt;br /&gt;
    namn = raw_input(&amp;quot;Vad heter din snigel? &amp;quot;)&lt;br /&gt;
    return namn&lt;br /&gt;
&lt;br /&gt;
# Simulerar en tävling mellan två sniglar&lt;br /&gt;
def tavling():&lt;br /&gt;
    snigelbana1 = 0&lt;br /&gt;
    snigelbana2 = 0&lt;br /&gt;
    print &amp;quot;Klara...färdiga...gå! \n&amp;quot;&lt;br /&gt;
    while snigelbana1 &amp;lt; DISTANS and snigelbana2 &amp;lt; DISTANS:&lt;br /&gt;
        snigelbana1 += random.randrange(5)&lt;br /&gt;
        snigelbana2 += random.randrange(5)&lt;br /&gt;
    return snigelbana1, snigelbana2&lt;br /&gt;
&lt;br /&gt;
DISTANS = 30&lt;br /&gt;
visaInformation()&lt;br /&gt;
dinSnigelsNamn = lasNamn()&lt;br /&gt;
snigelbana1, snigelbana2 = tavling()&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
När du fått det här att fungera så ska vi ta en ny titt på funktionen&lt;br /&gt;
tavling. Ser du att vi gör precis samma sak med variablerna snigelbana1&lt;br /&gt;
och snigelbana2? Först sätts variablerna till noll, sedan jämför vi&lt;br /&gt;
bägge med DISTANS i while-slingans villkor, och inuti while-slingan&lt;br /&gt;
ökas bägge med ett slumpat värde. Sist returneras bägge värdena.&lt;br /&gt;
Det här kallas för &amp;lt;em&amp;gt;kodupprepning&amp;lt;/em&amp;gt; och det ska man försöka&lt;br /&gt;
undvika, av följande skäl:&lt;br /&gt;
* Det blir mer kod att skriva, vilket ger fler felkällor&lt;br /&gt;
* Programmet blir svårare att underhålla - när man ska införa ändringar måste man ändra för bägge variablerna&lt;br /&gt;
* Det ser fult ut&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Skicka indata till en funktion (parametrar)==&lt;br /&gt;
&lt;br /&gt;
I det här avsnittet ska vi sona vårt stilbrott genom att skriva&lt;br /&gt;
en generell funktion för utskrift av en snigels bana. Funktionen ska gå&lt;br /&gt;
att använda för vilken snigel som helst.&lt;br /&gt;
&lt;br /&gt;
Utskriften av en snigelbana kan se ut så här:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
        Ebba: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
Vad vill vi kunna variera från en snigel till en annan? Två saker - snigelns&lt;br /&gt;
namn och banans längd. Säg att vår funktion heter &amp;lt;code&amp;gt;ritaBanan&amp;lt;/code&amp;gt;.&lt;br /&gt;
Här följer tre olika exempel på hur en sån funktion skulle kunna anropas:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ritaBanan(&amp;quot;Ebba&amp;quot;, 31)&lt;br /&gt;
ritaBanan(&amp;quot;Racersnigeln&amp;quot;, 28)&lt;br /&gt;
ritaBanan(dinSnigelsNamn, snigelBana1)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De två värden eller variabler som står innanför parenteserna i anropet&lt;br /&gt;
kallas för &amp;lt;em&amp;gt;parametrar&amp;lt;/em&amp;gt;. När vi definierar funktionen måste vi&lt;br /&gt;
namnge alla parametrarna. Vi kallar dom för &amp;lt;code&amp;gt;snigelnamn&amp;lt;/code&amp;gt;&lt;br /&gt;
respektive &amp;lt;code&amp;gt;langd&amp;lt;/code&amp;gt;. Så här ser funktionen ut.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def ritaBanan(snigelnamn,langd):&lt;br /&gt;
    print snigelnamn.rjust(12) + &amp;quot;:&amp;quot;,&lt;br /&gt;
    for i in range(1,langd):&lt;br /&gt;
        print &amp;quot;-&amp;quot;,                 # slemspåret&lt;br /&gt;
    print &amp;quot;@&amp;quot;                      # snigeln&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Du har nog inte sett rjust förut? Det är en strängmetod som&lt;br /&gt;
högerjusterar strängen i givet antal positioner. Namnen kommer&lt;br /&gt;
då att sluta i samma position (12), så att våra snigelbanor kan&lt;br /&gt;
starta i samma läge.&lt;br /&gt;
&lt;br /&gt;
De två anropen av funktionen ritaBanan kommer att se ut så här:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ritaBanan(dinSnigelsNamn,snigelbana1)&lt;br /&gt;
ritaBanan(&amp;quot;Racersnigeln&amp;quot;,snigelbana2)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vi lägger till den sista funktionen också, den som ska skriva ut&lt;br /&gt;
vem som vann. Som indata till funktionen vill vi skicka in längden&lt;br /&gt;
på sniglarnas banor samt sniglarnas namn, alltså totalt fyra olika&lt;br /&gt;
parametrar. så här blir det:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def utseVinnare(langd1, langd2, namn1, namn2=&amp;quot;Racersnigeln&amp;quot;):&lt;br /&gt;
    print langd1, langd2&lt;br /&gt;
    print &amp;quot;\n&amp;quot;&lt;br /&gt;
    if langd1 &amp;gt;= DISTANS and langd2 &amp;gt;= DISTANS:&lt;br /&gt;
        print &amp;quot;Det blev oavgjort.&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        if langd1 &amp;gt;= DISTANS:&lt;br /&gt;
            print &amp;quot;Det här loppet tog en oväntad vändning,&amp;quot; , namn1, &amp;quot;vann!&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            print namn2, &amp;quot;vann, som vanligt.&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den sista parametern har fått ett skönsvärde, alltså ett värde som&lt;br /&gt;
används om vi inte skickar in något på den platsen. Då kan man om man&lt;br /&gt;
vill utelämna den parametern i anropet, på det här viset:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
utseVinnare(snigelbana1, snigelbana2, dinSnigelsNamn)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu sätter vi ihop alltihop och provkör:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import random&lt;br /&gt;
&lt;br /&gt;
# Skriver ut informationsrutan&lt;br /&gt;
def visaInformation():&lt;br /&gt;
    print &amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
             ---------------------------------------------------&lt;br /&gt;
             |          VEM HAR DEN SNABBASTE SNIGELN?         |&lt;br /&gt;
             |                                                 |&lt;br /&gt;
             |  Här får din snigel tävla mot en vältränad      |&lt;br /&gt;
             |  racersnigel. Skriv in namnet på din snigel     |&lt;br /&gt;
             |  så sätter tävlingen igång!                     |&lt;br /&gt;
             ---------------------------------------------------&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Läser in namnet på användarens snigel&lt;br /&gt;
def lasNamn():&lt;br /&gt;
    namn = raw_input(&amp;quot;Vad heter din snigel? &amp;quot;)&lt;br /&gt;
    return namn&lt;br /&gt;
&lt;br /&gt;
# Simulerar en tävling mellan två sniglar&lt;br /&gt;
def tavling():&lt;br /&gt;
    snigelbana1 = 0&lt;br /&gt;
    snigelbana2 = 0&lt;br /&gt;
    print &amp;quot;Klara...färdiga...gå! \n&amp;quot;&lt;br /&gt;
    while snigelbana1 &amp;lt; DISTANS and snigelbana2 &amp;lt; DISTANS:&lt;br /&gt;
        snigelbana1 += random.randrange(5)&lt;br /&gt;
        snigelbana2 += random.randrange(5)&lt;br /&gt;
    return snigelbana1, snigelbana2&lt;br /&gt;
&lt;br /&gt;
# Ritar en snigelbana&lt;br /&gt;
def ritaBanan(snigelnamn,langd):&lt;br /&gt;
    print snigelnamn.rjust(12) + &amp;quot;:&amp;quot;,&lt;br /&gt;
    for i in range(1,langd):&lt;br /&gt;
        print &amp;quot;-&amp;quot;,    #slemspåret&lt;br /&gt;
    print &amp;quot;@&amp;quot;         # snigeln&lt;br /&gt;
&lt;br /&gt;
# Skriver ut vinnaren&lt;br /&gt;
def utseVinnare(langd1, langd2, namn1, namn2=&amp;quot;Racersnigeln&amp;quot;):&lt;br /&gt;
    print langd1, langd2&lt;br /&gt;
    print &amp;quot;\n&amp;quot;&lt;br /&gt;
    if langd1 &amp;gt;= DISTANS and langd2 &amp;gt;= DISTANS:&lt;br /&gt;
        print &amp;quot;Det blev oavgjort.&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        if langd1 &amp;gt;= DISTANS:&lt;br /&gt;
            print &amp;quot;Det här loppet tog en oväntad vändning,&amp;quot; , namn1, &amp;quot;vann!&amp;quot;&lt;br /&gt;
        else:&lt;br /&gt;
            print namn2, &amp;quot;vann, som vanligt.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DISTANS = 30&lt;br /&gt;
visaInformation()&lt;br /&gt;
dinSnigelsNamn = lasNamn()&lt;br /&gt;
snigelbana1, snigelbana2 = tavling()&lt;br /&gt;
ritaBanan(dinSnigelsNamn,snigelbana1)&lt;br /&gt;
ritaBanan(&amp;quot;Racersnigeln&amp;quot;,snigelbana2)&lt;br /&gt;
utseVinnare(snigelbana1, snigelbana2, dinSnigelsNamn)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Rekursion==&lt;br /&gt;
[[Bild:Droste.jpg|Bild på kakaopaket|thumb]]&lt;br /&gt;
&lt;br /&gt;
Nu börjar vi om med ett helt nytt problem. Vi vill skriva ett&lt;br /&gt;
program som räknar ut summan av dom första n heltalen, t ex&lt;br /&gt;
1+2+3+4=10. Det här är ett så enkelt problem, så det räcker&lt;br /&gt;
med en enda funktion. Hur ska vi beräkna summan då? Vi &lt;br /&gt;
förenklar problemet lite: Säg att vi ska räkna ut summan av de&lt;br /&gt;
fem första heltalen. Då kan vi först räkna ut summan av de fyra&lt;br /&gt;
första heltalen och sen lägga till fem. Men summan av de &lt;br /&gt;
fyra första heltalen är ju lätt att räkna ut - det är ju&lt;br /&gt;
summan av de tre första heltalen plus fyra. Och så vidare...&lt;br /&gt;
&lt;br /&gt;
Vi skriver summaberäkningen som en funktion, och låter den&lt;br /&gt;
räkna enligt mönstret summa(n) = summa(n-1) + n. &lt;br /&gt;
Funktionen har n som parameter, och programmet ser ut så här:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def summa(n):&lt;br /&gt;
    return summa(n-1) + n&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Välkommen till summaberäkningsprogrammet!&amp;quot;&lt;br /&gt;
print &amp;quot;Här beräknas summan 1+2+3+...n&amp;quot;&lt;br /&gt;
n = input(&amp;quot;Vilket tal ska vara det sista i summan? &amp;quot;)&lt;br /&gt;
print &amp;quot;Summan = &amp;quot;, summa(n)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Provkörde du? Isåfall kan det vara bra att komma ihåg att man kan avbryta&lt;br /&gt;
ett program med Ctrl-C. Det som händer här är att funktionen summa &lt;br /&gt;
anropar sig själv i all oändlighet. Vad beror det på?&lt;br /&gt;
&lt;br /&gt;
Jo, vi har glömt att tala om när beräkningen ska avbrytas. Anropar&lt;br /&gt;
vi med n=3, så kommer funktionen att försöka räkna ut&lt;br /&gt;
summa(2), summa(1), summa(0), summa(-1) och så vidare.&lt;br /&gt;
&lt;br /&gt;
Vi vill ju att det minsta talet i summan ska vara 1, och det måste&lt;br /&gt;
vi ange i funktionen. Nytt försök:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def summa(n):&lt;br /&gt;
    if n &amp;gt; 1:&lt;br /&gt;
        return summa(n-1) + n&lt;br /&gt;
    else:&lt;br /&gt;
        return 1&lt;br /&gt;
&lt;br /&gt;
print &amp;quot;Välkommen till summaberäkningsprogrammet!&amp;quot;&lt;br /&gt;
n = input(&amp;quot;Vilket tal ska vara det sista i summan? &amp;quot;)&lt;br /&gt;
print &amp;quot;Summan = &amp;quot;, summa(n)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Det här fungerade väl bra? Att lösa ett problem genom att låta en&lt;br /&gt;
funktion anropa sig själv kallas rekursion. Det man behöver är:&lt;br /&gt;
* ''Rekursiv tanke:'' som reducerar problemet till ett enklare problem med samma struktur&lt;br /&gt;
* ''Basfall:'' det måste finnas ett fall som inte leder till rekursivt anrop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
&lt;br /&gt;
Dags för test nummer 4. Testet hittar du som vanligt under rubriken Examination&lt;br /&gt;
på kursens förstasida. Även detta test rättas automatiskt och du har möjlighet&lt;br /&gt;
att göra om testet flera gånger om du inte lyckas på första försöket.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inlämningsuppgift 2 (Rondelet) ==&lt;br /&gt;
&lt;br /&gt;
''Inlämningsuppgiften är individuell och får inte lösas i grupp.''&lt;br /&gt;
&lt;br /&gt;
I den här inlämningsuppgiften ska du skriva ett antal funktioner för att&lt;br /&gt;
göra ett program som skapar en dikt av en inläst text. &lt;br /&gt;
Programmet ska läsa in fyra meningar och sedan skriva ut texten&lt;br /&gt;
uppdelad på följande rader:&lt;br /&gt;
&lt;br /&gt;
# Textens fyra första ord&lt;br /&gt;
# Resten av första meningen&lt;br /&gt;
# Textens fyra första ord igen&lt;br /&gt;
# Andra meningen&lt;br /&gt;
# Tredje meningen&lt;br /&gt;
# Fjärde meningen&lt;br /&gt;
# Textens fyra första ord en sista gång&lt;br /&gt;
&lt;br /&gt;
Texten kommer då att likna en ''rondelet'' - en fransk diktform.&lt;br /&gt;
&lt;br /&gt;
Här är ett exempel på en körning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                DIKTAUTOMATEN&lt;br /&gt;
&lt;br /&gt;
Skriv in fyra meningar och få ut en rondelet!&lt;br /&gt;
&lt;br /&gt;
Skriv mening nr 1: Det fanns ingen fil när jag handlade på Konsum.&lt;br /&gt;
Skriv mening nr 2: Bananerna var också slut.&lt;br /&gt;
Skriv mening nr 3: Jag köpte bröd istället.&lt;br /&gt;
Skriv mening nr 4: Nån sorts limpa med mycket fibrer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DET FANNS INGEN FIL&lt;br /&gt;
&lt;br /&gt;
Det fanns ingen fil&lt;br /&gt;
när jag handlade på Konsum.&lt;br /&gt;
Det fanns ingen fil&lt;br /&gt;
Bananerna var också slut.&lt;br /&gt;
Jag köpte bröd istället.&lt;br /&gt;
Nån sorts limpa med mycket fibrer.&lt;br /&gt;
Det fanns ingen fil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Tips===&lt;br /&gt;
&lt;br /&gt;
Medan du testar programmet kan du ersätta anropet av din inläsningsfunktion&lt;br /&gt;
med tilldelningssatser. På det sättet slipper du skriva in fyra meningar&lt;br /&gt;
varje gång du testkör ditt program!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# För testning:&lt;br /&gt;
sentence[0] = &amp;quot;Det fanns ingen fil när jag handlade på Konsum.&lt;br /&gt;
sentence[1] = &amp;quot;Bananerna var också slut.&lt;br /&gt;
sentence[2] = &amp;quot;Jag köpte bröd istället.&lt;br /&gt;
sentence[3] = &amp;quot;Nån sorts limpa med mycket fibrer.&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Det finns en användbar metod i Python som heter &amp;lt;code&amp;gt;split()&amp;lt;/code&amp;gt; med vars&lt;br /&gt;
hjälp du kan dela upp en mening så att det blir en lista av enskilda ord.&lt;br /&gt;
Här är ett exempel som visar hur man använder &amp;lt;code&amp;gt;split()&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;mening = &amp;quot;En ganska kort mening.&amp;quot;&lt;br /&gt;
lista = mening.split()&lt;br /&gt;
# lista har nu värdet [&amp;quot;En&amp;quot;, &amp;quot;ganska&amp;quot;, &amp;quot;kort&amp;quot;, &amp;quot;mening.&amp;quot;]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
För att göra om små bokstäver till stora i en sträng så kan du använda metoden &amp;lt;code&amp;gt;upper()&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;mening = &amp;quot;En ganska kort mening.&amp;quot;&lt;br /&gt;
ny_mening = mening.upper()&lt;br /&gt;
# ny_mening har nu värdet &amp;quot;EN GANSKA KORT MENING.&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Inlämning===&lt;br /&gt;
&lt;br /&gt;
Programmet ska finnas i en fil med namnet &amp;lt;code&amp;gt;Uppgift2.py&amp;lt;/code&amp;gt;. Följ den här mallen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Programmeringsteknik webbkurs KTH inlämningsuppgift 2.&lt;br /&gt;
# &amp;lt;Ditt namn&amp;gt;&lt;br /&gt;
# &amp;lt;Datum&amp;gt;&lt;br /&gt;
# &amp;lt;Kort beskrivning av vad programmet gör&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Programkod&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innan du skickar in programmet så ska du se till att där inte&lt;br /&gt;
finns någon kodupprepning som kan åtgärdas med funktioner&lt;br /&gt;
och slingor.&lt;br /&gt;
&lt;br /&gt;
När du har finputsat ditt program så går du till kursens förstasida.&lt;br /&gt;
Under rubriken Examination hittar du Inlämningsuppgift&amp;amp;nbsp;2 och&lt;br /&gt;
där kan du lämna in filen Uppgift2.py. Observera att filen måste vara i textformat,&lt;br /&gt;
vilket den automatiskt blir om du skapar den med hjälp av IDLE.&lt;br /&gt;
Detta för att vi ska kunna prova och testköra ditt program.&lt;/div&gt;</description>
			<pubDate>Mon, 25 Jun 2007 11:00:51 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:4._Filhantering</comments>		</item>
		<item>
			<title>3. Listor och Anrop</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/3._Listor_och_Anrop</link>
			<description>&lt;p&gt;Sammanfattning: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Listor==&lt;br /&gt;
&lt;br /&gt;
Oftast är den som skriver ett program dvs programmeraren inte den som kommer att använda det. Den som skriver programmet har kunskap om programmering men man ställer inga krav om kunskap i programmering för den som ska använda programmet. Detta gör att programmeraren måste skriva programmet på ett sätt så att den kan köras av olika användare med olika förväntningar.&lt;br /&gt;
&lt;br /&gt;
Antag att vi vill skriva ett program som ska läsa in fem stycken namn och när man har matat in alla fem namnen skrivs de ut i omvänd ordning (dvs sista namnet först).&lt;br /&gt;
&lt;br /&gt;
Med den programmeringskunskap du har idag är detta fullt möjligt. Det är bara att använda sig av fem olika variabler för att lagra namnen och sedan skriva ut dem i omvänd ordning, som programmet nedan. (Funktionen &amp;lt;code&amp;gt;raw_input&amp;lt;/code&amp;gt; fungerar ungefär som &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt;. Skillnaden är att &amp;lt;code&amp;gt;raw_input&amp;lt;/code&amp;gt; inte försöker översätta indata till lämpligt format utan läser in hela raden som en teckensträng som kan bestå av både bokstäver, siffor, mellanslag och andra tecken.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;namn1 = raw_input(&amp;quot;Ange ett namn: &amp;quot;)&lt;br /&gt;
namn2 = raw_input(&amp;quot;Ange ett namn: &amp;quot;)&lt;br /&gt;
namn3 = raw_input(&amp;quot;Ange ett namn: &amp;quot;)&lt;br /&gt;
namn4 = raw_input(&amp;quot;Ange ett namn: &amp;quot;)&lt;br /&gt;
namn5 = raw_input(&amp;quot;Ange ett namn: &amp;quot;)&lt;br /&gt;
print namn5, namn4, namn3, namn2, namn1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programmeraren har bestämt att 5 och endast 5 namn ska matas in. Programmet fungerar varken för färre eller fler antal namn.&lt;br /&gt;
&lt;br /&gt;
Det vore bättre om programmet ställer en fråga om hur många namn som ska matas in i början av programmet och användarens svar på denna fråga avgör om hur många variabler som ska användas till att lagra alla namn. Men programmeraren kan fortfarande inte veta hur många variabler som ska användas eftersom att olika användare kommer att kunna mata in olika antal namn. Hur ska programmeraren göra?&lt;br /&gt;
&lt;br /&gt;
Lösningen är att använda en lista.&lt;br /&gt;
&lt;br /&gt;
===Vad är en lista?===&lt;br /&gt;
&lt;br /&gt;
En lista är variabel som kan ha flera värden. Varje värde får ett eget index (nummer) som kan användas för åtkomst eller modifiering av värdet. Om en vanlig variabel fungerar som en stol så fungerar en lista som en bänkrad i en biograf när det är numrerad placering. Telefonnummerlistan i din mobil är ett exempel på en lista.&lt;br /&gt;
&lt;br /&gt;
===Hur använder man en lista?===&lt;br /&gt;
&lt;br /&gt;
Listor skrivs med hjälp av klamrar []&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;namnlista = 3*[None]&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Bild:800156.jpg]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;namnlista&amp;lt;/code&amp;gt; blir då en variabel som har plats för 3 olika värden. None betyder att alla platserna ska vara lediga. Om man vill tilldela första platsen i variabeln ett värde t ex talet 47 gör man på följande sätt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;namnlista[0] = 47&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Bild:800157.jpg]]&lt;br /&gt;
&lt;br /&gt;
I ovanstående rad är namnlista namnet på listan. [0] specificerar avsedd plats i listan, 0 är ett index som används för specificera första plats. =47 som vi vet sedan tidigare är en tilldelningssats. Hela raden gör att första plats i listan får värdet 47. Programmerare är lite lustiga på det sättet att 0 betyder första plats i en lista. Detta gäller i flera programspråk, t ex Java och C++.&lt;br /&gt;
&lt;br /&gt;
Om man vill tilldela andra plats i listan ett nytt värde t ex &amp;quot;hej&amp;quot; använder man därför indexet 1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;namnlista[1] = &amp;quot;hej&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Bild:800158.jpg]]&lt;br /&gt;
&lt;br /&gt;
För att skriva alla värden som finns i listan kan man skriva som nedan:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;print namnlista&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om man endast vill skriva ut värdet på en specifik plats i vektorn får man använda sig av klamrar igen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;print namnlista[2]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Raden ovan skrivet ut värdet som finns på tredje platsen i listan.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hur många platser har följande lista?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;bilar = 16*[None]&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 16&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Åter till exemplet===&lt;br /&gt;
&lt;br /&gt;
Nu när vi har lärt oss lite om listor ska vi försöka skriva programmet som frågar efter ett antal namn och skriver ut dem i omvänd ordning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; 1. antal_namn=input(&amp;quot;Hur många namn vill du mata in? &amp;quot;)&lt;br /&gt;
 2. namnlista = antal_namn*[None]&lt;br /&gt;
 3. i = 0&lt;br /&gt;
 4. while i &amp;lt; antal_namn:&lt;br /&gt;
 5.     namnlista[i] = raw_input(&amp;quot;Ange ett namn: &amp;quot;)&lt;br /&gt;
 6.     i += 1&lt;br /&gt;
 7. j = antal_namn - 1&lt;br /&gt;
 8. while j&amp;gt;= 0: &lt;br /&gt;
 9.     print namnlista[j]&lt;br /&gt;
10.     j -= 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I rad nr 1 frågar programmet efter ett tal (antal namn) inmatningen lagras i variabeln antal_namn.&lt;br /&gt;
&lt;br /&gt;
I rad 2 skapar vi en lista som har lika många platser som användarens svar från första raden.&lt;br /&gt;
&lt;br /&gt;
I rad 3 använder vi iterationsvariabeln &amp;quot;i&amp;quot; som ska användas i while-slingan som finns i rad 4-6.&lt;br /&gt;
&lt;br /&gt;
Rad 4 -6 är en while-slinga som ska upprepa satsen i rad 5 så länge variabeln i är mindre än antalen namn som ska matas in.&lt;br /&gt;
&lt;br /&gt;
Rad 5 frågar användaren efter ett namn och svaret kommer att lagras på i:te platsen i namnlista. I rad 6 vi ökar det värde som i har med 1.&lt;br /&gt;
&lt;br /&gt;
En sammanfattning av den första while-slingan är att variabeln &amp;quot;i&amp;quot; startar med värdet 0 och i första varvet i slingan kommer att namnlista[i] alltså motsvara namnlista[0] eftersom i är 0. Alltså tilldelas första plats i listan ett nytt värde. Sedan när &amp;quot;i&amp;quot; ökas med 1 så får variabeln i värdet 1. Och i andra varvet kommer namnlista[i] motsvara namnlista[1] dvs andra plats i listan osv.&lt;br /&gt;
&lt;br /&gt;
Detta upprepas tills i blir lika med antal_namn och alla platser i listan har fått ett värde.&lt;br /&gt;
&lt;br /&gt;
När while-slingan i rad 4-6 är klar kommer listan innehålla så många namn som användaren ville mata in. Nu är det dags att programmet skriver ut alla namn i omvänd ordning. För att skriva ut sista namnet först måste vi ta reda på index för den sista namn som matades in.&lt;br /&gt;
&lt;br /&gt;
Vi vet att index för första namnet är 0, index för andra namnet är 1 och index för tredje namnet är 2 osv. Men vad är index för det sista namnet?&lt;br /&gt;
&lt;br /&gt;
Vi vet att antal namn som har matats in är lika många som värdet antal_namn (rad 1 i programmet). Om antal_namn t ex har värdet 10 så ska sista namnet ha placerats i plats nummer 9(=10-1).&lt;br /&gt;
&lt;br /&gt;
I rad nummer 7 vill vi tilldela variabeln j ett startvärde, startvärdet ska vara samma värde som index för sista namnet i listan. Med ovanstående kunskap vet vi att j=antal_namn-1 kommer att vara index för den sista plats i listan.&lt;br /&gt;
&lt;br /&gt;
Rad 8-10 är en while-sats som skriver alla element från namnlista i omvänd ordning.&lt;br /&gt;
&lt;br /&gt;
Så här fungerar den andra while-satsen. Variabeln &amp;quot;j&amp;quot; har ett startvärde som är lika med index för sista platsen. While-satsen ska upprepa print-satsen(rad 9) så länge variabeln &amp;quot;j&amp;quot; har ett värde som är större eller lika med 0. Första varvet i slingan kommer att namnlista[j] motsvara sista namnet som finns i listan eftersom att &amp;quot;j&amp;quot; har just ett värde som är lika stort som index för sista namnet. På rad 10 kommer värdet av variabeln &amp;quot;j&amp;quot; minskas med 1. Alltså &amp;quot;j&amp;quot; kommer att ha samma värde som index för näst sista namnet i listan och därför i andra varvet i slingan kommer att namnlista[j] motsvar näst sista namn i listan osv.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Antag att vi har listan ages med ålder på 50 personer. Vilket av följande är korrekt om man vill komma åt femtonde elementet i listan?'''&lt;br /&gt;
# ages[14]&lt;br /&gt;
# ages14&lt;br /&gt;
# ages15&lt;br /&gt;
# ages, 14&lt;br /&gt;
# ages[15]&lt;br /&gt;
# ages, 15&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 1. ages[14]&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Antag att vi har listan &amp;lt;code&amp;gt;ages&amp;lt;/code&amp;gt; med ålder på 50 personer. Vilket av följande kodexempel summerar alla element i listan &amp;lt;code&amp;gt;ages&amp;lt;/code&amp;gt;?'''&lt;br /&gt;
1. &amp;lt;pre&amp;gt;i = 0&lt;br /&gt;
sum = 0&lt;br /&gt;
while i &amp;lt; 50:&lt;br /&gt;
  sum += ages + i&lt;br /&gt;
  i += 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
2. &amp;lt;pre&amp;gt;i = 0&lt;br /&gt;
sum = 0&lt;br /&gt;
while i &amp;lt; 50:&lt;br /&gt;
  sum += ages[i]&lt;br /&gt;
  i += 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
3. &amp;lt;pre&amp;gt;summera(ages)&amp;lt;/pre&amp;gt;&lt;br /&gt;
4. &amp;lt;pre&amp;gt;i = 0&lt;br /&gt;
sum = 0&lt;br /&gt;
while i &amp;lt; 50&lt;br /&gt;
  sum += i&lt;br /&gt;
  i += 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; kodexempel 2&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Mer om listor===&lt;br /&gt;
&lt;br /&gt;
Det finns ytterligare några list-kommandon som är bra att känna till. Man kan lägga till ett nytt element i slutet av en lista med hjälp av &amp;lt;code&amp;gt;append()&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;namn = [&amp;quot;Adam&amp;quot;, &amp;quot;Bertil&amp;quot;, &amp;quot;Ceasar&amp;quot;]&lt;br /&gt;
namn.append(&amp;quot;David&amp;quot;)    # Listan namn utökas till [&amp;quot;Adam&amp;quot;, &amp;quot;Bertil&amp;quot;, &amp;quot;Ceasar&amp;quot;, &amp;quot;David&amp;quot;]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kan också slå samman två listor med hjälp av ett vanligt plus-tecken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;a = [1, 2, 3] + [4, 5]    # Resultatet blir [1, 2, 3, 4, 5]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Slutligen kan man plocka ut dellistor på följande sätt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;veckodagar = [&amp;quot;mån&amp;quot;, &amp;quot;tis&amp;quot;, &amp;quot;ons&amp;quot;, &amp;quot;tor&amp;quot;, &amp;quot;fre&amp;quot;, &amp;quot;lör&amp;quot;, &amp;quot;sön&amp;quot;]&lt;br /&gt;
vardagar = veckodagar[0:5]   # plockar ut elementen fr o m index 0 t o m index 4 i listan&lt;br /&gt;
helgdagar = veckodagar[5:7]  # plockar ut elementen fr o m index 5 t o m index 6 i listan&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om du vill lära dig ännu mer om listor så finns det en länk på kursens [[huvudsida]] under rubriken [[Huvudsida#Pythonlänkar|Pythonlänkar]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Uppslagslistor==&lt;br /&gt;
&lt;br /&gt;
Ibland så har man en mängd data där det inte är naturligt att numrera elementen som i en vanlig lista.&lt;br /&gt;
Då kan man istället använda en uppslagslista (dictionary). En uppslagslista består av ett antal poster,&lt;br /&gt;
där varje post har en nyckel och ett värde. I följande exempel så håller vi reda på antalet dagar per månad med hjälp av en uppslagslista. I varje post så finns det en nyckel, som är en textsträng som innehåller månadens namn, och ett värde, som är ett tal som anger antalet dagar i månaden. Man kan använda både strängar och tal som nycklar och värden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;month = {&amp;quot;jan&amp;quot;:31, &amp;quot;feb&amp;quot;:28, &amp;quot;mar&amp;quot;:31, &amp;quot;apr&amp;quot;:30, &amp;quot;maj&amp;quot;:31, &amp;quot;jun&amp;quot;:30,&lt;br /&gt;
         &amp;quot;jul&amp;quot;:31, &amp;quot;aug&amp;quot;:31, &amp;quot;sep&amp;quot;:30, &amp;quot;okt&amp;quot;:31, &amp;quot;nov&amp;quot;:30, &amp;quot;dec&amp;quot;:31}&lt;br /&gt;
&lt;br /&gt;
print month[&amp;quot;feb&amp;quot;]   # Skriver ut 28&lt;br /&gt;
month[&amp;quot;feb&amp;quot;] = 29    # Ändrar &amp;quot;feb&amp;quot;:s värde till 29&lt;br /&gt;
print month[&amp;quot;feb&amp;quot;]   # Skriver ut 29&lt;br /&gt;
&lt;br /&gt;
# Tar bort en post och lägger till två nya i uppslagslistan.&lt;br /&gt;
del month[&amp;quot;feb&amp;quot;]&lt;br /&gt;
month[&amp;quot;feb_vanlig&amp;quot;] = 28&lt;br /&gt;
month[&amp;quot;feb_skotte&amp;quot;] = 29&lt;br /&gt;
&lt;br /&gt;
# Skriver ut False eftersom månaden &amp;quot;qui&amp;quot; inte finns med i uppslagslistan.&lt;br /&gt;
# (Quintilis döptes om till juli för att ära Julius Caesar.)&lt;br /&gt;
print month.has_key(&amp;quot;qui&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Metoden keys() ger en lista med alla nycklar i uppslagslistan.&lt;br /&gt;
# Utskriften blir (observera att en uppslagslista inte är ordnad):&lt;br /&gt;
# ['mar', 'okt', 'aug', 'sep', 'apr', 'jun', 'feb_vanlig',&lt;br /&gt;
#  'jul', 'jan', 'feb_skotte', 'nov', 'maj', 'dec']&lt;br /&gt;
names = month.keys() &lt;br /&gt;
print names&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Slingor==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Loop.jpg|right|frame]]&lt;br /&gt;
&lt;br /&gt;
Det är så pass vanligt att man går igenom listor eller strängar från början till slut att det finns ett särskilt kommando för detta i Python, den så kallade for-satsen. Utskriften från följande program&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;tanter = [&amp;quot;Brun&amp;quot;, &amp;quot;Grön&amp;quot;, &amp;quot;Gredelin&amp;quot;]&lt;br /&gt;
for tant in tanter:&lt;br /&gt;
    print &amp;quot;Tant&amp;quot;, tant&amp;lt;/pre&amp;gt;&lt;br /&gt;
blir&lt;br /&gt;
&amp;lt;pre&amp;gt;Tant Brun&lt;br /&gt;
Tant Grön&lt;br /&gt;
Tant Gredelin&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For-satsen har alltså följande format&lt;br /&gt;
&amp;lt;pre&amp;gt;for &amp;lt;index&amp;gt; in &amp;lt;lista&amp;gt;:&lt;br /&gt;
    &amp;lt;sats&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
där &amp;lt;index&amp;gt; är ett variabelnamn, &amp;lt;lista&amp;gt; en lista och &amp;lt;sats&amp;gt; en sats som kommer att utföras&lt;br /&gt;
en gång för varje element i listan. I det första varvet av listan så kommer variabeln &amp;lt;index&amp;gt; att innehålla&lt;br /&gt;
det första elementet i listan, i det andra varvet så innehåller den det andra elementet, och så vidare.&lt;br /&gt;
&lt;br /&gt;
For-kommandot kan också användas för att gå igenom de flesta ordnade typer, till exempel en sträng. Här är ett exempel där vi använder en for-sats för att kontrollera om tecknet W finns med i en sträng:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;alfabetet =&amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ&amp;quot;&lt;br /&gt;
for bokstav in alfabetet:&lt;br /&gt;
    if bokstav == &amp;quot;W&amp;quot;:&lt;br /&gt;
        print &amp;quot;Ja, W fanns med i alfabetet!&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For-satsen är också mycket användbar om man vill gå igenom en lista av tal, sådana listor kan man nämligen snabbt och lätt skapa med hjälp av kommandot &amp;lt;code&amp;gt;range()&amp;lt;/code&amp;gt;. Här är ett exempel:&lt;br /&gt;
&amp;lt;pre&amp;gt;#Skriver ut: 1 2 3 4 5 6 7 8 9&lt;br /&gt;
for i in range(1, 10):&lt;br /&gt;
    print i,&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man anger en range med hjälp av startvärde, slutvärde och uppräkning. Observera att startvärdet finns med i listan, slutvärdet är däremot en övre gräns som inte finns med i listan. Här är ett par exempel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;a = range(100)         # [0, 1, 2, 3,..., 99]&lt;br /&gt;
b = range(0, 100, 5)   # [0, 5, 10, 15,..., 95]&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Moduler==&lt;br /&gt;
&lt;br /&gt;
Stora program delar man upp i mindre delar med bland annat funktioner. Funktionerna kan placeras i olika filer. En fil med en samling av funktioner kallas för modul. För att vi ska kunna använda en viss funktion från en viss modul måste vi importera tillhörande modul innan anropet av funktionen. Importeringen kan man göra med en enkel import-sats som vi förklarar nedan.&lt;br /&gt;
&lt;br /&gt;
Man kan ha stort nytta av modularisering i program. Med modularisering kan man återanvända kod vilket gör att man inte behöver lägga tid på och anstränga sig för att skriva en motsvarande kod som redan har skrivits. Dessutom blir stora program med flera tusen rader kod mer överskådliga om de delas upp på ett bra sätt i moduler. I denna kurs tar vi inte upp hur man modulariserar utan vi nöjer oss med att lära hur man anropar funktioner som finns i moduler.&lt;br /&gt;
&lt;br /&gt;
När man installerar Python medföljer en hel del moduler. För att använda en funktion som finns i en modul måste man importera modulen. Detta gör man med hjälp av reserverade orden &amp;lt;code&amp;gt;from, import&amp;lt;/code&amp;gt; och modulnamnet. Information om vilka moduler som följer med och vilka funktioner finns i varje modul kan man hitta på  http://docs.python.org/lib/lib.html.&lt;br /&gt;
&lt;br /&gt;
Anta att vi behöver beräkna roten ur 23 i ett program. Vi har från http://docs.python.org/lib/lib.html fått informationen att i modulen &amp;lt;code&amp;gt;math&amp;lt;/code&amp;gt; finns en funktion som heter &amp;lt;code&amp;gt;sqrt(x)&amp;lt;/code&amp;gt; som beräknar roten ur x och returnerar svaret. För att använda funktionen ska man importera modulen genom att skriva följande sats:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from math import *&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Först nu efter importeringen kan vi anropa funktionen &amp;lt;code&amp;gt;sqrt&amp;lt;/code&amp;gt; enligt nedan:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;sqrt(23)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Observera att import-satsen behöver endast vara med en enda gång för att man ska kunna anropa en funktion flera gånger i ett program. Ett bra ställe för import-satser är därför i början av programmet.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad betyder modularisering?'''&lt;br /&gt;
# Dela upp ett program i fristående delar.&lt;br /&gt;
# Slå ihop två program till ett.&lt;br /&gt;
# Slå ihop flera program till två.&lt;br /&gt;
# Slå ihop tre program till ett.&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 1&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vad är modularisering bra för?'''&lt;br /&gt;
# För att man ska kunna återanvända kod.&lt;br /&gt;
# För att man kommer att höja prestanda hos programmet.&lt;br /&gt;
# För att man ska få ett mer överskådligt program.&lt;br /&gt;
# Är ett sätt att gömma undan kod så att andra inte ska kunna förstå programmet.&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 1 och 3&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Random==&lt;br /&gt;
&lt;br /&gt;
[[Bild:dice.jpg|left|frame]]&lt;br /&gt;
&lt;br /&gt;
Ett exempel på en modul som man kan importera är random som förser programmeraren med slumptal. Ibland vill vi att ett program ska vara of&amp;amp;ouml;ruts&amp;amp;auml;gbart. Dvs det ska inte g&amp;amp;aring; att f&amp;amp;ouml;rutse vad som kommer att h&amp;amp;auml;nda i n&amp;amp;auml;sta stund av programmet. Detta beteende &amp;amp;auml;r v&amp;amp;auml;ldigt vanlig i t ex spel d&amp;amp;auml;r spelet byter strategier eller beter sig olika vid olika tillf&amp;amp;auml;llen. T ex ett &amp;amp;auml;ventyrsspel d&amp;amp;auml;r det pl&amp;amp;ouml;tsligt kan dyka upp ett monster. Detta kan man &amp;amp;aring;stadkomma med hj&amp;amp;auml;lp av slumpfunktionen random() som finns i modulen random. En modul &amp;amp;auml;r en samling med funktioner och annat som kan vara till anv&amp;amp;auml;ndning i m&amp;amp;aring;nga program och &amp;amp;auml;r ett s&amp;amp;auml;tt att organisera funktioner. Mera information om modulen Random hittar du bland [[Huvudsida#Pythonlänkar|pythonlänkarna]] på kursens [[huvudsida]].&lt;br /&gt;
&lt;br /&gt;
F&amp;amp;ouml;r att kunna anv&amp;amp;auml;nda funktionen random() m&amp;amp;aring;ste man ha importerat modulen random i programmet, detta g&amp;amp;ouml;r man med den enkla import-satsen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from random import *&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Efter denna sats kan man anropa funktionen random() som genererar ett slumptal (decimal) fr&amp;amp;aring;n och med 0 till 1. Till exempel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;from random import *&lt;br /&gt;
s_tal = random()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;s_tal&amp;lt;/code&amp;gt; kommer d&amp;amp;aring; att ha ett v&amp;amp;auml;rde som &amp;amp;auml;r mindre &amp;amp;auml;n 1 och st&amp;amp;ouml;rre eller lika med 0.&lt;br /&gt;
&lt;br /&gt;
Om man vill generera heltal s&amp;amp;aring; kan man anv&amp;amp;auml;nda funktionen &amp;lt;code&amp;gt;randrange()&amp;lt;/code&amp;gt; som ocks&amp;amp;aring; finns i modulen random.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;h_tal=randrange(1,3)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Variabeln &amp;lt;code&amp;gt;h_tal&amp;lt;/code&amp;gt; kommer att bli heltalet 1 eller heltalet 2. &amp;lt;code&amp;gt;randrange(a,b)&amp;lt;/code&amp;gt; betyder att slumpa ett heltal, heltalet kommer att vara st&amp;amp;ouml;rre eller lika med &amp;lt;code&amp;gt;a&amp;lt;/code&amp;gt; och mindre &amp;amp;auml;n &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''När skriver följande program texten &amp;quot;Det kommer att bli en solig sommar&amp;quot;?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;from random import *&lt;br /&gt;
weather = random()&lt;br /&gt;
if weather &amp;lt; 0.2 :&lt;br /&gt;
  print &amp;quot;Det kommer att bli en solig sommar&amp;quot;&lt;br /&gt;
else:&lt;br /&gt;
  print &amp;quot;Det kommer att bli en regnig sommar&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
# Alltid.&lt;br /&gt;
# Endast när slumptalet som genererats av &amp;lt;code&amp;gt;weather = random()&amp;lt;/code&amp;gt; är större än 0.2.&lt;br /&gt;
# Endast om det inte regnar när man kör programmet.&lt;br /&gt;
# Aldrig.&lt;br /&gt;
# Endast när slumptalet som genererats av &amp;lt;code&amp;gt;weather = random()&amp;lt;/code&amp;gt; är mindre än 0.2.&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 5&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
&lt;br /&gt;
Dags för test nummer 3. Testet hittar du som vanligt under rubriken&lt;br /&gt;
Examination på kursens förstasida. Även detta test rättas automatiskt&lt;br /&gt;
och du har möjlighet att göra om testet flera gånger om du inte&lt;br /&gt;
lyckas på första försöket.&lt;/div&gt;</description>
			<pubDate>Mon, 25 Jun 2007 09:41:46 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:3._Listor_och_Anrop</comments>		</item>
		<item>
			<title>2. Styrstrukturer</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/2._Styrstrukturer</link>
			<description>&lt;p&gt;Sammanfattning: /* Inlämningsuppgift 1 (Prat i kvadrat) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Mamma ska resa till mormor över helgen. Hon är orolig för att lille Lasse, som ska vara alldeles ensam hemma, kommer att klä sig för tunt och vill därför ha ett program som hjälper honom med klädseln. För att kunna skriva ett sådant program behöver vi lära oss två saker: hur man läser inmatning från tangentbordet och hur man jämför tal.''&lt;br /&gt;
&lt;br /&gt;
==Inläsning==&lt;br /&gt;
&lt;br /&gt;
För att läsa från tangentbordet använder man en input-sats, t ex&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;temperatur = input()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Efter denna sats kommer variablen temperatur att innehålla det som den som körde programmet skrev på tangentbordet (och avslutade med returtangenten). Tyvärr är det svårt för den som kör programmet att fatta att det är just temperatur som ska matas in eftersom programmet inte frågar efter något. Det fixar man lätt med en print-sats:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Exempel som visar hur inläsning går till.&lt;br /&gt;
print &amp;quot;Ge utetemperatur: &amp;quot;&lt;br /&gt;
temperatur = input()&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den här konstruktionen (skriv ut fråga och läs in svar) är så vanlig att man ordnat ett förkortat skrivsätt för den:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Exempel som visar hur inläsning kan göras kortare.&lt;br /&gt;
temperatur = input(&amp;quot;Ge utetemperatur: &amp;quot;)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Viktigt att förstå är att input-satser läser inmatningen i den ordning den kommer. Det går inte att hoppa över någon del av inmatningen. Om någon skriver t ex 17[retur]42[retur] och du endast vill läsa det andra talet (42) måste man först läsa det första (17).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad får a för värde om inmatningen från tangentbordet är 22 &amp;lt;retur&amp;gt; 42 &amp;lt;retur&amp;gt;?&lt;br /&gt;
&amp;lt;pre&amp;gt;a = input()&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 22&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad får a för värde om inmatningen från tangentbordet är 17 &amp;lt;retur&amp;gt; 12 &amp;lt;retur&amp;gt;?&lt;br /&gt;
&amp;lt;pre&amp;gt;a = input()&lt;br /&gt;
a = input()&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 12&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad får a för värde om inmatningen från tangentbordet är 22 &amp;lt;retur&amp;gt; 35 &amp;lt;retur&amp;gt;?&lt;br /&gt;
&amp;lt;pre&amp;gt;a = input()&lt;br /&gt;
b = input()&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 22&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad får a för värde om inmatningen från tangentbordet är 19 &amp;lt;retur&amp;gt; 67 &amp;lt;retur&amp;gt;?&lt;br /&gt;
&amp;lt;pre&amp;gt;b = input()&lt;br /&gt;
a = input()&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 67&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Villkor==&lt;br /&gt;
&lt;br /&gt;
När vi väl vet temperaturen kan vi kolla om den är för låg genom att skriva:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;temperatur = input(&amp;quot;Ge utetemperatur: &amp;quot;)&lt;br /&gt;
if temperatur &amp;lt; 5:&lt;br /&gt;
    print &amp;quot;Ta på dej en halsduk, lille vän!&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program kommer att se ut så här på skärmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Ge utetemperatur: 1&lt;br /&gt;
Ta på dej en halsduk, lille vän!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eller&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Ge utetemperatur: 17&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program kommer alltså att skriva ut texten &amp;quot;Ta på dig en halsduk, lille vän&amp;quot; endast om (svaret på frågan om) utetemperaturen är mindre än 5. Strukturen på en if-sats är:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;if &amp;amp;lt; BOOLESKT UTTRYCK&amp;gt; :&lt;br /&gt;
	&amp;amp;lt; EN ELLER FLERA SATSER SOM SKA EXEKVERAS&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En if-sats startar med reserverade ordet if, efter ordet if ska ett uttryck som resulterar ett booleskt värde (True eller False) komma. Efter uttrycket kommer tecknet kolon (:). Efter kolon kommer de satser som ska exekveras om värdet blir True. Dessa satser ska indenteras med mellanslags- eller tabulator-tangenten. För att undvika problem bör du inte blanda indentering gjord med mellanslag och tabbar i samma fil.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad kommer att skrivas ut av följande program om a = 12 och b = 12?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;if a &amp;lt; b:&lt;br /&gt;
    print &amp;quot;X&amp;quot;,&lt;br /&gt;
print &amp;quot;Y&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; &amp;quot;Y&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad kommer att skrivas ut av följande program om a = 4 och b = 4?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;if a &amp;lt;= b:&lt;br /&gt;
    print &amp;quot;X&amp;quot;,&lt;br /&gt;
print &amp;quot;Y&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; &amp;quot;X Y&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad kommer att skrivas ut av följande program om a = 12 och b = 17?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;if a &amp;lt; b:&lt;br /&gt;
    print &amp;quot;X&amp;quot;,&lt;br /&gt;
    print &amp;quot;Y&amp;quot;,&lt;br /&gt;
print &amp;quot;Z&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; &amp;quot;X Y Z&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad kommer att skrivas ut av följande program om a = 8 och b = 6?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;if a &amp;lt;= b:&lt;br /&gt;
    print &amp;quot;X&amp;quot;,&lt;br /&gt;
    print &amp;quot;Y&amp;quot;,&lt;br /&gt;
print &amp;quot;Z&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; &amp;quot;Z&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Konstanter==&lt;br /&gt;
&lt;br /&gt;
Programmerare och andra nördar är kända för sin torra humor. Ett sätt att införa det i programmet är att införa en konstant. En konstant i Python är precis som en variabel, men som en konvention skriver man variabelnamnet med versaler, t ex:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MAMMAS_FRYSPUNKT = 5&lt;br /&gt;
temperatur = input(&amp;quot;Ge utetemperatur: &amp;quot;)&lt;br /&gt;
if temperatur &amp;lt; MAMMAS_FRYSPUNKT:&lt;br /&gt;
    print &amp;quot;Ta på dej en halsduk, lille vän!&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En konstant ändrar inte funktionen i ett program från användarens sida, men det gör programmet lättare att modifiera för programmeraren (ffa om programmet är stort) och rätt använd kan den också göra programmet tydligare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Else-del i if-sats==&lt;br /&gt;
&lt;br /&gt;
Om villkoret temperatur &amp;lt;span class=&amp;quot;code&amp;quot;&amp;gt;&amp;amp;lt; MAMMAS_FRYSPUNKT&amp;lt;/span&amp;gt; är False händer ingenting alls när man kör programmet.  Det är trist programmering.  Mamma vill gärna ha en uppmuntrande utskrift då och bygger ut if-satsen så här:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;MAMMAS_FRYSPUNKT=5&lt;br /&gt;
temperatur = input(&amp;quot;Ge utetemperatur: &amp;quot;) &lt;br /&gt;
if temperatur &amp;lt; MAMMAS_FRYSPUNKT:&lt;br /&gt;
    print &amp;quot;Ta på dej en halsduk, lille vän!&amp;quot;     &lt;br /&gt;
else:&lt;br /&gt;
    print &amp;quot;Mammas gullgubbe slipper halsduk!&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program kommer att se ut så här på skärmen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Ge utetemperatur: 2&lt;br /&gt;
Ta på dej en halsduk, lille vän!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eller&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Ge utetemperatur: 17&lt;br /&gt;
Mammas gullgubbe slipper halsduk!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Satserna efter else kommer alltså att utföras när villkoret i if-satsen är False.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad kommer att skrivas ut av följande program om a = 13 och b = 7?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;if a &amp;lt;= b:&lt;br /&gt;
    print &amp;quot;A&amp;quot;,&lt;br /&gt;
    print &amp;quot;B&amp;quot;,&lt;br /&gt;
else:&lt;br /&gt;
    print &amp;quot;C&amp;quot;,&lt;br /&gt;
print &amp;quot;D&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; &amp;quot;C D&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad kommer att skrivas ut av följande program om a = 36?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;MITTEN = 42&lt;br /&gt;
if a &amp;lt;= MITTEN:&lt;br /&gt;
    print &amp;quot;A&amp;quot;,&lt;br /&gt;
    print &amp;quot;B&amp;quot;,&lt;br /&gt;
else:&lt;br /&gt;
    print &amp;quot;C&amp;quot;,&lt;br /&gt;
print &amp;quot;D&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; &amp;quot;A B D&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Flera villkor==&lt;br /&gt;
&lt;br /&gt;
Plötsligt kommer mamma på att det kan bli ännu kallare och vill ha en tredje utskrift om temperaturen är under noll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Ett program som visar hur if-elif-else fungerar&lt;br /&gt;
MAMMAS_FRYSPUNKT = 5&lt;br /&gt;
CELSIUS_FRYSPUNKT = 0&lt;br /&gt;
temperatur = input(&amp;quot;Ge utetemperatur: &amp;quot;)&lt;br /&gt;
if temperatur &amp;lt; CELSIUS_FRYSPUNKT:&lt;br /&gt;
    print &amp;quot;Ta på dej halsduk och mössa!&amp;quot;&lt;br /&gt;
elif temperatur &amp;lt; MAMMAS_FRYSPUNKT:&lt;br /&gt;
    print &amp;quot;Ta på dej en halsduk!&amp;quot;&lt;br /&gt;
else:&lt;br /&gt;
    print &amp;quot;Mammas gullgubbe slipper halsduk!&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Detta program kommer att se ut så här på skärmen&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Ge utetemperatur: 3&lt;br /&gt;
Ta på dej en halsduk!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eller&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Ge utetemperatur: 17&lt;br /&gt;
Mammas gullgubbe slipper halsduk!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
eller&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Ge utetemperatur: -2&lt;br /&gt;
Ta på dej halsduk och mössa!&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hur många villkor som helst kan kombineras med hjälp av elif. Villkoren kontrolleras i tur och ordning, uppifrån och ned. Det första villkor som blir True får programmet att fortsätta exekveringen på de närmast följande indenterade satserna efter kolon fram till nästa icke-indenterade sats. Därefter hoppas resten av if-satsen över. Om inget villkor blir True (och endast då) utförs de indenterade satserna efter else.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad kommer min, max och b att ha för värden efter följande satser om a = -2?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;min = 5&lt;br /&gt;
max = 10&lt;br /&gt;
b = 0&lt;br /&gt;
&lt;br /&gt;
if a &amp;lt; min:&lt;br /&gt;
    min = a&lt;br /&gt;
elif a &amp;gt; max:&lt;br /&gt;
    max = a&lt;br /&gt;
else:&lt;br /&gt;
    b += 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:''' min =&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; -2 &amp;lt;/span&amp;gt;, max =&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 10 &amp;lt;/span&amp;gt;samt b =&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Likhet==&lt;br /&gt;
&lt;br /&gt;
När man vill testa likhet så används dubbla likhetstecken. Enkelt likhetstecken används bara till tilldelning. Exempel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;betyg = 2123&lt;br /&gt;
if betyg == 2000:&lt;br /&gt;
    print &amp;quot;Du har precis kommit in på högskolan&amp;quot;&lt;br /&gt;
elif betyg &amp;gt; 2000:&lt;br /&gt;
    print &amp;quot;Du har kommit in på högskolan&amp;quot;&lt;br /&gt;
else:&lt;br /&gt;
    print &amp;quot;Du har inte kommit in på högskolan&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad skrivs ut om x = 5 och y = 3?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;if x &amp;gt; 2:&lt;br /&gt;
  if y &amp;gt; 4:&lt;br /&gt;
    print &amp;quot;blå&amp;quot;&lt;br /&gt;
  elif x == y: &lt;br /&gt;
    print &amp;quot;gul&amp;quot;&lt;br /&gt;
  else: &lt;br /&gt;
    print &amp;quot;röd&amp;quot;&lt;br /&gt;
else:&lt;br /&gt;
  print &amp;quot;grön&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; &amp;quot;röd&amp;quot;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==While-slingor==&lt;br /&gt;
&lt;br /&gt;
[[Bild:Tape_measure.jpg|right]]&lt;br /&gt;
&lt;br /&gt;
När en eller flera satser ska upprepas ett antal gånger är en while-sats ett bra hjälpmedel. Anta att man vill skriva ett program som skriver texten &amp;quot;Python&amp;quot;&amp;amp;nbsp;5 gånger på skärmen. Detta kan man åstadkomma genom att använda en while-sats enligt nedan. Siffrorna i början på varje rad är för att vi ska kunna referera till raderna i texten. När man programmerar skriver man förstås utan siffror och kolon.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;1: antal_varv = 0&lt;br /&gt;
2: while antal_varv &amp;amp;lt; 5 :&lt;br /&gt;
3:&amp;amp;nbsp;  print &amp;quot;Python&amp;quot;&lt;br /&gt;
4:&amp;amp;nbsp;  antal_varv += 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innan vi går igenom programmet presenterar vi idén bakom programkoden.&lt;br /&gt;
&lt;br /&gt;
F&amp;amp;ouml;r att l&amp;amp;ouml;sa problemet beh&amp;amp;ouml;ver vi en r&amp;amp;auml;knare f&amp;amp;ouml;r att h&amp;amp;aring;lla reda p&amp;amp;aring; antalet g&amp;amp;aring;nger texten &amp;quot;Python&amp;quot; skrivits ut s&amp;amp;aring; att programmet kan sluta skriva ut texten efter 5:e g&amp;amp;aring;ngen.&lt;br /&gt;
&lt;br /&gt;
Programmet har allts&amp;amp;aring; f&amp;amp;ouml;ljande uppgifter att utf&amp;amp;ouml;ra:&lt;br /&gt;
&lt;br /&gt;
* Skriva ut texten &amp;quot;Python&amp;quot;&lt;br /&gt;
* Skapa en r&amp;amp;auml;knare och nollst&amp;amp;auml;lla den&lt;br /&gt;
* Kontrollera r&amp;amp;auml;knarens v&amp;amp;auml;rde &lt;br /&gt;
* Uppdatera r&amp;amp;auml;knarens v&amp;amp;auml;rde&lt;br /&gt;
&lt;br /&gt;
Nu ska vi g&amp;amp;aring; igenom programmet i detalj.&lt;br /&gt;
&lt;br /&gt;
I rad nummer 1 har vi koden &amp;quot;&amp;lt;code&amp;gt;antal_varv = 0&amp;lt;/code&amp;gt;&amp;quot;. D&amp;amp;auml;r har vi valt variabeln antal_varv som ska fungera som r&amp;amp;auml;knare och f&amp;amp;aring;r startv&amp;amp;auml;rdet 0.&lt;br /&gt;
&lt;br /&gt;
Resten av program &amp;amp;auml;r while-satsen. Syntaxen f&amp;amp;ouml;r en while-sats liknar syntaxen f&amp;amp;ouml;r if-satser som vi har sett tidigare i lektionen om villkor.&lt;br /&gt;
&lt;br /&gt;
Rad nummer 2 &amp;amp;auml;r &amp;quot;&amp;lt;span class=&amp;quot;code&amp;quot;&amp;gt;while antal_varv &amp;amp;lt; 5 :&amp;lt;/span&amp;gt;&amp;quot; som &amp;amp;auml;r f&amp;amp;ouml;ljande instruktion f&amp;amp;ouml;r datorn:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Exekvera alla indragna rader som kommer efter kolon s&amp;amp;aring; l&amp;amp;auml;nge variabeln antal_varv har ett v&amp;amp;auml;rde som &amp;amp;auml;r mindre &amp;amp;auml;n 5&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Rad nummer 3 (&amp;lt;span class=&amp;quot;code&amp;quot;&amp;gt;print &amp;quot;Python&amp;quot;&amp;lt;/span&amp;gt;) &amp;amp;auml;r en indragen rad och ing&amp;amp;aring;r d&amp;amp;auml;rf&amp;amp;ouml;r i while-slingan. Den skriver ut texten &amp;quot;Python&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Rad nummer 4 (&amp;lt;span class=&amp;quot;code&amp;quot;&amp;gt;antal_varv += 1&amp;lt;/span&amp;gt;) ser till att r&amp;amp;auml;knaren &amp;amp;ouml;kar v&amp;amp;auml;rdet med ett.&lt;br /&gt;
&lt;br /&gt;
Uppdatering av antal_varv &amp;amp;auml;r ett viktig steg i while-satsen som tillsammans med villkoret &amp;quot;&amp;lt;span class=&amp;quot;code&amp;quot;&amp;gt;antal_varv &amp;amp;lt; 5&amp;lt;/span&amp;gt;&amp;quot; (i rad 2) avg&amp;amp;ouml;r om texten &amp;quot;Python&amp;quot; ska skrivas ut ytterligare en g&amp;amp;aring;ng eller inte.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad skrivs ut av följande program?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;i = 0&lt;br /&gt;
v = 1&lt;br /&gt;
while i &amp;lt; 5:&lt;br /&gt;
  v = i * v&lt;br /&gt;
  print v&lt;br /&gt;
  i += 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 0 0 0 0 0&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hur exekveras programmet?==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;antal_varv=0&lt;br /&gt;
while antal_varv &amp;amp;lt; 5 :&lt;br /&gt;
  print &amp;quot;Python&amp;quot;&lt;br /&gt;
  antal_varav += 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I f&amp;amp;ouml;rsta raden av programmet f&amp;amp;aring;r variabeln &amp;lt;code&amp;gt;antal_varv&amp;lt;/code&amp;gt; v&amp;amp;auml;rdet 0. D&amp;amp;auml;refter exekveras uttrycket &amp;lt;code&amp;gt;antal_varv &amp;amp;lt; 5&amp;lt;/code&amp;gt; och eftersom att 0 &amp;amp;auml;r mindre &amp;amp;auml;n 5 &amp;amp;auml;r villkoret uppfyllt (True) vilket f&amp;amp;aring;r till f&amp;amp;ouml;ljd att while-slingan startar. Det f&amp;amp;ouml;rsta som h&amp;amp;auml;nder i den &amp;amp;auml;r att &amp;lt;span class=&amp;quot;code&amp;quot;&amp;gt;print &amp;quot;Python&amp;quot;&amp;lt;/span&amp;gt; exekveras. D&amp;amp;auml;refter exekveras &amp;lt;code&amp;gt;antal_varav += 1&amp;lt;/code&amp;gt; och d&amp;amp;auml;rmed &amp;amp;auml;ndrar &amp;lt;code&amp;gt;antal_varv&amp;lt;/code&amp;gt; v&amp;amp;auml;rde till 1. Nu &amp;amp;auml;r slingan slut och d&amp;amp;auml;rf&amp;amp;ouml;r exekveras uttrycket &amp;lt;code&amp;gt;antal_varv &amp;amp;lt; 5&amp;lt;/code&amp;gt; igen och eftersom att 1 &amp;amp;auml;r mindre &amp;amp;auml;n 5 g&amp;amp;aring;r vi ett varv till i while-slingan. D&amp;amp;auml;r exekveras &amp;lt;code&amp;gt;print &amp;quot;Python&amp;quot;&amp;lt;/code&amp;gt; och &amp;lt;code&amp;gt;antal_varav += 1&amp;lt;/code&amp;gt;. Ovanst&amp;amp;aring;ende tre satser upprepas ytterligare tre g&amp;amp;aring;nger tills &amp;lt;code&amp;gt;antal_varv&amp;lt;/code&amp;gt; f&amp;amp;aring;r v&amp;amp;auml;rdet 5. N&amp;amp;auml;r d&amp;amp;aring; uttrycket &amp;lt;code&amp;gt;antal_varv &amp;amp;lt; 5&amp;lt;/code&amp;gt; exekveras, till skillnad mot alla tidigare g&amp;amp;aring;nger, blir v&amp;amp;auml;rdet falskt (False) eftersom att 5 inte &amp;amp;auml;r mindre &amp;amp;auml;n 5. Och d&amp;amp;auml;rf&amp;amp;ouml;r avslutas exekvering av while-satsen och i det h&amp;amp;auml;r fallet avslutas &amp;amp;auml;ven programmet d&amp;amp;aring; det inte finns n&amp;amp;aring;gra fler satser kvar att exekvera.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''I vilken ordning exekveras följande program?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;A&lt;br /&gt;
while B:&lt;br /&gt;
    C&lt;br /&gt;
D&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vi antar följande förutsättningar:&lt;br /&gt;
* Programmet går endast tre varv.&lt;br /&gt;
* A är en godtycklig tilldelningssats.&lt;br /&gt;
* B är en godtycklig villkorssats som är sann i tre varv.&lt;br /&gt;
* C och D är godtyckliga utskriftssatser.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ABCD&lt;br /&gt;
# ACCCD&lt;br /&gt;
# ABCCCD&lt;br /&gt;
# ABCBCBCD&lt;br /&gt;
# ABCBCBCBD&lt;br /&gt;
# ABCABCABCD&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 5. ABCBCBCBD&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==En oändlig while-slinga==&lt;br /&gt;
&lt;br /&gt;
Om man tar bort rad nummer 4 fr&amp;amp;aring;n programmet f&amp;amp;aring;r man f&amp;amp;ouml;ljande:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;antal_varv = 0&lt;br /&gt;
while antal_varv &amp;amp;lt; 5 :&lt;br /&gt;
  print &amp;quot;Python&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vi ser att variabeln &amp;lt;code&amp;gt;antal_varv&amp;lt;/code&amp;gt; inte kommer att &amp;amp;auml;ndras i while-satsen. Detta g&amp;amp;ouml;r att villkoret (&amp;lt;code&amp;gt;antal_varv &amp;amp;lt; 5&amp;lt;/code&amp;gt;) kommer f&amp;amp;ouml;rbli sant under hela programmet allts&amp;amp;aring; kommer texten &amp;quot;Python&amp;quot; att skrivas ut om och om igen o&amp;amp;auml;ndligt m&amp;amp;aring;nga g&amp;amp;aring;nger.&lt;br /&gt;
&lt;br /&gt;
Om du r&amp;amp;aring;kar ut f&amp;amp;ouml;r detta n&amp;amp;auml;r du k&amp;amp;ouml;r ett program kan du avbryta programmet genom att trycka ctrl-c. Det g&amp;amp;ouml;r du genom att f&amp;amp;ouml;rst trycka ner tangenten m&amp;amp;auml;rkt &amp;quot;ctrl&amp;quot; p&amp;amp;aring; tangentbordet och forts&amp;amp;auml;tta h&amp;amp;aring;lla den nere och samtidigt som du ocks&amp;amp;aring; trycker ner &amp;quot;C&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Hur många gånger skrivs texten &amp;quot;hej&amp;quot; när man kör följande program?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;v = 5&lt;br /&gt;
while v &amp;gt; 5:&lt;br /&gt;
  print &amp;quot;hej&amp;quot;&lt;br /&gt;
  v += 1&lt;br /&gt;
print &amp;quot;hej&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; En gång&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Kommer följande program skriva ut texten &amp;quot;hej då&amp;quot;? Om inte, varför?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;i = 0&lt;br /&gt;
while i &amp;lt; 10:&lt;br /&gt;
  print &amp;quot;hej&amp;quot;&lt;br /&gt;
print &amp;quot;hej då&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; Nej, eftersom while-satsen är en oändlig slinga och print &amp;quot;hej då&amp;quot; är inte en del av while-satsen.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Struktur på while-sats==&lt;br /&gt;
&lt;br /&gt;
Strukturen p&amp;amp;aring; en while-sats &amp;amp;auml;r exakt som strukturen p&amp;amp;aring; en if-sats om man bara byter ut if mot while i en if-sats.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;while &amp;amp;lt;BOOLESKT UTTRYCK&amp;amp;gt; :&lt;br /&gt;
  &amp;amp;lt;EN ELLER FLERA SATSER SOM SKA EXEKVERAS&amp;amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
En while-sats startar med reserverade ordet &amp;quot;while&amp;quot;, efter ordet &amp;quot;while&amp;quot; ska ett uttryck som resulterar ett booleskt v&amp;amp;auml;rde (True eller False) komma. Efter uttrycket kommer tecknet kolon (:). Efter kolon kommer de satser som ska exekveras flera g&amp;amp;aring;nger.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad är det som är fel i följande while-sats? Programmet ska skriva ut &amp;quot;hej&amp;quot; oändligt antal gånger.'''&lt;br /&gt;
&amp;lt;pre&amp;gt;i = 1&lt;br /&gt;
WHILE i &amp;lt; 10:&lt;br /&gt;
  print &amp;quot;hej&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# 'WHILE' och 'print &amp;quot;hej&amp;quot;' måste stå rakt under varandra och ej vara förskjutna.&lt;br /&gt;
# i = 1 ska tas bort.&lt;br /&gt;
# i &amp;lt; 10 ska ändras till i == 1.&lt;br /&gt;
# Ordet 'WHILE' ska stå med små bokstäver.&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 4. Ordet 'WHILE' ska stå med små bokstäver&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==När ska man använda en while-sats?==&lt;br /&gt;
&lt;br /&gt;
En while-sats anv&amp;amp;auml;nds n&amp;amp;auml;r en eller flera rader kod ska exekveras ett best&amp;amp;auml;mt eller obest&amp;amp;auml;mt antal g&amp;amp;aring;nger efter varandra.&lt;br /&gt;
&lt;br /&gt;
F&amp;amp;ouml;ljande &amp;amp;auml;r exempel p&amp;amp;aring; program d&amp;amp;auml;r antalet upprepningar &amp;amp;auml;r obest&amp;amp;auml;md och beror p&amp;amp;aring; anv&amp;amp;auml;ndarens inmatning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;tal=input(&amp;quot;Gissa ett tal mellan 1 och 100:&amp;quot;)&lt;br /&gt;
while tal != 74 :&lt;br /&gt;
  tal=input(&amp;quot;fel, f&amp;amp;ouml;rs&amp;amp;ouml;k igen:&amp;quot;)&lt;br /&gt;
print &amp;quot;Grattis du gissade r&amp;amp;auml;tt!&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''I vilka av följande tillfällen kan man med fördel använda sig av while-satser?'''&lt;br /&gt;
# När man vill att programmet ska skriva ut samma text flera gånger efter varandra.&lt;br /&gt;
# När man vill skriva ut alla tal mellan 5 och 95.&lt;br /&gt;
# När man vill utföra en sak 10 gånger.&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; Vid alla tre tillfällena!&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
&lt;br /&gt;
Nu är det dags för kursens andra test.&lt;br /&gt;
Under rubriken Examination på kursens förstasida hittar&lt;br /&gt;
du samtliga test och inlämningsuppgifter.&lt;br /&gt;
Testet rättas automatiskt och du har möjlighet att göra om&lt;br /&gt;
testet flera gånger om du inte lyckas på första försöket. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Inlämningsuppgift 1 (Prat i kvadrat)==&lt;br /&gt;
''Inlämningsuppgiften är individuell och får inte lösas i grupp.''&lt;br /&gt;
&lt;br /&gt;
I den första inlämningsuppgiften ska du skriva och skicka in ditt första pythonprogram.&lt;br /&gt;
Programmet ska skriva ut de första n kvadrattalen: 1*1, 2*2, ... , n*n, där talet n anges&lt;br /&gt;
av den som använder programmet. Programmet ska också skriva ut summan av dessa kvadrattal.&lt;br /&gt;
Här är ett exempel på en körning:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;Välkommen till prat i kvadrat.&lt;br /&gt;
Hur många kvadrattal vill du skriva ut? 4&lt;br /&gt;
1 * 1 = 1&lt;br /&gt;
2 * 2 = 4&lt;br /&gt;
3 * 3 = 9&lt;br /&gt;
4 * 4 = 16&lt;br /&gt;
Summan av kvadrattalen: 30&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programmet ska finnas i en fil med namnet &amp;lt;code&amp;gt;Uppgift1.py&amp;lt;/code&amp;gt;. Följ den här mallen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Programmeringsteknik webbkurs KTH inlämningsuppgift 1.&lt;br /&gt;
# &amp;lt;Ditt namn&amp;gt;&lt;br /&gt;
# &amp;lt;Datum&amp;gt;&lt;br /&gt;
# &amp;lt;Kort beskrivning av vad programmet gör&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;Programkod&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Innan du skickar in programmet så ska du testa att det fungerar.&lt;br /&gt;
Kontrollera speciellt att programmet fungerar korrekt även om&lt;br /&gt;
användaren skriver in talet 0 eller 1.&lt;br /&gt;
(I den här uppgiften finns det inget krav på vad som ska hända&lt;br /&gt;
om användaren matar in ett negativt tal eller skriver in något&lt;br /&gt;
annat än ett heltal. Om du vill så får du dock gärna försöka&lt;br /&gt;
upptäcka felaktig inmatning och skriva ut lämpliga felmeddelanden.)&lt;br /&gt;
&lt;br /&gt;
När du har testat ditt program grundligt så går du till kursens förstasida.&lt;br /&gt;
Under rubriken Examination hittar du Inlämningsuppgift&amp;amp;nbsp;1 och&lt;br /&gt;
där kan du lämna in filen Uppgift1.py. Observera att filen måste vara i textformat,&lt;br /&gt;
vilket den automatiskt blir om du skapar den med hjälp av IDLE.&lt;br /&gt;
Detta för att vi ska kunna prova och testköra ditt program.&lt;/div&gt;</description>
			<pubDate>Wed, 20 Jun 2007 16:02:10 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:2._Styrstrukturer</comments>		</item>
		<item>
			<title>1. Programmeringsintro</title>
			<link>http://wiki.math.se/wikis/dd100n_0701/index.php/1._Programmeringsintro</link>
			<description>&lt;p&gt;Sammanfattning: /* Installera Python på din dator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Vad är en dator?==&lt;br /&gt;
&lt;br /&gt;
En dator i dagligt tal består väsentligen av ett tangentbord,&lt;br /&gt;
en mus och en skärm som ibland sitter i samma låda som själva&lt;br /&gt;
datorn. I tekniska sammanhang menar man ibland lådan med datorn&lt;br /&gt;
och ibland endast processorn som sitter i lådan.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[Bild:797710.jpg]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
''Löstagen processor (i svart) med sex rader med kontakter runt om.''&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Processorn sitter fast på ett kretskort, ofta kallat&lt;br /&gt;
moderkortet och är kopplat till flera olika minnen. Viktigaste&lt;br /&gt;
minnena är registren i processorn, där alla beräkningar och&lt;br /&gt;
tolkningar (t ex om ett tal är större än ett annat) sker,&lt;br /&gt;
RAM-minnet (Random Access Memory) där program ligger när de&lt;br /&gt;
körs, och skivminnet (ofta kallat hårddisk) där program och&lt;br /&gt;
dokument lagras för att vara kvar även när datorn har stängts&lt;br /&gt;
av (till skillnad från RAM-minnet som töms varje gång strömmen&lt;br /&gt;
stängs av).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;table&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
[[Bild:797711.jpg]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;
''Minneskort med minnen (RAM) i svart''&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Uppgifter som man brukar se i annonser om datorer är t ex&lt;br /&gt;
processorhastighet mätt i MHz (MegaHertz), dvs miljoner&lt;br /&gt;
cykler per sekund eller till och med GHz (GigaHertz),&lt;br /&gt;
dvs miljarder cykler per sekund. Betyder detta att en 2GHz&lt;br /&gt;
CPU är dubbelt så snabb som en 1MHz CPU? Inte nödvändigtvis.&lt;br /&gt;
Det beror också på hur mycket arbete varje CPU utför per&lt;br /&gt;
cykel.&lt;br /&gt;
&lt;br /&gt;
Datorns prestanda är också i högsta grad beroende av minnets&lt;br /&gt;
storlek och hastighet. RAM-storlek som mäts i MB (MegaByte),&lt;br /&gt;
dvs miljoner byte. En byte består av vanligen åtta bitar och&lt;br /&gt;
kan t ex lagra ett tal mellan 0 och 255. En bit är den minsta&lt;br /&gt;
minnesenheten på en dator och innehåller en etta eller en&lt;br /&gt;
nolla. Skivminnet mäts också i byte och är något hundratal&lt;br /&gt;
gånger större än RAM-minnet.&lt;br /&gt;
&lt;br /&gt;
Ibland hör man benämningen &amp;quot;data&amp;quot;. I IT-sammanhang betyder&lt;br /&gt;
data endast information. Personer som använder data (eller&lt;br /&gt;
ännu värre: &amp;quot;datan&amp;quot;) för att referera till själva datorn&lt;br /&gt;
upplevs ofta som mindre kunniga (se t ex Maria Bloms film&lt;br /&gt;
Masjävlar) av de som skiljer på datorer och informationen&lt;br /&gt;
som datorerna behandlar.&lt;br /&gt;
&lt;br /&gt;
Om du glömmer bort vad ett visst ord betyder kan du slå upp det&lt;br /&gt;
i vår [[ordlista]] över pythontermer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;På många ställen i den här kursen finns det testfrågor&lt;br /&gt;
som du kan använda för att kolla om du har förstått.&lt;br /&gt;
Prova först att lösa uppgifterna på egen hand.&lt;br /&gt;
Det går också utmärkt att diskutera frågorna på kursens forum.&lt;br /&gt;
Här är en första uppmjukningsfråga.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Vad är en dator?'''&lt;br /&gt;
&lt;br /&gt;
# Detsamma som en processor med minne.&lt;br /&gt;
# Detsamma som en processor, skärm, dator, tangentbord och mus.&lt;br /&gt;
# Detsamma som en data.&lt;br /&gt;
&lt;br /&gt;
'''Svar:''' -&amp;gt;&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;2. Detsamma som en processor, skärm, dator, tangentbord och mus.&amp;lt;/span&amp;gt;&amp;lt;-&lt;br /&gt;
&lt;br /&gt;
&amp;lt;em&amp;gt;Lösningen till uppgiften är skriven med osynligt bläck på föregående rad. Om du vill titta på svaret så håller du ned vänster musknapp och markerar den osynliga texten som finns mellan tecknen -&amp;gt; och &amp;lt;-.&amp;lt;/em&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Vad är ett program?==&lt;br /&gt;
&lt;br /&gt;
Ett (dator-) program är en uppsättning instruktioner som styr&lt;br /&gt;
vad datorn ska göra. Vanligen finns det indata (t ex knapp-&lt;br /&gt;
eller mustryckningar) som behandlas av datorn enligt&lt;br /&gt;
instruktionerna i programmet vilket resulterar i utdata&lt;br /&gt;
(t ex text, diagram, bilder) på skärmen.&lt;br /&gt;
&lt;br /&gt;
[[Bild:791439.jpg]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:791440.jpg]]&lt;br /&gt;
&lt;br /&gt;
En analogi är stickning där samma indata (garn) med ett program&lt;br /&gt;
kan bli till utdata i form av ett par sockor och med ett annat&lt;br /&gt;
program till en tröja.&lt;br /&gt;
&lt;br /&gt;
[[Bild:791441.jpg]]&amp;lt;br/&amp;gt;&lt;br /&gt;
[[Bild:791442.jpg]]&lt;br /&gt;
&lt;br /&gt;
Precis som själva datorn består ett datorprogram väsentligen&lt;br /&gt;
av två saker: minne och instruktioner. Minnet kallas för&lt;br /&gt;
variabler, instruktionerna kallas ofta för satser. Satserna är&lt;br /&gt;
det som avgör hur variablerna manipuleras (dvs ändrar värde).&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
'''Vad är ett datorprogram? (Det kan finnas flera riktiga svar.)'''&lt;br /&gt;
&lt;br /&gt;
# Något som styr en dator.&lt;br /&gt;
# Detsamma som en processor, skärm, tangentbord och mus.&lt;br /&gt;
# Något som styr hu en dator manipulerar indata för att presentera utdata.&lt;br /&gt;
# En samling obegripliga ord i godtycklig ordning.&lt;br /&gt;
# En samling av variabler och satser.&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 1, 3 och 5 är alla rätt.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Vad är ett programspråk?==&lt;br /&gt;
&lt;br /&gt;
En dator förstår endast sitt eget datorspråk, maskinkod, som är&lt;br /&gt;
mycket svårhanterligt även för de flesta erfarna programmerare.&lt;br /&gt;
För att underlätta för alla som programmerar skriver man därför&lt;br /&gt;
vanligen program i ett programspråk som t ex Java, C++ eller som&lt;br /&gt;
vi ska använda i denna kurs: Python. För att kunna få datorn att&lt;br /&gt;
förstå och utföra program skrivna i Python krävs det att man&lt;br /&gt;
översätter (kompilerar, tolkar, interpreterar) det till datorns&lt;br /&gt;
eget språk.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Installera Python på din dator==&lt;br /&gt;
&lt;br /&gt;
För att kunna läsa den här kursen måste du installera Python&lt;br /&gt;
på din dator. Python finns tillgängligt för många olika&lt;br /&gt;
operativsystem, bland annat Linux/Unix, Mac OS X och Windows,&lt;br /&gt;
och är enkelt att installera. &lt;br /&gt;
&lt;br /&gt;
Innan du laddar ned Python, begrunda nedanstående&lt;br /&gt;
&lt;br /&gt;
Python 3.0 släpptes i början av december 2008, i denna version har bland annat&lt;br /&gt;
syntaxen för print-kommandot ändrats och även en del andra förändringar&lt;br /&gt;
genomförts.&lt;br /&gt;
&lt;br /&gt;
Kursmaterialet i denna kurs är anpassat efter Python 2.4 - 2.6 vilket innebär&lt;br /&gt;
att alla exempel, prov och övningar i boken förutsätter att någon av dessa&lt;br /&gt;
versioner används.&lt;br /&gt;
&lt;br /&gt;
För dig som ska installera Python på din dator, välj version 2.6.1 tillgänglig&lt;br /&gt;
via http://www.python.org&lt;br /&gt;
&lt;br /&gt;
P-uppgiften redovisas normalt i Python 2.4 - 2.6 men om du vill använda Python&lt;br /&gt;
3.0 så kan detta vara möjligt. Kommunicera då detta i förväg med rättande lärare. &lt;br /&gt;
&lt;br /&gt;
På webbplatsen [http://www.python.org python.org]&lt;br /&gt;
hittar du all information du behöver för att kunna ladda ner och&lt;br /&gt;
installera den senaste versionen av Python på din dator.&lt;br /&gt;
&lt;br /&gt;
Gå till [http://www.python.org python.org] och följ instruktionerna för att&lt;br /&gt;
installera Python. Om du får problem så kan du, som alltid,&lt;br /&gt;
ställa en fråga i kursens webbforum eller kontakta kursens&lt;br /&gt;
handledare.&lt;br /&gt;
&lt;br /&gt;
==Kom igång med Python och IDLE==&lt;br /&gt;
&lt;br /&gt;
Nästa steg är att börja använda Python och IDLE. IDLE är ett&lt;br /&gt;
ett utvecklingsverktyg för Python med vars hjälp man enkelt&lt;br /&gt;
och behändigt kan skriva och testa sina program.&lt;br /&gt;
[http://hkn.eecs.berkeley.edu/~dyoo/python/idle_intro/ One Day of IDLE Toying]&lt;br /&gt;
är en kort och lättläst introduktion som visar hur man använder IDLE&lt;br /&gt;
för att skriva sitt första program.&lt;br /&gt;
Gå dit, läs texten och prova själv på att skriva och köra&lt;br /&gt;
ett Python-program (svensk översättning finns). &lt;br /&gt;
&lt;br /&gt;
För Python finns det alltså två sätt att skriva program.&lt;br /&gt;
Antingen skriver man programkod direkt i en pythontolk och&lt;br /&gt;
ser resultatet av varje kommando efterhand som man skriver&lt;br /&gt;
in sitt program. Detta fungerar bäst om man vill skriva&lt;br /&gt;
mycket korta program som bara ska användas en gång eller&lt;br /&gt;
om man vill testa hur något fungerar i Python.&lt;br /&gt;
&lt;br /&gt;
Det andra sättet är att använda ett redigeringsprogram,&lt;br /&gt;
till exempel det som är inbyggt i IDLE, och sedan låta&lt;br /&gt;
pythontolken översätta och köra programmet. Fördelen med&lt;br /&gt;
detta är att det blir enklare att gå tillbaka och ändra&lt;br /&gt;
programmet om det inte blev riktigt rätt eller om man kommer&lt;br /&gt;
på roliga tillägg. När man skriver större program gör man&lt;br /&gt;
alltid på detta sätt.&lt;br /&gt;
&lt;br /&gt;
Eftersom tolken bara är ett dumt program kräver den att texten&lt;br /&gt;
i programfilen (eller det du skriver i tolken) mycket strikt&lt;br /&gt;
följer bestämda regler. Ett väldigt litet pythonprogram som&lt;br /&gt;
kan kompileras och köras utan fel ser ut så här:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;codebox&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;print &amp;quot;Hej!&amp;quot;&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Om man skriver någonting som kompilatorn inte kan översätta&lt;br /&gt;
kommer den att tala om var det är fel och vägra att översätta&lt;br /&gt;
allt. Lyckas översättningen så går programmet att köra. I det&lt;br /&gt;
här fallet kommer texten Hej! att skrivas ut.&lt;br /&gt;
&lt;br /&gt;
==Tilldelning==&lt;br /&gt;
&lt;br /&gt;
För att hålla reda på data i ett program används variabler. Alla variabler har ett namn för att kunna skilja dem åt. Du kan jämföra med minnet på en miniräknare. Enklare räknare har bara ett minne och behöver därför inte namnge det. Mer avancerade räknare har flera minnen som namnges med t ex ett nummer. Ett datorprogram kan hålla reda på en stor mängd data. När man programmerar kan man lägga in data som t ex längd vikt och ålder i datorns minne med hjälp av variabler. För att tilldela variablerna värden skriver man i Python t ex:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;age = 18&lt;br /&gt;
length = 180&lt;br /&gt;
weight = 80&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I vänsterledet (vänster om =) skriver man namnet på den variabel som ska få ett nytt värde och i högerledet (höger om =) värdet som tilldelas. Likhetstecknet kallas i programmeringssammanhang för tilldelning (eller tom tilldelningsoperator). Man kan också skriva variabler i högerledet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;codebox&amp;quot;&amp;gt;&amp;lt;pre&amp;gt;my_cousins_age = age&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Då tilldelas &amp;lt;code&amp;gt;my_cousins_age&amp;lt;/code&amp;gt; samma värde som &amp;lt;code&amp;gt;age&amp;lt;/code&amp;gt; har. Alla variabelnamn i Python måste börja med en (engelsk) bokstav (inte åäö), men efter den kan man blanda bokstäver och siffror.&lt;br /&gt;
&lt;br /&gt;
Högerledet kan innehålla uträkningar som behöver utföras innan tilldelningen sker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;a = 3&lt;br /&gt;
b = a + 15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående två rader ser till att &amp;lt;code&amp;gt;b&amp;lt;/code&amp;gt; får värdet 18.&lt;br /&gt;
&lt;br /&gt;
Ett bra sätt att förstå vad som händer i ett program är att stegvis går igenom det för hand och skriva upp alla variabelvärden. Varje variabel har endast ett värde åt gången och kommer inte ihåg vad för värde den haft tidigare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad blir värdet på variabeln &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; efter följande rader?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;a = 12&lt;br /&gt;
b = a&lt;br /&gt;
c = a + b + 3&lt;br /&gt;
d = c - b&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Svar:''' &amp;lt;code&amp;gt;d&amp;lt;/code&amp;gt; =&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 15 &amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad är det för fel på följande kod?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;6606 = svenska_flaggans_dag&amp;lt;/pre&amp;gt;&lt;br /&gt;
# 6606 är ett ogiltigt variabelnamn.&lt;br /&gt;
# Det blir fel för att 6606 inte är svenska flaggans dag.&lt;br /&gt;
# Man kan inte tilldela värdet 6606 ett nytt värde.&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; 1 och 3 är båda korrekta svar.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Olika slags värden==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Det finns olika slags värden man tilldela variabler. Som vi tidigare sett kan man tilldela variabler värden i form av tal, men man kan också tilldela teckenföljder som t ex namn. I datalitteraturen kallas teckenföljderna för strängar (av engelskans string som bland annat betyder sträng och kedja).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;namn1 = 'Oskar'&lt;br /&gt;
namn2 = &amp;quot;Kajsa&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
För att skilja på variabelnamn och strängar omsluter man strängar med apostrofer eller citattecken.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;namn3 = 'Sima'&lt;br /&gt;
namn4 = namn3&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
I exemplet ovan får &amp;lt;code&amp;gt;namn4&amp;lt;/code&amp;gt; värdet 'Sima'. Hade man skrivit apostrofer runt &amp;lt;code&amp;gt;namn3&amp;lt;/code&amp;gt; hade &amp;lt;code&amp;gt;namn4&amp;lt;/code&amp;gt; istället fått värdet 'namn3'.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad blir det för värden på a och b efter följande rader?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;djur = 'katt'&lt;br /&gt;
a = djur&lt;br /&gt;
b = 'djur'&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:''' a får värdet &amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;'katt'&amp;lt;/span&amp;gt; och b får värdet &amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;'djur'&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Uppräkning==&lt;br /&gt;
&lt;br /&gt;
Man kan öka värdet på variabler som tidigare har tilldelats ett värde med hjälp av uppräkningsoperatorn +=. Om variabeln innehåller en siffra räknas värdet upp. Efter följande rader&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;my_age = 19&lt;br /&gt;
my_age += 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
får &amp;lt;code&amp;quot;&amp;gt;my_age&amp;lt;/code&amp;gt; värdet 20. Den första raden ger &amp;lt;code&amp;gt;my_age&amp;lt;/code&amp;gt; värdet 19 och den andra raden räknar upp &amp;lt;code&amp;gt;my_age&amp;lt;/code&amp;gt; med 1. När du trycker på pil upp eller ned i telefonnummerlistan på din mobil utför den en upp- eller nedräkning på samma sätt som andra raden.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Man kan åstadkomma samma sak med satserna:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;my_age = 19&lt;br /&gt;
my_age = my_age + 1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Men så många tecken orkar få programmerare att skriva. Anledningen att variabeln heter &amp;lt;code&amp;gt;my_age&amp;lt;/code&amp;gt; istället för &amp;lt;code&amp;gt;min_ålder&amp;lt;/code&amp;gt; är att åäö inte fungerar i variabelnamn.&lt;br /&gt;
&lt;br /&gt;
Om variabeln innhåller en sträng läggs den nya strängen till den gamla. Efter satserna:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;husdjur = &amp;quot;hund &amp;quot;&lt;br /&gt;
husdjur += &amp;quot;och katt&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kommer &amp;lt;code&amp;gt;husdjur&amp;lt;/code&amp;gt; att vara &amp;quot;hund och katt&amp;quot;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad är värdet på a och s efter följande rader?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;a = 100&lt;br /&gt;
b = 10&lt;br /&gt;
a += b&lt;br /&gt;
s = &amp;quot;svaret är &amp;quot;&lt;br /&gt;
s += &amp;quot;a&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
# a = 10010, s = &amp;quot;svaret är 10010&amp;quot;&lt;br /&gt;
# a = 110, s = &amp;quot;svaret är a&amp;quot;&lt;br /&gt;
# a = 100, s = &amp;quot;svaret är 100&amp;quot;&lt;br /&gt;
# a = 110, s = &amp;quot;svaret är 110&amp;quot;&lt;br /&gt;
# 1 = 110, s = &amp;quot;svaret är 100&amp;quot;&lt;br /&gt;
&lt;br /&gt;
'''Svar:'''&amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt; Det korrekta svaret är 2: a = 110, s = &amp;quot;svaret är a&amp;quot;.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Utskrifter==&lt;br /&gt;
&lt;br /&gt;
För att skriva ut värden på skärmen använder man instruktionen '''print'''. Prova följande pythonprogram i IDLE:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;x = 15&lt;br /&gt;
print x&lt;br /&gt;
print 1001&lt;br /&gt;
print 14&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Genom att använda ett kommatecken så kan man skriva ut flera saker på samma rad. Exempelvis skriver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;print &amp;quot;Charles is&amp;quot;, 19, &amp;quot;years old&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ut &amp;quot;Charles is 19 years old&amp;quot; på samma rad.&lt;br /&gt;
Observera att Python automatiskt lägger till ett blanktecken&lt;br /&gt;
mellan strängarna vid varje kommatecken.&lt;br /&gt;
Precis samma sak skrivs ut på samma sätt av:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;age = 19&lt;br /&gt;
print &amp;quot;Charles is&amp;quot;, age, &amp;quot;years old&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vill man att en senare utskrift (t ex en som görs av en print-sats några rader senare) ska göras på samma rad som den man just skriver ut låter man ett komma stå sist på raden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;print &amp;quot;Charles is&amp;quot;,&lt;br /&gt;
age = 2006-1987&lt;br /&gt;
print age, &amp;quot;years old&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ovanstående skriver också ut samma sak som tidigare.&lt;br /&gt;
&lt;br /&gt;
Om man vill kombinera strängar utan att lägga till ett blanktecken så kan man istället&lt;br /&gt;
använda sig av ett vanligt plustecken:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;print &amp;quot;Charles is&amp;quot;,&lt;br /&gt;
age = 2006-1987&lt;br /&gt;
print age +  &amp;quot;.&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Utskriften blir då &amp;quot;Charles is 19.&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Kommentarer==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Skriv ut Charles ålder&lt;br /&gt;
print &amp;quot;Charles is&amp;quot;,&lt;br /&gt;
age = 2006-1987&lt;br /&gt;
print age, &amp;quot;years old&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Den första raden i det här programmet, raden som börjar med #-tecknet, är en så kallad kommentar. Raden påverkar inte vad som händer när man kör programmet utan är enbart avsedd som information för den som läser programmet. I Python räknas allt från och med #-tecknet till radslut som en kommentar. Man kan till exempel skriva så här:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;salary += 1 # Jippi, löneförhöjning!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kommentarer kan kanske verka överflödiga men är i själva verket mycket viktiga för att man ska kunna förstå och överblicka sina program.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Vad skrivs ut när man kör följande program?'''&lt;br /&gt;
&amp;lt;pre&amp;gt;# Skriv ut Annas telefonnummer&lt;br /&gt;
namn = 'Anna'&lt;br /&gt;
telefon = '06509911122'&lt;br /&gt;
mobil = '07079911322'&lt;br /&gt;
print namn, &amp;quot;har telefon&amp;quot;, telefon&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''Svar:''' &amp;lt;span style=&amp;quot;color:white&amp;quot;&amp;gt;Anna har telefon 06509911122&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
 &lt;br /&gt;
Börja med att presentera dig genom att skriva ett&lt;br /&gt;
inlägg under rubriken Intro i kursens forum. Om du inte har lust&lt;br /&gt;
att berätta om dig själv så kan du alltid skriva ett kort inlägg:&lt;br /&gt;
&amp;lt;pre&amp;gt;Hej, jag heter Stefan och har skostorlek 41.&amp;lt;/pre&amp;gt;&lt;br /&gt;
Du får gärna ljuga om skostorleken med det är bra om namnet stämmer!&lt;br /&gt;
&lt;br /&gt;
Nu är det dags att göra kursens första test.&lt;br /&gt;
Under rubriken Examination på kursens förstasida hittar&lt;br /&gt;
du samtliga test och inlämningsuppgifter.&lt;br /&gt;
Testet rättas automatiskt och du har möjlighet att göra&lt;br /&gt;
om testet flera gånger om du inte lyckas på första försöket.&lt;br /&gt;
&lt;br /&gt;
Om det är något som du undrar över i det här avnsnittet eller&lt;br /&gt;
i testet så är det fritt fram att fråga och diskutera i kursens forum.&lt;br /&gt;
Men undvik att avslöja de rätta svaren på testfrågorna!&lt;/div&gt;</description>
			<pubDate>Wed, 20 Jun 2007 12:54:45 GMT</pubDate>			<dc:creator>KTH.SE:u1xsetv1</dc:creator>			<comments>http://wiki.math.se/wikis/dd100n_0701/index.php/Diskussion:1._Programmeringsintro</comments>		</item>
	</channel>
</rss>