Denne siden er tenkt som veldig kjapt innføring repetisjon av sentrale elementer i Python programmeringsspråket. Noen konsepter er omskrevet veldig grovt og vi viser til forskjellige kapitler i boken Practical Programming. Vi anbefaler derfor at du supplerer denne teksten her med andre ressurser, f.eks.:
- Python Lærepgrogram på W3Schools
- Python Standard Bibliotek Oversikt
- Det offisielle Python Lærepgrogram
- også vil du sannsynligvis finne masse andre Python læreprogram...
Python er en tolket programmeringsspråk. Det vil si at en spesiell program: fortolkeren (engl. interpreter) leser inn instruksjonene og utføre tilsvarende kommandoer.
Når du har installert Python kan du åpne fortolkeren ved å åpne en Terminal og skriver
> python
hvis du er på Windows, eller
$ python3
hvis du er på Linux eller Mac.
Fortolkeren leser en kommando om gangen, evaluere den, og så gi deg resultatet tilbake:
Python 3.10.6 (v3.10.6:9c7b4bd164, Aug 1 2022, 17:13:48) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 2 + 3
5
>>> print("Hei verden")
Hei verden
>>> import math
>>> math.sqrt(9)
3.0
>>> quit()
Som su ser kan du avslutte fortolkeren ved å skrive quit()
.
Det å utvikle større programmer direkte i fortolkeren kan rask bli svært uoversiktlig.
Derfor skriver man Python kode vanligvis i filer.
En slik fil blir kalt Script.
En Skript er en vanlig tekstfil med et navn som slutter på .py
og inneholder en sekvens av Python kommandoer.
Vi anbefaler nå at du åpner opp din favoritt teksteditor elle ennå bedre: en IDE som PyCharm eller VS Code.
For å følge med, lag en ny Python fil med valgfri navn (f.eks.firststeps.py
) og åpner den file i editoren.
Til å begynne, kan du prøve deg på det det programmet som var grunnlag for mange utviklerkarrierer:
print("Hello, World!")
Du kan kjøre denne koden ved å skrive
$ python firststeps.py # python3 under Linux/Mac
i Terminal eller hvis du bruker en IDE kan du kjøre file direkte fra teksteditor vinduet.
For å forklare litt mer om hva du nettopp har laget:
- Du har skrevet din første Python script som består an en enkelt kommando
- Kommandoen kaller den innbyggete funksjonen
print()
print
-funksjonen har et argument (det som står i parenteser), nemlig en tekst ("Hello, World!"
).- Effekten av å kalle funksjonen er at den skriver ut argumentet på standard out, altså det som kommer tilbake fra kommandolinjen.
Framover skal vi bruke print()
veldig ofte for å vise hva som foregår i våres programmer.
La oss nå også overføre den beregningen vi hadde gjort direkte i fortolkeren inn i vår ny script fil.
print("Hello, World!")
2 + 3
Hva skjer hvis du kjører filen nå?
Savner du noe?
Det er fordi når du kjører en hel fil med fortolkeren så vil hele file utført som ett men uten at du blir informert over alle resultater som oppstår inn i mellom.
Uttrykket 2 + 3
beskriver en operasjon (addisjon) mellom to heltall verdier.
Når dette uttrykket blir "kjørt" så blir den evaluert, noe som produserer et nytt heltall (5).
Men siden vi gjør ikke noe mer med det, så forsvinner resultatet bare uten effekt.
For å bruke det videre må vi enten bruke det direkte i en funksjon eller vi lagrer resultatet i en variable for å kunne bruke det senere.
print("Hello, World!")
2 + 3 # beregne et uttrykk, men uten å lagre resultatet => ingen effekt
print(2 - 3) # beregne et uttrykk og gi det til print() funksjonen
x = 2 * 3 # igjen beregne et uttrykk, men denne gangen lagret i en variable
print(x) # bruke variabelen
Uten å nevne det eksplisitt har vi allerede brukt forskjellige Python datatyper:
Vi har brukt forskjellige tall: 2
, 3
og en kort tekst: "Hello, World!"
.
Alle har til felles at de representerer faste verdier.
I programmeringsspråk sin verden så kaller men disse ofte for konstanter.
Men hvorfor kunne vi skrive direkte skrive 2
men får skrive en tekst så måtte vi bruke ""
rundt?!
Det er fordi de har forskjellige typer!
Kanskje du husker når realfaglæreren maste med hvilket enhet når hen spurte etter lengde, hastighet, kraft ...
Like som du ikke kan bare plusse på en hastighet med en elektrisk spenning så har verdier i programmeringsspråk forskjellige "enheter", eller typer som vi kaller dem.
Heldigvis er mengden av disse elementære typene relativt liten. I Python finnes det:
- Tekst, dvs. en sekvens av tegn (engl. characters) som avgrenses med en innledende
"
og en avsluttende"
(alternativt kan du bruke''
). På engelsk kalles denne typen ofte for string og i Python heter denstr
. - Heltall (som kan være positivt eller negativt), På engelsk kaller man dem for integer og i Python heter de
int
. - Kommatall (men istedenfor komma så bruker man en desimalpunkt
.
=> amerikansk skrivemåte), På engelsk kaller man dem for floating point numbers og i Python heter defloat
. - Sannhetsverdi: Det finnes akkurat to sannhetsverdier:
True
ogFalse
. På engelsk kalles dem boolean values og i Python heter debool
.
Prøv å utvide ditt program med følgende linjer:
heltall = 42
kommatall = 3.1415296
tekst = "Hallooooooo"
sannhet = True
print(type(heltall))
print(type(kommatall))
print(type(tekst))
print(type(sannhet))
Som du ser har vi innført en ny innbygget funksjon (type()
) som du kan bruke å finne ut hva som er typen til en konstante eller variable skulle du være usikker.
Avhengig av typen, finnes det forskjelligere operatorer og funksjoner som kan brukes. Legg til følgende operasjoner og prøv å gjette hva som vil bli returnert av programmet før du kjører den.
print(heltall - 1)
print(kommatall ** 2)
print(tekst * 3)
print(not sannhet)
Typer som representerer tall, dvs. int
og float
støtter all de numeriske operasjonene som du kjenner fra før
99 + 1 # addisjon
42 - 1 # subtraksjon
2 * 3 # multiplikasjon
2 / 3 # divisjon
2 ** 6 # eksponent
Vær oppmerksom på at resultat av en divisjon alltid vil gi deg et kommatall (float
).
Det gjelder også når begge inputt tall er heltall og divisjonen går opp uten rest.
resultat = 4 / 2
print(resultat) # 2.0
print(type(resultat))
Også, når du anvender en operasjon av et heltall og et kommatall så vil du få et kommatall tilbake.
Hvis du er derimot interessert i heltall divisjon så bruker du //
.
Denne operasjonen kommer i lag med en operasjon som heter modulo (%
) som gir deg den mulige resten som kan oppstår i divisjonen:
# 7 delt med 3 blir 2 med rest 1 (7 == 2 * 3 + 1)
7 // 3 # == 2
7 % 3 # == 1
Vi anbefaler at du leser kapittel 2 ("Hello, Python") i boken Practical Programming som oppsummering av det vi har gjort så langt.
Tekster tilbyr også noen operasjoner som ser akkurat likt ut som de numeriske operasjonene men oppførelsen deres skiller seg vesentlig.
"Hallo" + ", " + "verden" # limer flere tekster sammen
"Hei!" * 3 # Gjentar en tekst flere ganger
Vi skal komme tilbake til str
typen lenger nede når vi snakker om funksjoner og lister.
Hvis du allerede nå vil lese mer om operasjoner på string så anbefaler vi lesing i kapittel 4 ("Working with Text") i Practical Programming.
Den sannhetsverdi datatypen bool
tilbyr tre operasjoner: and
, or
og not
.
Oppførelsen til disse operasjoner kan beskrives med sannhetstabeller:
Venstre | Høyre | Resultat |
---|---|---|
False |
False |
False |
False |
True |
False |
True |
False |
False |
True |
True |
True |
Venstre | Høyre | Resultat |
---|---|---|
False |
False |
False |
False |
True |
True |
True |
False |
True |
True |
True |
True |
Som man ser gi and
tilbake True
bare hvis begge argumenter er True
mens for or
holder det hvis bare et argument er True
.
Operatoren not
anvendes på kun ett argument og gjør True
om til False
og omvendt.
print(True and False)
print(True or False)
print(not True)
Sannhetsverdi brukes generelt i sammenheng med avgjørelser (if-then-else
) og løkker (while
).
Som vi vil snakke om om litt.
Du kan lese mer om sannhetsverdier i Kapittel 5 ("Making choices") i Practical Programming.
Du kan få deg en bool
-konstante ved å skrive True
eller False
direkte.
Men som vanlig vil du ikke bruke disse konstanter direkte men heller "beregne" dem:
Sannhetsverdier er nemlig som oftest et resultat av en sammenligning!
I Python finnes det mange måter å skrive ned sammenligninger:
2 == 2.0 # er to elementer lik
1.33 != 1.333 # er to elementer IKKE lik
1.9 <= 2 # mindre eller lik
1 < 1 # mindre
2 >= 1 # større eller lik
42 > 23 # større
Du kan faktisk også sammenligner tekst. Hva tenkter du kommer ut i følgende program:
print("Hei" <= "Hallo") # True eller False ?
Hvis resultatet ikke skulle virker intuitivt kan du lese mer om det som kalles "lexicografisk orden".
Til slutt noen advarende ord om bruk: Du må nemlig være oppmerksom når du anvender dem på argumenter med forskjellige typer er:
print(tekst + heltall) # Dette går ikke
Kanskje du har også sett at noen operasjoner forandrer typen underveis
print(type(heltall))
print(type(3))
print(type(heltall / 3))
Heldigvis kan typer ofte "transformeres": Nesten alt kan gjøres om til tekst. Og av og til kan et tekst blir til tall (hvis den bare inneholder sifrer).
print(type(str(kommatall)))
print(type(int("13")))
print(type(int("dettegårikkean"))) # Det vil ikke gå
Ved siden av operatorer (+, *, /, //, %, **) finnes det funksjoner som gjenkjennes gjennom bruken av parenteser (...)
.
Det finnes en funksjon som du alt har brukt masse fram til nå: print()
Også har vi brukt type()
, str()
, int()
for å finne ut mer om typen eller for å transformere typer.
Her kommer noen eksempler av slike "innebygget funksjoner":
lengde = len(tekst) # lengde av en tekst
print(lengde)
print(round(kommatall, 2)) # runder ned et tall
print(abs(-5)) # fjerner et mulig minus tegn fra et tall
Du kan definere dine egne funksjoner slik:
def hils_paa(fornavn, etternavn):
print("Hei " + fornavn + " " + etternavn + "!")
print("Hvordan har du det?")
En definisjon innledes av det reserverte nøkkelordet def
.
Etterpå må du gi din funksjon ett navn følgt av parenteser.
I parentesene kan du definere funksjonsargumenter (Du kan definere flere ved å bruke ,
).
Argumenter kan brukes som variable i selve funksjonsinnholdet.
Etter parentesene følger det en kolon (:
).
Nå kan du definere alt det din funksjon skal gjøre.
Du skriver altså Python uttrykk.
Det er viktig at du skriver fire innledende tomroms tegn i hver linje som tilhører funksjonen.
Python er nemlig et språk som bruker signifant whitespace for å gjenkjenne blokker.
Et blokk er flere kodelinjer som hører sammen.
Du kan kalle din nye funksjon rett etterpå med
hils_paa("Lars", "Kristensen")
Du kan lese mer om funksjoner i kapittel 3 ("Designing and Using Functions") i Practical Programming.
Ofte vil du gjøre visse ting avhengig av en betingelse.
Det er her en bruker en kjent programmeringsspråk struktur som heter if-then-else
.
klokeslett = 6 # kl 6 på morningen
if klokeslett < 7:
print("Sov videre!")
else:
print("Tid til å stå opp!")
Dette kodeeksemplet viser hvordan du skriver if-then-else
i Python.
Den ledes inn med if
fulgt av en betingelse, dvs. et uttrykk som resultere i en sannhetsverdi.
Etterpå kommer det en kolon og så definerer du en blokk med kode (akkurat som i en funksjonsdefinisjon: altså bruker 4 tomrom) som skal utføres hvis betingelsen er sant.
Du kan også legge til en else
part med kode som skal kjøres hvis betingelsen er ikke sant.
Når du vil skrive programmer for å løse problemer i den ekte verden må man stort sett handtere mye data på en gang. I Python kan du jobbe med en mengde av verdier ved å bruke lister.
arbeidsdager = ["Ma", "Ti", "On", "To", "Fr"] # Lager en liste ved å nevne elementer
wednesday_my_dudes = arbeidsdager[2] # tilgang til enkelte elementer gjennom indeks
problem_day = arbeidsdager[0] # Python begynner å telle på 0
nesten_helg = arbeidsdager[-1] # man kan også telle fra slutten
En liste defineres ved å bruke firkantbrakett ([ ...]
).
Listelementer skrives mellom dem skilt med ,
.
For å komme seg til et enkelt element i en liste kan du bruker indekser, dvs. posisjonsnummeret til et element i listen.
Her er det viktig å tenke på at Python begynner tellingen på 0
og ikke 1
!
Tekster (str
verdier) oppfører seg veldig lik som lister:
tekst = "hallo"
bokstav = tekst[1]
print(bokstav)
Lister brukes ofte i forbindelse med noe som kalles for
-løkker:
for dag in arbeidsdager:
print(dag)
Løkker er brukt til å repetere kodeblokker.
En for
-løkke går gjennom en liste å repetere koden for hvert element i listen.
I dette tilfelle vil den skrive ut alle dagene.
Det finnes også en annen type løkke: while
.
Som har følgende format:
while <betingelse>:
<blokk>
Den repeterer kodeblokken så lenge betingelsen er sant.
while
-løkker er mer fleksibelt en for
-løkker.
I tillegg kan man gjenskape en oppførelse av for
-løkker gjennom while løkker:
i = 0
while i < len(arbeidsdager):
dag = arbeidsdager[i]
print(dag)
i += 1
Du kan lese mer om funksjoner i kapittel 8 ("Storing Collections of Data Using Lists") og mer om løkker i kapittel 9 ("Repeating Code Using Loops") av Practical Programming.
Istedenfor lister kunne du også bruke tupler. Overfladisk ser tupler akkurat likt ut som lister (sett bort fra at de skrives med vanlige parenteser)
skandinavia = ('Norge', 'Danmark', 'Sverige')
norge = skandinavia[0] # Tilgang til elementer fungerer likt
Den store forskjellen til en liste er at tupler kan ikke endres med en gang de er kreert. Det betyr at følgende kode vil slå feil
skandinavia[1] = 'Island'
En annen viktig datatype som hjelper med å jobbe med samlinger av verdier er ordbok eller dictionaries som de heter på engels.
En dictionary eller kort dict
som Python kaller den, er en liste av nøkkel: verdi
parer.
En dict
defineres ved bruk av krøllparenteser ({ ... }
).
pronomener = {'Oslo': 'Jeg', 'Bergen': 'Eg', 'Trondheim': 'Æ'}
Du kan få tilgang til verdi elementene ved å bruke nøkkelen:
print("I Bergen sier man " + pronomener['Bergen'])
print(pronomener[0]) # Dette stemmer fra lister og fungerer ikke for dict
dict
objekter tilbyr noen spesielle funksjoner .keys()
, values()
, .items()
som kan brukes til å utforske dem:
for key in pronomener.keys():
print(pronomener[key] + " er fra " + key)
for value in pronomener.values():
print(value)
for noekkel_verdi_par in pronomener.items():
print(type(noekkel_verdi_par))
Teoretisk kunne man en altså oppfatte en liste som en dict
der nøklene er tall begynnende fra 0
.
frukt_list = ['epler', 'banan', 'pærer']
frukt_dict = {1: 'banan', 0: 'epler', 2: 'pærer'}
for i in range(0, 3):
print(frukt_list[i] == frukt_dict[i])
Du kan lese mer om tupler og ordbok i kapittel 11 ("Storing Data Using Other Collection Types") i Practical Programming.
Til syvende og sist må vi kort snakke om filer. Filer er den primære måten å lagre informasjon i en datamaskin. Python tilbyr funksjoner for å lese fra filer og skrive til filer.
file = open('ing301public/week2-introduction/week2.md', 'r') # Du kan tilpasse filstien til en fil på din maskin
for line in file:
print(line) # skriver ut alle linjer i en gitt fil
file.close() # Du skulle ikke glemme denne linjen fo å unngå _Memory Leaks_
Denne koden viser hvordan du kan bruken funksjonen open()
til å lese fra en fil.
file = open('arbeidsdager.txt', 'w')
for dag in arbeidsdager:
file.write(dag + "\n")
file.close()
og denne koden viser hvordan du kan bruke open()
til å skrive til en fil.
Du kan lese mer om filer i kapittel 10 ("Reading and Writing Files") i Practical Programming.