JohnyTexs programmeringsskola
Förord:
Välkommen! Det här är tänkt att vara den första i en serie programmeringslektioner som (förutsatt att jag orkar) kommer att gå från att lära ut grunderna i programmering till att bygga ett komplett spel.
Förhoppningsvis kommer jag att hinna lägga upp ungefär en lektion i veckan på min blogg. Blogginläggen är dock först och främst till för att samla alla lektionerna på ett och samma ställe för enkel åtkomst - till varje lektion kommer jag också att skapa en tråd i det här forumet där det är tänkt att läsarna ska kunna ställa frågor, eftersom kommentardelen av bloggen lätt kan bli sönderspammad om alla vänder sig dit när de behöver hjälp.
Dessa lektioner är först och främst tänkta som utkast till en mer slipad (och kanske mer omfattande) serie lektioner, vilket innebär att jag gärna tar emot kommentarer och förslag från er läsare.
Programmeringsspråket som används är Python, vilket kommer ges en utförlig introduktion nedan. Tyvärr är jag ingen Pythonexpert, så om ni tycker att något ser skumt ut eller verkar vara fel - säg till!
Har alla gått på toaletten och är fastspända ordentligt? Nå, då börjar vi!
Lektion #1 - Introduktion, variabler
Blogginlägg till Lektion #1
Introduktion till - och installation av - Python:
Programmeringsspråket som kommer användas i den här serien lektioner är (som sagt) Python. Jag har valt Python eftersom det är ett modernt språk som är effektivt, användarvänligt och lätt att lära sig. Python ger programmeraren väldigt stor frihet, men - som alla som läst sin Spindelmannen vet - stor frihet innebär även stort ansvar. Dock hoppas jag kunna styra undan er nybörjare från de största fallgroparna, så att ni undviker att lära er dåliga vanor eller farliga programmeringsbeteenden.
Till skillnad från exempelvis C så är Python ett "tolkat" språk. Vad menas med det? I vanliga fall så måste koden man skrivit "översätts" (kompileras) till maskinkod för att hårdvaran ska förstå den. Maskinkod är dock väldigt hårt kopplat till systemet som det är tänkt att köras på, vilket gör att man måste kompilera olika versioner av programmet för olika plattformar. Tolkade språk undviker detta problem genom att inte översätta ditt program till maskinkod förrän det ska köras. Nackdelen med detta är att man måste ha ett program som hanterar översättningen. Den stora fördelen är att när du väl har skrivit ditt program så kan vem som helst som har installerat Python köra det - oavsett plattform.
För att installera Python, följ någon av länkarna nedan:
Python 2.5 - installationsfil för Windows
Python 2.5 - installationsfil för OSX
Tillhör du den extremt lilla minoritet som inte använder något av dessa operativsystem finns det fler versioner på Python.orgs nerladdningssida
När installationen är färdig är du redo att gå vidare till nästa steg.
(Python.org, Pythons officiella hemsida, är för övrigt en bra resurs om man vill lära sig mer om Python eller kolla upp något i dokumentationen.)
Lek lite försiktigt med Python:
Det finns i princip två sätt att använda Python: Förutom att man i vanlig ordning kan skriva program som man sedan kör så går det även att direkt skriva kommandon i den interaktiva Pythontolken, vilket vi ska testa nu.
Starta antingen "Python" eller "IDLE" (grafisk version av Pythontolken). Windowsanvändare har antagligen fått en katalog i Start-menyn där de kan hitta genvägar till båda, annars ligger python.exe i rotkatalogen för din Python-installation.
När du startat Python eller IDLE bör du se något liknande:
>>>
Detta innebär att Python är berett att ta emot inmatning och lyda din minsta vink! Testa att skriva in ett matematiskt uttryck, t.ex. 5 * 5 och tryck på Enter. Du bör se något liknande:
>>> 5 * 5
25
>>>
Fantastiskt! Python har just räknat ut produkten av fem gånger fem! Att bara använda Python som en glorifierad miniräknare vore dock - minst sagt - slöseri. Nu går vi vidare till en av programmeringens grundstenar: variabler.
Variabler:
Variabler används för att spara data. Testa att skriva in uttrycket x = 99 i Pythontolken och tryck Enter. Följande bör hända:
>>> x = 99
>>>
Vad innebär detta? Jo, på någon plats i datorns minne har nu heltalet 99 lagrats, och du kan komma åt det igen genom att använda variabelns namn - x. Testa att skriva x och trycka Enter:
>>> x
99
Det som hände när vi skrev x = 99 var att variabeln "x" tilldelades värdet 99. Skriver vi namnet på en variabel i kommandotolken och trycker Enter kommer den att skriva ut variabelns värde.
Du kan döpa dina variabler till vad som helst, förutsatt att namnet inte innehåller några specialtecken (d.v.s. mellanslag, plus / minus, etc.), förutom understreck, och inte är groteskt långt. Att du kan välja vilka variabelnamn som helst betyder dock inte att du ska göra det - det du bör göra är att välja relevanta namn till dina variabler. Välj namnen du ger till dina variabler med samma omsorg som om de vore till dina egna barn!
Lite om syntax:
Det mesta som är giltigt i vanlig algebra är giltigt i Python. y = x * 5 + 4 är t.ex. ett giltigt uttryck. Dock fungerar inte y * 5 = z. Varför inte?
När vi skriver x = 5 säger vi till Python: "på minnesplatsen som heter 'x' ska du spara värdet '5'." Till vänster om likamedtecknet ska det alltså stå ett variabelnamn och ingenting annat.
Skriver vi x * 5 = 5 säger vi: "på minnesplatsen 'x' multiplicera med 5 ska du spara värdet '5'." och på detta kommer Python att svara "Va?!". Detta kallas ogiltig syntax - man kan likna det vid att du går fram till någon på stan och säger "Öpö".
Pröva att skriva x * 5 = 5 och se vad som händer:
>>> x * 5 = 5
SyntaxError: can't assign to operator
Python är alltås inte mer överseende än att det klagar om det inte förstår vad tusan det är du håller på med, vilket är tur.
Datatyper:
Nu kanske du tänker att "allt det där var ju inte så märkvärdigt, jag kan göra samma sak på min miniräknare". Men kan din miniräknare göra DET HÄR?:
>>> name = "John Cleese"
>>> name
'John Cleese'
>>>
Ja, det går alltså att spara annat än siffror i variabler! Faktum är att det finns en hel mängd olika datatyper i Python. Heltal är en av dem, och text - som oftast kallas strängar när man pratar om programmering - är en annan. Förutom heltal finns det som ni säkert gissat även flyttal (d.v.s. decimaltal). Något som bör nämnas om flyttal är att decimalkomma i Python (och de flesta andra programmeringsspråk) skrivs med en punkt.
>>> pi = 3.1415
Vi kommer att gå igenom fler datatyper i framtida lektioner, men nu får det nog räcka för i dag. Lämna gärna kommentarer om vad ni tyckte om lektionen, dess innehåll, längd och dyl. Om ni har programmeringsfrågor så var vänlig och ställ dem i den här tråden! Tveka för all del inte att fråga eller tycka om minsta lilla grej, era frågor och åsikter är mycket viktiga när jag ska utvärdera - och förhoppningsvis förbättra - lektionen.
Övningar tills nästa gång:
* Förklara följande begrepp och hur de relaterar till varandra: variabel, minnesplats, datatyp
* Experimentera lite med matematiska uttryck där du använder variabler
* Testa vad som händer om du multiplicerar en sträng med ett heltal!
* Går det att multiplicera en sträng med ett flyttal?
* Att tänka på: En mycket viktig skillnad mellan Python och övriga programmeringsspråk är att de variabelnamn och testutskrifter som normalt används i exempelprogram har bytts ut mot Monty Python-referenser. Vill du visa att du är en riktigt erfaren Pythonprogrammerare ska du alltså skriva "Spam, spam, spam" istället för "Hello World!"
* Att tänka på: En mycket viktig skillnad mellan Python och övriga programmeringsspråk är att de variabelnamn och testutskrifter som normalt används i exempelprogram har bytts ut mot Monty Python-referenser. Vill du visa att du är en riktigt erfaren Pythonprogrammerare ska du alltså skriva "Spam, spam, spam" istället för "Hello World!"
Hahaha, så det är därför Python är så populärt!
Riktigt bra guide, lite intressant med python.
Att bara använda Python som en glorifierad miniräknare vore dock - minst sagt - slöseri.
Precis det jag upplever att det är nu, fast med variabler.;)
BTW, när kommer nästa?
Nästa del kommer förmodligen i kväll / i natt - då hade jag tänkt ta upp nyckelord, funktioner och hur man skriver riktiga program
Sitter nu och gör "tidsprogrammet", problemet är dock att fönstret när man öppnar stängs ner direkt efter:(.
EDIT: Kunde öppna modulen i IDLE utan problem.
Ah, justdet. Eftersom programmet anser att det är färdigt när det skrivit ut allting så stängs fönstret automatiskt direkt, borde ha nämnt det
Öppna programmet i IDLE-editorn och välj Run->Run Module (eller tryck F5) så blir det lite vettigare
Lektion #2 - Skriva program, nyckelord, funktioner, kommentarer
Ditt första program:
Hittils har ni bara skrivit kommandon i Pythontolken för att få Python att göra något. Nu är det dock dags att bli en riktig Pythontjusare och börja skriva riktiga program!
Pythonprogram kan skrivas i vilket textredigerare som helst, men de flesta föredrar att ha en speciell editor för ändamålet. I IDLE finns en sådan editor inbyggd, som startas genom att välja File -> New Window. Några andra populära editorer är PyScripter och Komodo Edit. IDLE-editorn räcker dock gott och väl för ändamålet och jag rekommenderar er att köra den så länge.
Skapa en ny fil och skriv följande:
print "Spam, spam, spam"
Spara filen som "spam.py". Du kan köra programmet antingen genom att dubbelklicka på den i din filbrowser eller genom att välja Run -> Run Module i IDLE-editorn. Du bör få följande utskrift:
Spam, spam, spam
Det som händer är att Pythontolken går igenom vårt program, rad för rad, och utför instruktionerna vi har skrivit. Strängar - som "Spam, spam, spam" - har vi tagit upp tidigare, men vad är "print" för någonting?
Nyckelord och operatorer:
print är ett av cirka 30 nyckelord som finns i Python. Nyckelord, samt operatorer (som *, =, +, etc. ) är grundstenarna i ett programspråks syntax. Precis som du använder verb, substantiv och adjektiv när du pratar med människor använder du operatorer och nyckelord när du pratar med Python. print är alltså ditt sätt att tala om för Python att du vill skriva ut någonting på skärmen.
Vi testar att göra ett till program bara för att det är så kul:
print "Python, hur många sekunder går det på ett dygn?"
hours = 24
minutes = hours * 60
seconds = minutes * 60
print seconds
Programmet ger utmatningen:
Python, hur många sekunder går det på ett dygn?
86400
Visst, det här funkar, men att bara spotta ur sig en siffra känns nästan lite oförskämt. Vi gör programmet lite artigare:
print "Python, hur många sekunder går det på ett dygn?"
hours = 24
minutes = hours * 60
seconds = minutes * 60
print "Svar: Det går ", seconds, " sekunder på ett dygn"
Vilket ger utmatningen:
Python, hur många sekunder går det på ett dygn?
Svar: Det går 86400 sekunder på ett dygn
Som ni ser går det bra att blanda text och variabler i utskriften. Vi kan även spara in några rader genom att skriva hela uträkningen som ett enda uttryck och direkt skriva ut det:
print "Python, hur många sekunder går det på ett dygn?"
print "Svar: Det går ", 24 * 60 * 60, " sekunder på ett dygn"
En viktig insikt:
Att vi lika gärna kan skriva en siffra, en variabel eller ett helt uttryck beror inte på någon speciell egenskap hos print. Anledningen är att det fungerar är att de alla går att tolka som värden (i det här fallet av typen heltal) och därför är ekvivalenta. Där Python förväntar sig ett värde går det därför alltid lika bra att skriva ett värde, en variabel, eller ett uttryck.
Funktioner:
Vad är en funktion? En funktion, i programmeringstermer, tar en viss indata (som kallas argument), utför en mängd instruktioner och lämnar ifrån sig ett värde (som kallas funktionens returvärde). En lite enklare liknelse man brukar använda är att funktioner är som verb i grammatiken - man har något som gör någonting med något annat.
Om du inte använde en räknesticka i skolan har du säkert använt din miniräknare för att t.ex. ta fram roten ur ett tal - du har då använt en funktion. Talet du matar in är funktionens argument och resultatet är funktionens returvärde.
print är ganska lik en funktion - den tar ett argument och skriver ut det på skärmen. Vi kan testa att göra en funktion som tar ett tal som argument och ger kvadraten av talet som returvärde:
När man skriver en funktion kallas det att man definierar den. Skapa ett nytt dokument och skriv följande:
def square(x):
_ _ result = x * x
_ _ return result
Vad har vi gjort? Jo, vi har definierat en funktion som heter square och som tar en parameter x. De indenterade raderna är de instruktioner som ska utföras när vi kör - eller anropar, som det heter - vår funktion. Den sista raden börjar med nyckelordet return - return gör att "result" blir vår funktions returvärde, d.v.s. vi säger åt funktionen att mata ut "result".
OBS! return avslutar även funktionen, så du kan inte lägga några instruktioner efter return.
Det här innebär alltså att vi var som helst i programmet kan anropa square(x), förutsatt att vi gör det på en rad som ligger efter definitionen. (Python kan nämligen inte anropa funktioner innan man har definierat dem.)
Istället för att skriva
y = x * x
kan vi nu göra samma sak genom att skriva
y = square(x)
Ändra ditt program så att det ser ut så här:
def square(x):
_ _ result = x * x
_ _ return result
a = 50
print "Kvadraten av ", a, " är: ", square(a)
Spara programmet som "square.py" och kör.
Mer om funktioner:
En skillnad mellan funktioner i matematiken och funktioner i Python är att Pythonfunktioner kan vara utan argument och returvärden. T.ex. kan vi definiera en funktion på följande sätt:
def dead_parrot_sketch():
_ _ print "This parrot is no more!"
_ _ print "It has ceased to be!"
_ _ print "It's expired and gone to meet its maker!"
och anropa den som så:
dead_parrot_sketch()
vilket ger utmatningen:
"This parrot is no more!"
"It has ceased to be!"
"It's expired and gone to meet its maker!"
Vi har testat att skriva funktioner med ett argument och funktioner utan argument. På samma sätt kan vi definiera funktioner som tar fler än ett argument - den här funktionen räknar ut längden på en rätvinklig triangels hypotenusa genom att ta längden på dess sidor som indata:
def calculate_hypotenuse(a, b):
_ _ length = (a ** 2 + b ** 2) ** 0.5
_ _ return length
(** betyder "upphöjt till" i Python)
Nyttan med funktioner:
Låt oss säga att du ska skriva ett program där du kommer att behöva göra om grader till radianer. Istället för att skriva en hel uträkning varje gång du vill göra konverteringen kan du skriva en funktion som tar ett gradtal som argument och returnerar resultatet i radianer. Vill du sedan ändra på hur konverteringen från grader till radianer går till (man kanske har glömt att hantera fall där gradtalet > 360, t.ex.) så behöver du bara ändra på ett enda ställe i koden.
Funktioner är inte bara praktiska genom att de sparar tid - att på ett bra sätt dela upp de uppgifter ditt program ska utföra i funktioner gör dessutom koden mer lättläslig och strukturerad. Tänk på sakerna ditt program ska göra som en mängd verb - flytta spelaren, uppdatera skärmen, etc. - och dela upp det i funktioner därefter.
Skriv aldrig samma kod två gånger!
Som jag nämnde ovan så är en fördel med funktioner att man slipper skriva samma instruktioner flera gånger, men praxisen att återanvända kod, och att försäkra sig från att behöva skriva om saker, omfattar inte bara funktioner.
Säg att du har gjort ett spel där spelaren börjar med 100 hitpoints, och att spelarens hitpoints sparas i en variabel "hp". Låt oss säga att spelet även har powerups som återställer spelarens hitpoints till 100.
Dock kanske 100 hitpoints är alldeles för lite att börja med, så du ändrar det till 200. Men! Har du kvar definitionen att "hp" sätts till 100 när spelaren plockar upp en powerup får du problem - en spelare med 200 hitpoints som tar powerupen kommer att förlora halva sin livmätare!
Vad sägs om att spara mängden hitpoints spelaren börjar med i en variabel "start_hp"? På så sätt kan vi istället för att sätta "hp" = 100 sätta "hp" = "start_hp". Precis som i fallet med funktionerna så kan vi ändra funktionaliteten på flera ställen i programmet genom att bara ändra på en enda rad.
Att göra lite extra arbete nu för att slippa göra väldigt mycket onödigt arbete senare är en vanlig praxis inom programmering, och något man bör ha i tankarna.
Det passar bra att avsluta med de där visdomsorden, så nu får det räcka - det blev en väldigt lång lektion den här gången! Lämna gärna kommentarer om innehållet - Går det för fort fram? Är något oklart eller blir det för tjatigt?
Övningar tills nästa gång:
* Skriv en funktion "absolute_value(x)" som returnerar absolutvärdet av x.
* Skriv en funktion som räknar om grader till radianer. Använd %-operatorn (modulo) för att ta hand om tal större än eller lika med 360.
* I Python finns en rad inbyggda funktioner. "input()", som vi ska titta mer på nästa gång är en av dem. Ta en tjuvtitt genom att leta efter "input()" i Pythondokumentationen och skriv ett program som använder funktionen.
Märker att python är lite enklare än C#... länge sen jag höll på med fördefinerade funktioner, ger lite flashback. Tackar för intressant läsning!
Varsågod! ;D
Jag har en lång lista på saker som ska fixas i lektion #2; det är inga allvarliga grejer, men har sett några småfel här och där. Men det blir nog i morgon.
Som jag nu skrivit till i lektion #2 får ni gärna komma med förslag på vad för spel ni vill göra. Jag har några lämpliga alternativ, men tänkte ta tillfället i akt att göra de här lektionerna lite mer interaktiva än t.ex. en programmeringsbok.
Och som sagt, lämna gärna lite feedback på lektionerna!
Jag brukar använda mellanrum lite på samma sätt som man använder paranteser, för att förtydliga precedence och vilka saker som hör ihop. exemplet ovan hade jag nog skrivit som
>>> x = 5*5
eller
>>> x*5 = 5
om det nu var ett språk som faktiskt kunde hantera det
Men jag måste hålla med om att whitespace är inget man skall snåla med.
I never hate in plural.
Nu kan jag inte Python men när det händer i andra programmeringsspråk så är det för att programmet körs igenom och när det tar slut så avslutas det. Eftersom processorn är ganska snabb så hinner man knappt se programmet köras. Det jag alltid gjorde var att lägga till en inmatning i slutet så att programmet väntar på att du ska göra något. Men jag vet inte vad koden är för det i Python, tyvärr.
En fråga. Kan man inte få python-programmen att öppnas i DOS i stället? eller för att köra ett program gjort i python, måste man ha laddat hem python?
Jag är inte riktigt säker på vad du menar med öppnas i dos, men om du menar: "går det att köra pythonprogram från kommandotolken?" i så fall är svaret ja. Då slipper man problemet med att texten försvinner när programmet avslutas.
Svaret på andra frågan är också ja, du måste ladda hem pythontolken för att kunna köra pythonprogram.
I never hate in plural.