Python -- är inte det en orm? (del 1)
Förord
Ett skriptspråk som används mer och mer är Python, även om det kanske inte är så känt i alla kretsar ännu. I denna artikelserie ska jag introducera python och ta upp grunderna i python programmering.Innehåll
»»
»
»
»
»
»
»
»
»
»
Så vad är då Python?
Python är ett interpreterat, objektorienterat språk med dynamisk och stark typning. Python i sej själv är relativt litet och enkelt att lära sej, men kommer med "batterier inkluderade", dvs. dess standardbibliotek innehåller en massa nyttig funktionalitet. Speciellt är att språket använder indentering som blockavgränsare, vilket kan kännas konstigt först, men är praktiskt och tvingar fram "snygg" kod. Syntaxen är även sådan att den mer eller mindre är "exekverbar pseduokod".
Python program är plattformsoberoende och kan köras på alla plattformar som tolken portats till. (vilket inkluderar alla "vanliga" plattformar..)
Python utvecklas under en open-source licens och du kan fritt använda python även i kommersiella sammanhang.
Skaffa Python
För att börja använda python behöver du ha python tolken (eng: interpreter) installerad.Denna kan gratis laddas hem från den officiella hemsidan
För windows användare kan ActivePython (
windows-specifika moduler som kan vara bra att ha senare samt en sökbar hjälpfil/API referens.
Tolken
Eftersom python är ett interpreterat språk behövs en tolk. Om python är installerat korrekt så startas den genom att skriva python i ett kommandofönster. Det borde då se ut ungefär som följande:
C:\Documents and Settings\Simon>python
Python 2.3 (#46, Jul 29 2003, 18:54:32) [MSC v.1200 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
Några tips för att effektivt använda tolken:
- >>> är den normala prompten som betyder att tolken väntar på input.
- ... är prompten som visas när någonting fortsätter från följande rad
- help(
) visar hjälp om- dir(
) listar attribut/funktioner på - dir(
Hello World
"Standardenligt" börjar vi med ett litet "Hello world" program, men först ska vi starta python tolken.Nu är det dags att skriva vår första rad med python kod. Ett simpelt hello world program ser ut som följande:
print "Hello World"
Det var väl enkelt? print skriver alltså ut texten till skärmen. Och en sträng definieras antingen med dubbla citationstecken ("") eller med enkla citationstecken ('').
Vilkorssatser
Än så länge kan vi bara skriva ut text till skärmen, och att bara göra det blir ju lite tråkigt i längden. Därför ska vi nu även lära oss vilkorssatser.
svar = 42
if svar == 42:
print "Svaret på allt är", svar
elif svar == 43:
print "Svaret %d är lite fel" % svar
else:
print "Svaret är väldigt fel"
Det var mycket nytt på en gång, först initialiserar vi variabeln svar till 42, typdeklarationer behövs inte. Vi ser också att parenteser inte behövs runt villkoret, (men parenteser kan naturligtvis användas). Blocken som hör till if, elif och else markeras med indentering. Elif och else blocken är valbara (optional).
print "En sträng", "en annan sträng", 42
Skriver ut dom båda strängarna och siffran 42 efter varandra separerade med ett mellanrum. För strängformatering kan även stränginterpolering, á la C:s printf användas, i så fall används formatsträng % variabel.
>>>print "Svaret är %d" % 42
skriver ut: Svaret är 42
Använda kod från fil
Nu tänker du säkert att det är jobbigt att skriva in allt hela tiden, det måste finnas ett enklare sätt. Det gör det, spara koden i en fil filnamn.py och exekvera den sedan med kommandot python filnamn.py.
Iterationer
I python finns det for och while loopar.
for element in :
;
eller
while :
;
En lista skrivs med hakparenteser
minlista = [1,2,3,4,5]
Nu innehåller minlista en lista med elementen 1 tillochmed 5. Listans indexering är 0 baserad. Vill vi accessera det t.ex. tredje elementet i listan kan vi göra det med minlista[2]
for i in [1,2,3,4,5]:
print "Siffra", i
skriver ut:
Siffra 1
Siffra 2
Siffra 3
Siffra 4
Siffra 5
Vill vi göra samma sak med en while loop blir det
i = 1
while i < 6:
print "Siffra", i
i += 1
Att göra en lista att iterera över är en så vanlig funktion så det finns en inbyggd funktion som hjälper till att göra en sån. range([start,] stop[, step]) returnerar en lista startandes från start (kan lämnas bort, defaultvärde är 0) till, men exklusive stop, med steglängden step. Skriver vi om vår for loop användandes range kan vi skriva:
for i in range(1, 6):
print "Siffra",i
Funktioner
Än så länge har vi bara skrivit sekvensiell kod. Funktioner är bra för att dela upp programmet i logiska delar. Vi tänker oss att vi behöver göra en funktion som räknar antalet vokaler a:n (stora och små) i en sträng.
# definiera funktionen countVovels som tar en parameter
def countVovels(mystring):
"""Detta är en sk. docstring, den kan användas för att dokumentera
funktionen och dess parameter samt returvärden. Den kan fortsätta
på flera rader samt innehålla citationstecken 'så här' eller "så här"
En docstring börjar med tre stycken citationstecken och avslutas
med tre stycken citationstecken"""
antal = 0
# iterera över tecknena i en lower-case kopia av strängen
for character in mystring.lower():
if character == "a":
antal = antal + 1
return antal
En funktion definieras med def funktionsnamn(parameter, parameter2):. Funktionen är ett block, som indenteras. Vi har inga a:n i början så antal initialiseras till 0. För att vi ska kunna kolla både stora och små a:n gör vi en kopia av strängen mystring med bara små bokstäver. sträng metoden .lower() returnerar en kopia med endast gemener. Vi använder oss av att vi kan iterera över de enskilda tecknena i en sträng. Slutligen returnerar vi antalet hittade a:n med hjälp av return. Allting som finns mellan ett # tecken till radens slut tolkas som en kommentar.
test = "Hmm.. hur många a:n finns i den här meningen. Alla A:n ska räknas"
print "Hittade", countVovels(test),"a:n i meningen"
# Skriver ut "Hittade 7 a:n i meningen"
Datatyper
Python har följande grundläggande datatyper inbyggda- Heltal ex. 42
- Decimaltal ex 1.0
- Komplexa tal ex. 1+0.5j
- Strängar ex "Hello World", 'Hello World', """Hello World""", '''Hello World'''
Alla grundläggande datatyper är ej muterbara (eng. immutable).
Förutom dessa grundläggande datatyper finns även några sammansatta typer inbyggda.
- listor - muterbar (eng. mutable), kan innehålla heterogen data. ex. [1,2,3], ["ett", 2.0, 3], delvis jämförbar med en java.lang.Vector i java eller vector i STL.
- dictionaries - muterbar, namn -> värde mappning, kan även den innhålla heterogen data. ex. {"namn":"värde", "Pelle":123}, delvis jämförbar med en hashtabell eller map i STL.
- tuppler - "listaktig" datatyp som är immutable. (1,2,3), ("ett", 2.0, 3)
Moduler
För att använda funktionalitet som finns i standardbiblioteket måste vi först importera modulen/paketet som denna finns i. Exempelvis finns dom matematiska funktionerna som sqrt, sin och cos i modulen math. Vi kan importera moduler med hjälp av import och sedan referera till modulnamn.funktion.
import math #importera math modulen
print math.sqrt(3) #skriv ut kvadratroten av tre
Exempel :: Hårddisksstatus
Ibland kanske man undrar vart allt hårdskiveutrymme tagit vägen, låt oss göra ett litet program som tar reda på det.Vi vet* att i os modulen finns en funktion som rekursivt traverserar katalogerna och returnerar en tuppel (nuvarande katalog, lista med katalognamn, lista med filnamn). Den verkar vara lämplig för vårt ändamål. Vi vet också att i os.path modulen finns en funktion getsize(filnamn) som returnerar storleken på en fil, men den behöver sökvägen och inte bara ett filnamn. Sökvägen kan t.ex. fås med funktionen join(katalog, filnamn) som sätter ihop katalognamnet med filnamnet.
*Hur kan vi "veta" vad som finns var? Ett enkelt sätt är att använda API referensen som installerades om du installerade ActivePython. Annars kan man titta i Global module index(
#importera os modulen
import os
#importera os.path modulen
import os.path
#loopa över katalogerna
for current, directories, files in os.walk('.'):
# Skriv ut katalognamnet
print current, "consumes",
# initialisera storleksräknaren
size = 0
# iterera över varje fil
for filename in files:
# addera filens storlek till den totala storleken
size += os.path.getsize(os.path.join(current, filename))
# skriv ut storleken i kilobyte
print size / 1024,"kB in", len(files), "files."
Det gick väl enkelt? Vi fortsätter python introduktionen i nästa kapitel.
PS. kommentarer, tips, klagomål på artikeln samt även ideér vad som bör tas upp i dom kommande delarna mottages med tacksamhet!
Benny Skogberg
Hur fungerar det att bygga GUI i Python?