Aufgaben ergänzt inklusive Hausaufgabe
This commit is contained in:
1 parent
57f043f977
commit
3a0ecb91a3
6 files changed
+108
No files matched your search
@@ -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))
|
||||
Whitespace-only changes.
Whitespace-only changes.
@@ -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))
|
||||
@@ -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
@@ -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")
|
||||
|
||||
Reference in new issue
Block a user