Uke 7 — list / tuple / functions¶
Denne uken avslutter vi med lister, tuple og funksjoner. Les https://automatetheboringstuff.com/2e/chapter4/ frem til «A Short Program: Conway’s Game of Life» og avsnittet «Keyword Arguments and the print() Function» i https://automatetheboringstuff.com/2e/chapter3/
Eksempler¶
Eksempel 1¶
Her er noen eksempler på lister, tupler og strenger. De er like på mange måter, men det finnes også forskjeller mellom dem.
Last ned filen her: eksempel_1.py
, og kjør koden. Skjønner du hva
som skjer?
# sequence types: list, tuple, str
# list - mutable, can be modified
x = [2,3,5,6,7] # list type
x[2] = 999
print(x)
x = x + [3,4]
print(x)
# tuple - immutable, cannot be modified
y = (2,3,5,6,7) # tuple type
#y[2] = 999 is an error
print(y)
y = y + (3,4)
print(y)
# string - immutable, cannot be modified
z = "23567"
#z[2] = "9" is an error
print(z)
z = z + "9876"
print(z)
print('\n'*3)
#######
# Sequences can be used interchangeably in many places:
# Can use all sequences in for loops
for e in x:
print('...',e,'...')
for e in y:
print('===',e,'===')
for e in z:
print('***',e,'***')
print('\n'*3)
#######
# conversions between list - tuple - string
some_list = [
4,
5,
6,
7,
8,
]
some_tuple = (
6,7,
8,9,10,
11,12,13
)
some_str = "Hello there"
print('Convert to list')
print(list(some_list))
print(list(some_tuple))
print(list(some_str))
print('Convert to tuple')
print(tuple(some_list))
print(tuple(some_tuple))
print(tuple(some_str))
print('Convert to str')
print(str(some_list))
print(str(some_tuple))
print(str(some_str))
print('\n'*3)
# joining strings
print('Join a sequence of strings into one')
some_list = ['Hello', 'how', 'are', 'you?']
a = ' '.join(some_list)
b = '==='.join(tuple(some_list))
c = '\n'.join(some_list)
d = ' .,;,. '.join("XYZABC")
e = '\n'.join("XYZABC")
print(a)
print(b)
print(c)
print(d)
print(e)
Eksempel 2¶
Her er noen eksempler på forskjellen mellom lister, som er ’mutable’ (kan forandres), og tupler, som er ’immutable’ (kan ikke forandres).
Last ned filen her: eksempel_2.py
, og kjør koden. Skjønner du hva
som skjer? Hvorfor er b
blitt endret etter a += [999, 777]
? Hvorfor er
b
ikke blitt endret etter a += (999, 777)
?
# Lists are mutable, assignment works by reference
a = [2, 4, 8, 16]
b = a
c = a
d = a[:]
print(f'{a = }\n{b = }\n{c = }\n{d = }')
print('Change a:')
a += [999, 777]
# not the same as a = a + [999, 777] (why?)
#a = a + [999, 777]
print(f'{a = }\n{b = }\n{c = }\n{d = }')
print('Change b:')
b += [111, 222]
print(f'{a = }\n{b = }\n{c = }\n{d = }')
print('\n\n\n')
# Tuples (and str) are immutable, assignment works by copy
a = (2, 4, 8, 16)
b = a
c = a
d = a[:]
print(f'{a = }\n{b = }\n{c = }\n{d = }')
print('Change a:')
a += (999, 777)
print(f'{a = }\n{b = }\n{c = }\n{d = }')
print('Change b:')
b += (111, 222)
print(f'{a = }\n{b = }\n{c = }\n{d = }')
# try with str...
Eksempel 3¶
Her er noen eksempler på funksjoner med ’keyword arguments’.
Last ned filen her: eksempel_3.py
, og kjør koden. Skjønner du hva
som skjer?
def func(a, b, c=5, d=7, e=9):
print("abcde", a, b, c, d, e)
def func_2(x=5, y=7):
print("xy", x, y)
print("Testing function calls:")
print("func")
func(2, 3)
func(5, 7, d=9)
func(10, 12, 101, 999)
func(56, 22, e=102, c=567)
print("func_2")
func_2()
func_2(9)
func_2(x=77)
func_2(y=77)
func_2(10, 12)
func_2(x=123, y=987)
print("\n" * 3)
############################
# some builtin functions have options
print("Hello", "bye", 5, 7, sep="....")
print("Hello", "bye", 5, 7, sep="")
print("How are you", end="... ")
print("still here?")
print("This is the usual setting:", 5, 7, 9, "hi", sep=" ", end="\n")
# try other sep and end values ^^^
print("still here!")
############################
def my_sum(a, b, c, debug=False):
if debug:
print("inside my_sum:", a, b, c)
return a + b + c
x = my_sum(3, 4, 5)
print("The sum is", x)
y = my_sum(1.2, 4, 5.6, True)
print("The sum is", y)
z = my_sum("a", "bb", "ccc", debug=True)
print("The sum is", z)
Eksempel 4¶
Her er noen eksempler på ting som kan gå feil.
Last ned filen her: errors_1.py
. Før du kjør koden, se om du finner
alle feil som gjør at den ikke går å kjøre. Kjør siden koden. Fant du alle feil?
Endre koden så at den går å kjøre. Koderaden greeting_str = str(full_greeting)
er ikke feil slik at man får en error fra Python, men den gjør ikke akkurat hva vi
vil at den skal gjøre. Endre så at det blir riktig output.
a = [2, 4, 8, 9]
b = a
c = a
d = a[:]
a = a + [999, 777]
b += [111, 333]
c = c.append(55)
d.insert(len(d),77)
print(f'{a = }\n{b = }\n{c = }\n{d = }')
#############
some_list = [
4,
5
6,
7,
8,
]
# write a greeting string from a collection of letters
greeting_1 = ('H','e','l','l','o')
greeting_2 = ['t','h','e','r','e','!']
full_greeting = greeting_1 + ' ' + greeting_2
greeting_str = str(full_greeting)
print('Our result:', greeting_str)
print('Expected result:', 'Hello there!')
Spørsmål¶
Svare på spørsmål 11-16 i kapittel 4 av Automate the Boring Stuff.
Svare på spørsmål 1-4 og 7-8 i kapittel 3 i Automate the Boring Stuff.
På hvilke ulike måter er det mulig å kalle følgende funksjon?
f(x, a=0, b=1)
Oppgaver¶
Oppgave 1¶
Skriv din egen versjon av den innbygde funksjonen len
, med navnet my_len
.
Den skal returnere lengden av en liste, en tuple eller en streng, slik som len
.
Du kan ikke kalle på andre funksjoner innen my_len
.
Oppgave 2¶
Denne oppgaven er større enn en eksamensoppgave, men stilen er lik.
Skriv en funksjon som fyller ut en tekst med mellomrom slik at alle rader får samme lengd. Lengden på radene skal være et argument til funksjonen. Den justerede teksten skal returneres av funksjonen som en streng. Funksjonen skal ikke bruke print() eller input(). Her er hele spesifikasjonen:
Input: funksjonen skal ta to argument, en str (text
) og en int (line_len
).
Output: funksjonen skal returnere samme tekst som i text
men hvor alle rader har lengden line_len
.
Vilkår:
Alle rader må inneholde så mange ord som er mulig innen radlengden.
Funksjonen får bare fylle ut med mellomrom (’ ’) mellom ordene (ikke tab eller noen annen whitespace).
Mellomrommen i hver rad må være så jevnt fordelt som mulig, i.e. forskjellen mellom størst antall mellomrom og minst antall mellomrom mellom orden i en rad får ikke være mer enn 1. Men du får selv velge hvordan du vil plassere ut mellomrommen så lenge dette er oppfyllt.
Alle rader må begynne med et tegn som ikke er whitespace.
Slutten på alle rader må enten være på formen
'char\n'
eller'char'
, hvor'char'
er et tegn som ikke er whitespace, i.e. du får ikke begynne eller slutte en rad med mellomrom.Den siste raden i teksten skal ikke bli fylt ut med mellomrom. I denne raden skal det være eksakt ett mellomrom mellom alle ord.
Du kan anta at inget ord i
text
er lengre ennline_len
.
Eksempel: om input til funksjonen er følgende tekst:
Alice was beginning to get very tired of sitting by her sister on the bank, and of having nothing to do: once or twice she had peeped into the book her sister was reading, but it had no pictures or conversations in it, ’and what is the use of a book,’ thought Alice ’without pictures or conversation?’
og line_len
er 60 skal funksjonen returnere noe slikt:
Alice was beginning to get very tired of sitting by her
sister on the bank, and of having nothing to do: once or
twice she had peeped into the book her sister was reading,
but it had no pictures or conversations in it, 'and what is
the use of a book,' thought Alice 'without pictures or
conversation?'
(men du får selv velge hvordan du vil plassere mellomrommen, innen vilkåren).