Aufgaben ergänzt inklusive Hausaufgabe

This commit is contained in:
Amalia Sucipto committed 2026-11-12 15:28:58 +01:00
1 parent 57f043f977
commit 3a0ecb91a3
6 files changed
+108

No files matched your search

+24
View File
@@ -0,0 +1,24 @@
"""Erweitern Sie die Klasse Squares zu einem Iterator mit __iter__ und __next__. Prüfen Sie, dass
list(Squares(4)) die Liste [1, 4, 9, 16] ergibt. Was passiert, wenn Sie denselben Iterator ein zweites Mal
durchlaufen?"""
class Squares:
def __init__(self, n):
self.iter = 1
self.n = n
def __next__(self):
if self.iter > self.n:
raise StopIteration
square = self.iter**2
self.iter += 1
return square
def __iter__(self):
return self
squares = Squares(4)
print(list(squares))
print(list(squares))
View File
Whitespace-only changes.
View File
Whitespace-only changes.
+42
View File
@@ -0,0 +1,42 @@
"""Sophia hat unendlich viele Münzen der Werte 1, 2 und 5 (Yay!). Wie viele Möglichkeiten gibt es, einen bestimmten
Betrag n zu bilden? Sophia hat sich folgende rekursive Funktion überlegt:
def coins(n):
if n == 0:
return 1
if n < 0:
return 0
return coins(n-1) + coins(n-2) + coins(n-5)
Hm, ist die Lösung von Sophia richtig? Erklären Sie! Messen Sie die Laufzeit der Funktion mit unserem @timingDecorator für verschiedene n.
Auch hier hilft Memoization, um die Laufzeit zu verbessern. Warum? Überprüfen Sie das."""
from functools import cache
from laufzeitmessung import timing
def coins(n):
if n == 0:
return 1
if n < 0:
return 0
return coins(n - 1) + coins(n - 2) + coins(n - 5)
@cache
def coins_cached(n):
if n == 0:
return 1
if n < 0:
return 0
return (coins_cached(n-1) + coins_cached(n-2) + coins_cached(n-5))
@timing
def measure_normal(n):
return coins(n)
@timing
def measure_cached(n):
coins_cached.cache_clear()
return coins_cached(n)
print("Ohne Memoization: ")
print(measure_normal(20))
print("Mit Memoization: ")
print(measure_cached(20))
+21
View File
@@ -0,0 +1,21 @@
"""Wir schreiben einen Decorator @timing, der die Laufzeit einer beliebigen Funktion misst. Wir verwenden *args
und **kwargs, damit der Decorator universell ist.
Hinweis:
Aus dem Standard-Modul time ist hier perf_counter hilfreich:
import time
start = time.perf_counter()
…
print(f"Dauer: {time.perf_counter() - start:.4f}s")"""
import time
def timing(f):
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = f(*args, **kwargs)
end = time.perf_counter()
print(f"Dauer: {time.perf_counter() - start:.4f}s")
return result
return wrapper
+21
View File
@@ -0,0 +1,21 @@
def run_once(f):
already_run = False
def wrapper(*args, **kwargs):
nonlocal already_run
if not already_run:
already_run = True
f(*args, **kwargs)
pass
return wrapper
@run_once
def begruessung(name):
print(f"Hallo {name}!")
begruessung("Sophia")
begruessung("Max")
begruessung("Lisa")