Seminarium 3 - En sak i taget
Kapitel som ska ha lästs
- Programmeringspraxis
- Hur man programmerar
- Dubbelrekursion
- Datatyper (särskilt om metoder för listor och strängar)
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
- En variabel som används för att räkna element i en lista
- En klass som fungerar som en lista men har bestämd längd
- Ett undantag som kastas när en avlägsen server inte svarar
- En pythonfil innehållande ett antal hjälpfunktioner (modul) för beräkningar med imaginära tal .
- Bredden på ett fönster som ej kan ändras
- 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