Övning 5 – Extra utmaning: Generisk stack
Mål: Tillämpa generics för att skapa en datastruktur.
Uppgift:
- Skapa en generisk klass
Stacksom kan lagra valfri typ. - Lägg till metoder:
push(item),pop(),peek()ochis_empty(). - Testa med strängar och sedan med heltal.
Till denna uppgift kan det vara bra att kolla på listor från programmering 1 igen, kommandon för att ta bort eller lägga till saker i en list.
För att komma igång kan ni börja så här, metoderna push och pop är tillagda:
from typing import Generic, TypeVar, List
T = TypeVar('T') # T kan vara vilken typ som helst (t.ex. int, str)
class Stack(Generic[T]):
def __init__(self):
self.items: List[T] = [] # Intern lista som lagrar stackens innehåll
def push(self, item: T) -> None:
# Lägger ett objekt överst på stacken.
self.items.append(item)
def pop(self) -> T:
# Tar bort och returnerar det översta objektet.
if not self.is_empty():
return self.items.pop()
raise IndexError("Pop från tom stack")raise IndexError – vad är det?
I Python används raise för att medvetet slänga ett fel (eng. raise an exception) om något går fel i din kod.
I vårt exempel används det för att tala om att man försöker ta bort eller titta på ett värde i en tom stack – något som inte är tillåtet:
Detta gör att programmet kraschar med ett tydligt felmeddelande, så man vet vad som gick fel.
Bra att veta:
IndexErrorär ett inbyggt Python-fel som normalt används för fel i listindex.- Du kan använda egna meddelanden för att göra felet mer informativt.
- Vi kastar felet själva eftersom vi inte vill att
pop()returnerar något konstigt (somNone) om stacken är tom.