Kom i gang

Hvis du ikke har gjort det enda, må du installere Python og Visual Studio Code før du fortsetter.



Hello World

Det er tradisjon for at det første programmet man skriver når man lærer seg et nytt programmeringsspråk er et program som skriver ut ordene «Hello World» til skjermen. I Python ser programmet slik ut:

print("Hello World")

Et funksjonskall er en instruksjon om å utføre en bestemt oppgave. Et funksjonskall består av to deler:

  • Funksjonsnavn. I eksempelet over er print navnet på funksjonen.
  • Argumenter til funksjonen, omsluttet av paranteser. Dette er verdier vi gir til funksjonen som input. I eksempelet over er "Hello World" argumentet som sendes til funksjonen print.

Antall argumenter kan variere.

  • Hvis det er to eller flere argumenter, må de skilles med komma.
  • Hvis det er null argumenter, må det likevel være parenteser. For eksempel er print() et funksjonskall uten argumenter.

Kommentarer

Kommentarer er tekst i programmet vårt som blir fullstendig ignorert av Python. Alt som kommer etter en hashtag (#) på en linje blir ignorert, og er kommentarer.

print("Hello World") # Her er en kommentar
# print("På denne linjen skjer det ingenting")

print("Her er # i en streng.") # Hashtag mellom "hermetegn" telles ikke
Utskrift til terminalen

Print-funksjonen skriver ut verdier til terminalen.

print("Hello")
print("World")

Flere ting kan skrives ut på sammen linje.

# Verdiene som skal skrives ut må skilles med komma (Hello World 42)
print("Hello", "World", 42)

# Bruk end="" for å unngå linjeskift på slutten av linjen (HelloWorld42)
print("Hello", end="")
print("World", end="")
print(42)

Utskrift med f-strenger.

x = 2
y = 3
print(f"Visste du at {x} + {y} er {x + y}?") # Visste du at 2 + 3 er 5?

Hva skjer om du fjerner f‘en før hermetegnet i print-setningen?

Python som enkel kalkulator

Man kan bruke Python som en enkel kalkulator for å evaluere matematiske uttrykk.

print(2 + 2)       # Addisjon                               --> 4
print(5 - 3)       # Subtraksjon                            --> 2
print(2 * 3)       # Multiplikasjon                         --> 6
print()

print(157 / 10)    # Divisjon                               --> 15.7
print(157 // 10)   # Heltallsdivisjon (runder alltid ned)   --> 15 
print(157 % 10)    # Modulo (rest etter heltallsdivisjon)   --> 7
print()

print(3 ** 2)      # Potens                                 --> 9
print(max(2, 3))   # Største verdi                          --> 3
print(min(2, 3))   # Minste verdi                           --> 2
print(abs(-3))     # Absoluttverdi                          --> 3
print()

# Man kan også ha kombinerte uttrykk.
print(2 + 3 * 4)                  # 14
print(max(2, 3, 199, 4, 5) + 1)   # 200
print()

# Man kan bruke parenteser for å overstyre presedensen til operasjoner.
# Standard presedens (rekkefølgen operasjoner utføres i) er som i matematikk
print((2 + 3) * 4)                # 20
Variabler

En variabel er et navn som refererer til en verdi. Etter at en variabel er angitt, kan navnet brukes i stedet for verdien den refererer til.

x = 2
y = 3
print(x + y) # 5

Vi velger selv hvilket navn vi vil gi våre variabler. Variabelnavn kan ikke inneholde mellomrom eller spesialtegn, annet enn understrek (_).

work_hours_per_week = 12
number_of_weeks = 18
hourly_salary = 200

total_hours = work_hours_per_week * number_of_weeks
total_salary = total_hours * hourly_salary

print(f"Totalt antall timer:", total_hours) # Totalt antall timer: 216
print(f"Totalt lønn:", total_salary) # Totalt lønn: 43200

Det er viktig å gi variablene våre navn som tydelig beskriver hva slags verdi de representerer (gjerne inkludert hvilken enhet det er). Dette gjør det enklere å lese og forstå koden. Gode variabelnavn gjør at koden vår blir selvdokumenterende.

INF100 sin stilguide for variabelnavn:

  • Bruk selvdokumenterende variabelnavn
  • Bruk engelske variabelnavn
  • Bruk kun små bokstaver
  • Bruk understrek (_) for å skille mellom ord
Strenger

En streng er en verdi som representerer tekst. En streng består av bokstaver, tallsymboler, mellomrom, linjeskift og andre tegn.

print("Strenger skrives mellom hermetegn.")
print('Man kan også bruke apostrof.')
print(Hvis du ikke har hermetegn er det ikke en streng, og det krasjer)
# En streng kan lagres i en variabel.
foo = "bar"
print("foo") # "foo" er en streng (skriver ut: foo)
print(foo) # foo er en variabel (skriver ut: bar)
# En streng kan inneholde linjeskift (\n)
print("Denne strengen\ninneholder to\nlinjeskift")

# En streng kan inneholde hermetegn (")
print("Her \"er\" et hermetegn")
print('Her "er" et hermetegn') # bedre: bruk apostrofer

# En streng kan inneholde bakstrek (\)
print("C:\\mappe\\script.py")

Lengden av en streng

# len() finner lengden til en streng
x = "foo"
print(len(x)) # 3
print(len("foobar")) # 6
print(len("foo bar")) # 7
print(len("foo\nbar")) # 7 (linjeskift \n telles kun som 1)
print(len(" foobar  ")) # 9 (inkluderer mellomrom)
# En streng kan være «tom»
x = ""
print(len(x)) # 0
print(x) # printer en tom streng (altså ingenting) på denne linjen
print("---")

Operasjoner på strenger

# Strenger konkateneres (limes sammen) med pluss (+)
print("foo" + "bar") # foobar

a = "super"
b = "duper"
c = a + b
print(c) # superduper

Samme operasjon (+) fungerer ulikt på strenger og tall:

# Pluss med strenger: konkatinasjon
x = "12"
y = "34"
print(x + y) # 1234

# Pluss med tall: addisjon
x = 12
y = 34
print(x + y) # 46
# Strenger repeteres flere ganger med gangesymbol (*) og et tall
print("*" * 9) # *********

s = "bar"
print(2 * s) # barbar

Det er mulig å kombinere tekst og andre verdier med f-strenger. Legg merke til f før hermetegnet.

# Med en f-streng kan vi inkludere variabler i strengen
number_of_students = 800
course_id = "INF100"
print(f"Vi ønsker {number_of_students} studenter velkommen til {course_id}")

# Uten f'en får vi en logisk feil
print("Vi ønsker {number_of_students} studenter velkommen til {course_id}")
print()

# f-strenger kan også brukes for å lage verdier som lagres som en variabel
message = "Jeg lengter hjem"
log_message = f"Mottatt melding: {message}"
print(log_message) # "Mottatt melding: Jeg lengter hjem"

# f-strenger er ikke magiske
message = "Jeg er fornøyd"
print(log_message) # fremdeles "Mottatt melding: Jeg lengter hjem"
Input fra terminalen
# Les input og skriv ut en hilsen
print("Skriv ditt navn")
name = input()
print(f"Hei, {name}!")

Input-funksjonen returnerer alltid en streng, uansett hva brukeren skriver inn. Hvis vi skal bruke input fra brukeren som om det var et tall, må det konverteres til et tall med int (eller float) -funksjonen.

# Når input er et tall
print("Skriv et tall") 
a = input() # f. eks. 4

print("Skriv et tall til")
b = input() # f. eks. 2

print("Før konvertering er a og b strenger. a + b =", a + b) # 42

# Konverterer til tall
a = int(a)
b = int(b)

print("Etter konvertering er a og b heltall. a + b =", a + b) # 6
Syntaksfeil, krasj og logiske feil

Kildekoden til et dataprogram kan inneholde tre typer feil:

Syntaksfeil gjør at programmet vårt ikke starter i det hele tatt. Med litt øvelse er feilmeldingene om syntaks-feil som kommer fra Python ganske informative, og forteller oss nøyaktig hvor i programmet feilen er. For eksempel:

print("Programmet starter her") # Vi kommer ikke hit engang før krasjen
print("oj') # Syntaksfeil! (apostrof matcher ikke hermetegn rundt strengen)
print("Programmet er ferdig")

# Gir output:
#
#  File "foo.py", line 2
#    print("oj')
#          ^
# SyntaxError: unterminated string literal (detected at line 2)
print("Programmet starter her") # Vi kommer ikke hit engang før krasjen
print(hello world) # Syntaksfeil!
print("Programmet er ferdig")

# Gir output:
#
#   File "foo.py", line 2
#     print(hello world)
#           ^^^^^^^^^^^
# SyntaxError: invalid syntax. Perhaps you forgot a comma?

Kjøretidsfeil (krasj) skjer når programmet vårt slutter å kjøre midtveis i programmet fordi man forsøker å utføre en ulovlig operasjon, for eksempel ved å referere til et variabelnavn som ikke er definert eller å dele på 0. Kjøretidsfeil kan være vanskeligere å finne enn syntaksfeil, fordi feilmeldingen ikke alltid forteller oss nøyaktig hvor i programmet selve feilen er. Eksempler på kjøretidsfeil:

print("Programmet starter her")
hallo = 42 # Her er feilen (skrivefeil i variabelnavn)
world = 3.14
print(hello, world) # Her krasjer programmet
print("Programmet er ferdig") # Vi kommer ikke hit

# Gir output:
#
# Programmet starter her
# Traceback (most recent call last):
#   File "foo.py", line 4, in <module>
#     print(hello, world)
#           ^^^^^
# NameError: name 'hello' is not defined.
print("Programmet starter her") # Denne linjen utføres
print("42" + 3) # Krasj! (å legge sammen en streng og et tall er umulig)
print("Programmet er ferdig") # Vi kommer ikke hit

# Gir output:
#   TypeError: can only concatenate str (not "int") to str
print(1/0) # Krasj! (å dele på 0 er umulig)

# Gir output:
#   ZeroDivisionError: integer division or modulo by zero

Logiske feil er den kjipeste formen for feil, fordi den er så vanskelig å oppdage. I verste fall oppdages ikke den logiske feilen før det er alt for sent.

x = 2
y = 3
z = x + y
print(f"{x} + {z} = {y}") # Logisk feil, vi har byttet z og y

# Gir output:
#   2 + 5 = 3