You are on page 1of 84

Hva er algoritmer?

Hva er programmering?
programmtekst
Språk
class HelloWorld
Java: {
public static void main(String args[])
{
System.out.println("Hello, World");
}
}

Piet:

brainf***: ++++++++++[>+++++++>++++++++++>+++<<<-]>++.>+.+++++++
..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.

Python: print("Hello, World")

https://en.wikipedia.org/wiki/Esoteric_programming_language
Programmering

• Verktøy: editor, filhandtering, kjøring

• Språk: regler, strukturer

• Design: omsetning av problemstilling; gode/dårlige løsninger

• Biblioteker man kan bruke


Hvorfor Python?

• enkel syntaks, lett å lære

• raskt fremskritt fra skisse til brukbart program

• enkelt å visualisere data

• mest brukt språket i forskning i mange ulike felt

• stort utvalg av nyttige biblioteker


Setning
(Statement)

a = 7 - 5

Variabel Uttrykk (Expression)



(navn kan velges fritt) beregnes først

Expression / Uttryk Value / Verdi

tilordning
 12 12

(assignment) 3.56 3.56

“Hei” “Hei”

13.2 + 17.2 - 2.4 28.0

5**3 - 5**2 100

11 % 3 2

“ABC” + “xyz” “ABCxyz”

Det finnes andre setninger enn


tilordninger: 

if-setninger, for-løkker, funksjoner, ...
print / input / len
Viktig: gode variabelnavn

length = 5.0
width = 2.0
height = 1.2
volume = length * width * height

a = 5.0
b = 2.0
c = 1.2
d = a * b * c

bird = 5.0
yellow = 2.0
water = 1.2
duck = yellow * water * bird
Betingelser / Conditionals
if elif else
n = input("A number: ")
n = int(n)

if n > 100:
print('Yay!')
print('You know big numbers')

print('Bye bye')

A number: 16435
A number: 7 Yay!
Bye bye You know big numbers
Bye bye
Betingelser / Conditionals
if elif else
alle uttryk som har
bool verdi (True/False)
kan stå her

if True / False
:
4 kun hvis True
4 kun hvis True
4 kun hvis True
resten av programmet
resten av programmet
if True / False
:
4 kun hvis True
4 kun hvis True
4 kun hvis True
else:
4 kun hvis False
4 kun hvis False
4 kun hvis False
resten av programmet
resten av programmet
if True / False
:
4 kun hvis True
n = input("A number: ")
n = int(n)
4
if
kun
n > 100:
hvis True
4 kun hvis
print('Yay!') True
print('You know big numbers')
else:else:
print("That’s quite small!")

4 kun hvis False


print('Bye bye')

4 kun hvis False


4 kun hvis False
A number: 7
That’s quite small!
restenBye
avbye
programmet
resten av programmet
if True / False
1 :
4 kun hvis True1
4 kun hvis True1
elif True / False
2
:
4 kun hvis False1 True2
elif True / False
3
:
4 kun hvis False1,2 True3
else:
4 kun hvis alle False
tekst = 'Det var en gang...'

tekst = 'Det var en gang...'


if 'a' in tekst:
print('Aaaah!')
if 'a' in tekst:
elif ' ' in tekst:
print('Aaaah!')
print('Space')
if ' ' in tekst:
elif 'z' in tekst:
print('Space')
print('Zzz Zzz')
if 'z' in tekst:
elif '.' in tekst:
print('Zzz Zzz')
print('Dots...')
if '.' in tekst:
print('Dots...')
Aaaah!
Aaaah!
Space
Dots...
Løkker / Loops — while
s = 2 i = 0
tekst = 'Hei'
while s < 1000:
print(s) while i < 3:
s = 2 * s print(tekst)
i = i+1
2
4 Hei
8 Hei
16 Hei
32
64
128
256
512
Løkker / Loops — while

alle uttryk som har


bool verdi (True/False)
kan stå her

while True / False


:
4 så lenge True
4 så lenge True
4 så lenge True
resten av programmet
resten av programmet
Løkker / Loops — for
for x in "hei":
print(x)
print(f'*{x}*')
print('---')

h
*h*
---
e
*e*
---
i
*i*
---
Løkker / Loops — for

range(4)


for variable
in "xyzq"
[ A, B, C, D ] :
4 for hvert element
4 4x for hvert element
4 for hvert element
resten av programmet
resten av programmet
Funksjoner / functions
def doublesum(x,y,z):
Funksjonsdefinisjon
return 2*(x+y+z)

abc = doublesum(5,7,1) Funksjonskall


print(abc)

xyz = doublesum(3,2,1) Funksjonskall


print(xyz)

26
12
def ( ):
input
navn
A, B, C, D

4 gjør noe
4 gjør noe
4
return resultat

resten av programmet
x = navn (3,4,5,6)
def ( ):
input
navn
A, B, C, D

4 gjør noe
4 gjør noe
4
return resultat

resten av programmet
x = navn (3,4,5,6)
resultat
Processor,
Program
Memory

Terminal,
 Storage, files


input/output

Physical connection Communication flow


Virtual terminal Program Program

Operating system

Processor,
Memory

Terminal,
 Storage, files


input/output
Source code
Python source
C
om
pi
le
r

Hello program Python interpreter

Operating system

Processor,
Memory

Terminal,
 Storage, files


input/output
x = "Hello"
score = 10

if 'e' in x:
score = score + 1
-33
if len(x) == 5:
score = -3 * score

print(score)
a = 5
b = 7
while a < b: 12
c = a + b
print(c)
8
b += 2 17
a += 3
print(a)
11
Funksjoner / functions
Expression / Uttryk Value / Verdi

len("Hei") 3

math.sqrt(2) 1.4142

abs(-3.2) 3.2

max(3,7) 7

float("55") 55.0

resultat /

navn argument /

verdi
parameter
Funksjoner / functions
def doublesum(x,y,z):
Funksjonsdefinisjon
return 2*(x+y+z)

abc = doublesum(5,7,1) Funksjonskall


print(abc)

xyz = doublesum(3,2,1) Funksjonskall


print(xyz)

26
12
programmflyt
def ( ):
input
navn
A, B, C, D

4 gjør noe
4 gjør noe
4
return resultat

resten av programmet
x = navn (3,4,5,6)
def
def ( ):
input
navn
A, B, C, D

4 gjør noe
4 gjør noe
4
return resultat

resten av programmet
x = navn (3,4,5,6)
resultat
Scope
def doublesum(x,y,z):
tmp = x+y+z lokale variabler, kun i funksjonen
return 2*tmp

x = 5
globale variabler
tmp = 7

ds = doublesum(1,1,1)
def doublesum(x,y,z):
print(x,tmp,ds) global tmp
tmp = x+y+z
return 2*tmp
5 7 6
x = 5
tmp = 7

ds = doublesum(1,1,1)

print(x,tmp,ds)

5 3 6
def doublesum(x,y,z):
sum = x+y+z
return 2*sum

abc = doublesum(5,7,1) foo = doublesum('ab','xz','d')


print(abc) print(foo)
26 abxzdabxzd

(VScode demo: program flow, nested calls)


Funksjoner / functions
Expression / Uttryk Value / Verdi

len("Hei") 3

math.sqrt(2) 1.4142

abs(-3.2) 3.2

max(3,7) 7

float("55") 55.0

print("hei") None (men skriver noe)

turtle.left(20) None (men snur turtle)


a = 5
b = 7
while a < b: 12
c = a + b
print(c)
8
b += 2 17
a += 3
print(a)
11
def add(a,b)
a += b
return a

def subtract(a,b):
a += b
return a 17
15
y = add(12,3)
x = subtract(10,7)
print(x)
print(y)
list / [… , … , … , …]
x = [ 5, 7, 3, 8 ]
y = [ 1, 3.141, 'hei', True ]
Expression / Uttryk Value / Verdi
[ ] []
[1] [1]
x [5,7,3,8]
x.append(99)
x [5,7,3,8,99]
[1,2] + [5,6] [1,2,5,6]
len(y) 4
y[2] 'hei'
y[1:3] [3.141,'hei']
list-funksjoner
• https://docs.python.org/3/tutorial/
datastructures.html#more-on-lists

list.append(x) list.index(x)
list.extend([3,4,5]) list.count(x)
list.insert(i,x) list.sort()
list.remove(x) list.reverse()
list.pop() list.copy()
list.clear()
nyttige string-funksjoner
• str.split(sep) -> liste av ord, kan angi sep, f.eks. '\n' ','

a = """Many
different
lines 'Many\ndifferent\nlines'
"""
b = a.split() ['Many', 'different', 'lines']

• 'tekst'.join(liste) -> bruker tekst som forbindelse

a = ['en', 'to', 'tre']


b = '=='.join(a) 'en==to==tre'
c = ''.join(a) 'entotre'
"""en
d = '\n'.join(a) 'en\nto\ntre' to
tre"""
dict: dictionary { a:x, b:y, c:z }
• https://docs.python.org/3.7/tutorial/
datastructures.html#dictionaries

• Key - Value pairs

tlf = {
'Armin' : 3542,
'Mikasa' : 1234,
'Eren' : 5125,
}

tlf['Eren'] 5125

tlf['Levi'] = 4545

'Eren' in tlf True

tlf.keys() dict_keys(['Armin', 'Mikasa', 'Eren', 'Levi'])


tlf.values() dict_values([3542, 1234, 5125, 4545])

tlf.items()
dict_items([('Armin', 3542), ('Mikasa', 1234), ('Eren',
5125), ('Levi', 4545)])
dict: dictionary { a:x, b:y, c:z }
• bruk i løkker: dict_items([('Armin', 3542), ('Mikasa', 1234),
('Eren', 5125), ('Levi', 4545)])

for navn, num in tlf.items():


print(navn,’—-',num)

Armin —- 3542
Mikasa —- 1234
Eren —- 5125
Levi —- 4545
File I/O
• open(filename, mode) mode: read, write, append

with open(“some.txt”,”r”) as f:
all_in_one = f.read()

with open(“another.txt”,”r”) as f:
list_of_lines = f.readlines()

with open(“third.txt”,”r”) as f:
for line in f:
one_line = line
File I/O
• open(filename, mode) mode: read, write, append

out = "Hello, how are you?"


with open(“hello.txt”,”w”) as f:
f.write(out)
f.write('\n')

in = ‘inputdata.txt’
out = ‘reverse.txt’

with open(in,’r’) as fi, open(out,’w’) as fo:


for line in fi:
outline = line[::-1] # reverse
fo.write(outline)
Løsningseksempel
ord i alice.txt
• Les inn alice.txt og 

tell hvor mange ganger hvert ord finnes i teksten

• Begynn med et tomt dict: antall={ }

with open('alice.txt') as f:
for line in f:
line = line.split()

Løsningseksempel
bokstaver i alice.txt
• Les inn alice.txt og 

tell hvor mange ganger hver bokstav finnes i teksten

• Bruk et dict: f.eks. antall={ 'a':0, 'b':0, …}

with open('alice.txt') as f:
for line in f:
for bokstav in line:

import og modules
# helpers.py

def spam(x):
s = 'spam'
return f'{s}, {s}, {s}, {x} and {s}.'

N_A = 6.02214e+23

# work1.py

import helpers # work2.py

a = helpers.N_A import helpers as h


b = helpers.spam('eggs’)
a = h.N_A
b = h.spam('eggs’)

# work3.py
# work4.py
from helpers import N_A, spam
from helpers import N_A as L, spam as foo
a = N_A
b = spam('eggs’) a = L
b = foo('eggs’)
import og modules
# helpers.py

def spam(x):
s = 'spam'
return f'{s}, {s}, {s}, {x} and {s}.'

N_A = 6.02214e+23

(lokalt) helpers math <- namespace


import helpers
import math a N_A sin()
b spam() pi
a = helpers.N_A c cos()
b = helpers.spam('eggs’) d sqrt()
c = 27 e …
d = math.sin(math.pi) …
e = a + c + d …

(lokalt)
from helpers import N_A N_A
from math import sin,pi sin
ikke
pi
a = N_A
a
tilgjengelig
c = 27
d = sin(pi) c
e = a + c + d d
e
Standard Library
Stor utvalg:
Regular expressions, difflib, textwrap

datetime, calendar

synchronized queue
copy

math, decimal, fractions, random

os.path, stat, tempfile, shutil

pickle, sqlite3, zlib, bz2, tarfile, csv

Markup, internet protocols, multimedia, debugging, ...


https://docs.python.org/3/library
math
import math

! 3oor, ceil

! exp, log, log2, log10

! pow, sqrt

! sin, cos, tan

! pi, e
fractions
from fractions import Fraction
Fraction(16, -10)
Fraction(123)
Fraction()
Fraction('3/7')
Fraction(' -3/7 ')
Fraction('1.414213 \t\n')
Fraction('-.125')
Fraction('7e-6')
x = Fraction(3,4) + Fraction(1,6)
Fraction(2.25)
x
Fraction(1.1)
x.numerator
x.denominator

from math import pi


Fraction(pi)
Fraction(pi).limit_denominator(100)
Fraction(pi).limit_denominator(50)
datetime
from datetime import date
today = date.today()
my_birthday = date(today.year, 6, 24)

if my_birthday < today:


my_birthday = my_birthday.replace(year=today.year + 1)

time_to_birthday = abs(my_birthday - today)


print(time_to_birthday)

from datetime import datetime


now = datetime.now()
exam = datetime(2020, 5, 28, 9, 0, 0)
print(exam - now)

calendar
import calendar
calendar.prmonth(2020,02)
random
import random
# random.seed(123456) # reproduserbare resultater

random.randint(1,6) # 1 <= N <= 6

random.choice('abcdef')
random.choice([11, 7.2, 'foo'])
random.choices('abcdefghi', k=100)

random.sample('abcdefghi', k=3)

random.random() # [0.0, 1.0)


random.uniform(12.0, 20.0) # 12.0 <= N <= 20.0

random.gauss(mu=40.0,sigma=12.0)
matplotlib
matplotlib
https://matplotlib.org/

! eksternt bibliotek, ikke en del av standard-Python

! installer med f.eks.


$ python -m pip install --user matplotlib

! eller kjør install.py fra mitt.uib i VSCode

import matplotlib.pyplot as plt


matplotlib bar chart
import matplotlib.pyplot as plt

plt.bar([3, 7, 9], [10, 20, 17])


plt.show()
matplotlib.pyplot
https://matplotlib.org/tutorials/introductory/pyplot.html

import matplotlib.pyplot as plt

! bar()
! plot()
! title(), xlabel(), ylabel()
! label=… plt.legend()
! axis(), xlim(), ylim()
! subplot()
! show(), saveMg()
matplotlib gallery
https://matplotlib.org/gallery/index.html
input / print
True / False

betingelser: if

løkker: for, while

datastrukturer: list, ...


For å løse et problem:

finne mindre steg, der vi kan bruke strukturene

finne enklere spørsmål som allerede har en løsning

Standard-algoritmer for bla.


sortering, grafer, søk, ...

Ulike datastrukturer:
list, set, numpy-array, ...
xs = [2, 7,5,1,4,3,6,8]

while not is_sorted(xs):


random.shuffle(xs)
O(N N!)

Scaling behaviour with size N of problem set:


O(1) - constant time independent of N
O(N) - linear with N
O(N2) - quadratic in N
Insertion sort
O(N2)

2 7 5 1 4 3 6 8

2 5 7 1 4 3 6 8

1 2 5 7 4 3 6 8

1 2 4 5 7 3 6 8

1 2 3 4 5 7 6 8

1 2 3 4 5 6 7 8
Merge Sort
2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8
Merge Sort
2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

merge

2 7 5 1 4 3 6 8
Merge Sort
2 7 5 1 4 3 6 8

2 7 5 1 4 3 6 8

2 7 1 5 4 3 6 8

merge merge

2 7 5 1 4 3 6 8
Merge Sort
2 7 5 1 4 3 6 8

1 2 5 7 4 3 6 8

merge

2 7 1 5 4 3 6 8

merge merge

2 7 5 1 4 3 6 8
Merge Sort
2 7 5 1 4 3 6 8

1 2 5 7 3 4 6 8

merge merge

2 7 1 5 3 4 6 8

merge merge merge merge

2 7 5 1 4 3 6 8
Merge Sort O(N log N)
1 2 3 4 5 6 7 8

merge

1 2 5 7 3 4 6 8

merge merge

2 7 1 5 3 4 6 8

merge merge merge merge

2 7 5 1 4 3 6 8

15 Sorting Algorithms in 6 Minutes


http://youtu.be/kPRA0W1kECg
What are we optimizing?
Time
Memory
Disk
Electricity
Compile time
Ease of use
Ease of deployment
Ease of development
L1 cache reference ......................... 0.5 ns

Branch mispredict ............................ 5 ns

L2 cache reference ........................... 7 ns

Mutex lock/unlock ........................... 25 ns

Main memory reference ...................... 100 ns

SSD random read ........................ 150,000 ns = 150 µs

Read 1 MB sequentially from memory ..... 250,000 ns = 250 µs

Read 1 MB sequentially from SSD ..... 1,000,000 ns = 1 ms

Disk seek ........................... 10,000,000 ns = 10 ms

Read 1 MB sequentially from disk .... 20,000,000 ns = 20 ms

Send packet EU->US->EU .... 150,000,000 ns = 150 ms


L1 cache reference 0.5 s

Branch mispredict 5s

L2 cache reference 7s

Mutex lock/unlock 25 s

Main memory reference 100 s

SSD random read 1.7 days

Read 1 MB sequentially from memory 2.9 days

Read 1 MB sequentially from SSD 11.6 days

Disk seek 16.5 weeks

Read 1 MB sequentially from disk 7.8 months

Send packet EU->US->EU 4.8 years


Python profiling options
from time import time
time start = time()
somefunc(27)
end = time()

timeit python -m timeit -s ‘import myfile as m;


x=27’ ‘m.somefunc(x)’

import cProfile pyprof2calltree


cProfile cProfile.run(somefunc(27)) qcachegrind

All are in the standard library


bool: True / False
> < >= <= == in

Expression / Uttryk Value / Verdi


True True
False False
4 == 5 False
66 == 66 True
45 > 33 True
2.9 < 2.7 False
"Abcd" < "Abcz" True
"ask" in "oppvask" True
0.1 + 0.2 == 0.3 False !!!
https://www.exploringbinary.com/why-0-point-1-does-not-exist-in- oating-point/
fl
bool: True / False
and or not

Expression / Uttryk Value / Verdi


not True False
True or False True
True and False False
5 > 8 or 12 < 25 True
4 < 8 and 7 == 9 False
bool("abcdef") True
bool(35) True
bool("") False
bool(0) False
hva er et bedre navn til funksjonen?

def foobar(navn):
x = f"Hei, {navn}!"
return x

hva er et bedre navn til funksjonen?


def foo(n):
for i in range(1, n+1):
print('*' * i)
text = "Hello"
for n in text:
print(3 * n) hvor ofte kjører løkken?

x = 1
while x < 100: hvor ofte kjører løkken?
print(x)
x = 2 * x hva printes i terminalen?
from datetime import date
today = date.today()
my_birthday = date(today.year, 6, 24)

if my_birthday < today:


my_birthday = my_birthday.replace(year=today.year + 1)

time_to_birthday = abs(my_birthday - today)


print(time_to_birthday)

Tilpass programmet slik at brukeren blir spurt om


bursdagens dato med input. Så skal my_birthday bruke den

You might also like