Göm menyn

Seminarium 5 - En sak i taget

Kapitel som ska ha lästs

Denna sida visar en del av det som kommer att diskuteras på seminariet. Ofta tar handledarna också upp andra uppgifter som inte behöver något specifikt studentmaterial och då syns dessa uppgifter inte på sidan.

Uppgift: Paradigm

Besvara om följande påståenden är sanna eller falska

  1. Dynamisk typning är ett paradigm som Python stödjer.
  2. Pythonkod måste kompileras för att köras.
  3. Om man programmerar funktionellt kan man ej använda listor då de är objekt.
  4. Python stödjer objektorienterad programmering.
  5. I Python kan man ej programmera imperativt.
  6. Om man programmerar funktionellt får funktioner inte ha sidoeffekter.
  7. Om en funktionellt programmerad funktion tar emot en lista får denna inte ändras, dock kan kopior av listan ändras.
  8. Funktionen print() kan användas i funktionell programmering.
  9. Funktionen range() kan användas i funktionell programmering.
  10. Funktionell programmering är generellt snabbare än annan programmering.
  11. Inom funktionell programmering används ofta rekursion istället för for-loopar.
  12. När man programmerar funktionellt måste all kod vara strikt funktionell.

Uppgift: Högre ordningens funktioner, lambdauttryck och listbyggare

Vad printar följande kod?

print((lambda x: x + 2)(10))     #1

print((lambda x, y: x * y)(2 + 3, 4 * 5))   #2

print((lambda x: x + 1)((lambda y: y + 2)(3)))  #3

seq = [[17, 4, 8], [9, 14, 2, 7], [33, 14]]
print([sorted(x)[1] for x in seq])    #4

seq = ['apelsin', 'banan', 'citron']
print([x.replace('a', '*') for x in seq if 'a' in x])   #5

a = [i + 2 for i in range(10) if i % 2 == 0]
b = list(map(lambda i: i + 2, filter(lambda i: i % 2 == 0, list(range(10)))))

print(a == b)   #6

print(list(filter(lambda x: x % 3 == 0, list(range(0, 20, 2))))[2])     #7

print(''.join([chr(ord(c) - 1) for c in "Helloworld"])) #8

def pal_num(n):
    s = str(n)
    return s == s[::-1]

print([i for i in range(100, 130) if pal_num(i)])   #9

def fib_maker():
    a, b = 0, 1
    def next_fib():
        nonlocal a, b
        a, b = b, a + b
        return b - a
    return next_fib

fib = fib_maker()
print(list(filter(lambda x: x % 2 == 0, [fib() for i in range(7)])))    #10

Uppgift 1: Iterator och index

def func1(seq):
    res = []
    for elem in seq:
        if elem % 2 == 0:
            res.append(elem)
    return res

def func2(seq):
    res = []
    for i in range(len(seq)):
        if seq[i] % 2 == 0:
            res.append(seq[i])
    return res

def func3(seq):
    res = []
    i = 0
    while i < len(seq):
        if seq[i] % 2 == 0:
            res.append(seq[i])
        i += 1
    return res

Givet är tre iterativa funktioner som returnerar samma sak men itererar på olika sätt.

  1. Vad gör funktionerna?
  2. Vad är skillnaden mellan funktionerna? Namnge de metoder funktionerna använder.
  3. Vilken funktion tycker du är lättast att läsa? Vilken borde användas för detta syfte?
  4. Vid vilka tillfällen ska de olika sätten att iterera användas?

Uppgift 2: Iterator och index

Givet ett beteende, vilken iterativ metod bör användas?

  1. Hitta den första förekomsten av ett element i en sekvens och lagra dess index i en variabel.
  2. Returnera antal förekomster av ett element i en sekvens.
  3. Returnera det minsta elementet i en lista.
  4. Så länge ändringar görs ska sekvensen itereras över upprepade gånger. Varje iteration jämför varje element med sin efterföljare. Om efterföljaren är lägre byter de två elementen plats.

Sidansvarig: Peter Dalenius
Senast uppdaterad: 2021-12-03