Göm menyn

Seminarium 3 - En sak i taget

Kapitel som ska ha lästs

Seminariet kommer att inledas med diskussion av några av koncepten från studiematerialet.

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: Programmeringspraxis

Instruktioner: Programmeringspraxis

  • När kan en funktion anses vara korrekt?
  • Varför är det viktigt att kod är läsbar?
  • Vad innebär att kod är självdokumenterande?
  • Hur ska blankrader användas? Hur många?
  • Hur ska kommentarer användas? Vad är deras syfte?
  • Vad är docstrings och vad används de till?
  • Varför ska rader max ha 79 tecken?
  • Hur bör mellanrum användas i matematiska beräkningar?
  • Varför är det viktigt med testbarhet och hur uppnår man testbarhet?

Uppgift: Namngivning

Föreslå namn på följande

  1. En variabel som används för att räkna element i en lista
  2. En klass som fungerar som en lista men har bestämd längd
  3. Ett undantag som kastas när en avlägsen server inte svarar
  4. En pythonfil innehållande ett antal hjälpfunktioner (modul) för beräkningar med imaginära tal .
  5. Bredden på ett fönster som ej kan ändras
  6. En funktion som returnerar huruvida en användare finns i en databas

Uppgift: Dubbelrekursion

Givet är en funktion find_in_list som rekursivt letar efter ett element i en lista och returnerar True om det finns.

def find_in_list(seq, needle):
    if not seq:
        return False
    elif seq[0] == needle:
        return True
    else:
        return find_in_list(seq[1:], needle)

Vi vill nu kunna köra funktionen på listor av listor och hitta om elementet finns i någon av listorna. Skriv om funktionen så att den gör det.

Uppgift: Familjeträd

Ett släktträd som inte inkluderar ingifta medlemar kan beskrivas som nästlade listor av tupler där första elementet är namnet på en person, och andra elementet är en lista på personens barn och deras träd

Här följer ett exempel:

[
    ("Carl Gustaf", [
        ("Victoria", [
            ("Estelle", []),
            ("Oscar", [])
        ]),
        ("Carl Philip", [
            ("Alexander", [])
        ]),
        ("Madeleine", [
            ("Leonore", []),
            ("Nicolas", [])
        ])
    ]),
    ("Birgitta", [])
]

Nedan följer en funktion som givet en person returnerar den personens förfäder. Om personen inte finns returneras None

def ancestors_of(tree, person):
    """
    Tries to return a list of `person`s ancenstors. If person is not in the tree,
    None is returned
    """
    if tree == []:
        # We reached an empty tree, this branch does not contain the couple
        return None
    elif tree[0][0] == person:
        # We found the couple, start constructing a list
        return []
    else:
        # Traverse the children of this node to check if they contain the couple
        rest_result = ancestors_of(tree[0][1], person)

        if isinstance(rest_result, list):
            # The next iteration found the person, append the current person to the list
            rest_result.append(tree[0][0])
            return rest_result
        else:
            # We know the current node or its children do not contain the person,
            # look through its siblings
            return ancestors_of(tree[1:], person)

Vilken ordning skulle elementen sökas igenom om funktionen körs med exempelträdet ovan och med en person som inte är med i trädet?


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