Fingerübungen: Funktionen, Listen, Dicts#
zugehöriges Notebook: e_r2_funktionsparameter
vozeichenbehaftete Quadratzahlen (vzq)#
Gegeben:
Eine Liste von Zahlen
z.B.
l = [ 1, -2, 5, 3, -1]
Gesucht:
Eine Liste dieser Zahlen quadriert
Nebenbedingung: Aus irgendeinem Grund wollen wir die Information über das ursprüngliche Vorzeichen nicht verlieren: Falls unsere Zahl negativ ist, soll die quadrierte Zahl negativ sein. Wir wollen das eine vozeichenbehaftete Quadratzahl (vzq) nennen.
z.B.
l_quadriert = [ 1, -4, 25, 9, -1]
def vzq_list(l):
... #
l = [ 1, -2, 5, 3, -1]
assert vzq_list(l) == [1, -4, 25, 9, -1]
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
Cell In[2], line 2
1 l = [ 1, -2, 5, 3, -1]
----> 2 assert vzq_list(l) == [1, -4, 25, 9, -1]
AssertionError:
Veränderung: Ergebnis in einem Dict#
Aufgabenstellung wie oben, Veränderung: Wir wollen keine Liste, sondern ein Dict zurückgeben. Die Keys seien die ursprünglichen Werte.
def vzq_dict(l):
... #
l = [ 1, -2, 5, 3, -1]
assert vzq_dict(l) == {1: 1, -2: -4, 5: 25, 3: 9, -1: -1}
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
Cell In[4], line 2
1 l = [ 1, -2, 5, 3, -1]
----> 2 assert vzq_dict(l) == {1: 1, -2: -4, 5: 25, 3: 9, -1: -1}
AssertionError:
Veränderung: Prüfe, ob ein dict ein vzq-Dict ist#
Gegeben:
ein Dict
z.B.
d = {1: 1, -2: -4, 5: 25}
Gesucht:
eine Funktion, die überprüft, ob unser Dict ein vzq-Dict ist.
Rückgabewert:
True
oderFalse
def vzq_test(d):
ist_vzq = True
for k, v in d.items():
ist_vzq = ist_vzq and v == k * abs(k)
return ist_vzq
d = {1: 1, -2: -4, 5: 25}
assert vzq_test(d) == True
d2 = {1: 1, -2: 4, 5: 25}
assert vzq_test(d2) == False
Deltas berechnen#
Gegeben:
eine Liste von Zahlen
z.B.
l = [ 1, 2, 5, 3, 1]
Gesucht:
eine Liste
l_delta
, in der die Unterschiede zwischen je zwei Werten der Listel
berechnet sind.
Die Funktion deltas(x)
soll die Deltas der Liste x
in Form einer neuen Liste zurückgeben. (Klar: Diese zurückgegebe Liste der Deltas ist um ein Element kürzer als die Ursprungsliste).
So könnten Lösungen aussehen (bitte verstehen, was da passiert!):
def deltas(x):
y = []
links = x[0]
for rechts in x[1:]:
y.append(rechts-links)
links = rechts
return y
def deltas2(x):
y = []
for i in range(1,len(x)):
y.append( x[i] - x[i-1] )
return y
Aufgabe: Schreiben Sie eine Funktion deltas3(x)
, in der die Rückgabe-Liste als “Einzeiler”, hier: mittels List comprehension berechnet wird.
def deltas3(x):
... #
l = [ 1, 2, 5, 3, 1]
deltas(l)
[1, 3, -2, -2]
assert deltas2(l) == deltas(l)
assert deltas3(l) == deltas(l)
---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
Cell In[12], line 2
1 assert deltas2(l) == deltas(l)
----> 2 assert deltas3(l) == deltas(l)
AssertionError:
Veränderung: Deltas inplace#
Wir nehmen an,
dass unsere Liste seeehr lang ist
und wir ausschließlich an den Deltas interessiert sind.
Also wollen wir keine Kopie der Liste erzeugen. Statt dessen sollen die Werte der Liste inplace durch die Deltas ersetzt werden. (Das erste Element lassen wir unverändert, wir interpretieren es als ein Delta zum Startwert 0
.)
Lösungsidee: Wenn wir “hinten” in der Liste beginnen, können wir vom letzten Element der Liste das vorletzte, dann vom vorletzten das vorvorletzte Element etc. abziehen.
def deltas_inplace(x):
... #
... #
Cell In[13], line 3
... #
^
IndentationError: unexpected indent
l = [ 1, 2, 5, 3, 1]
l2 = l
deltas_inplace(l2)
l
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
Cell In[15], line 1
----> 1 deltas_inplace(l2)
2 l
NameError: name 'deltas_inplace' is not defined