Egy zenei streamingcégnél dolgozol.
Az a feladatod, hogy egy lejátszásilista-funkciót készíts a zenelejátszó alkalmazásodhoz.
Írj egy prototípust a zenelejátszó alkalmazáshoz.
A prototípusban minden dalt egyszerűen egy szám képvisel.
Egy számtartományból (a dalok azonosítói) hozz létre egy egyszeresen láncolt listát.
Egy egyszeresen láncolt listát meg tudsz fordítani, hogy a dalokat ellenkező sorrendben játszd le.
A láncolt lista az informatika egyik alapvető adatszerkezete, amelyet gyakran más adatszerkezetek megvalósításához használnak.
A láncolt lista legegyszerűbb fajtája az egyszeresen láncolt lista. Ez azt jelenti, hogy minden elem (vagy „csomópont”) tartalmaz adatot, valamint valamit, ami a listában a következő csomópontra mutat.
Ha mélyebbre szeretnél ásni a láncolt listákban, nézd meg ezt a cikket, amely szép ábrákkal magyarázza el.
Bár a stacks és a queues megvalósítható lists, collections.deque, queue.LifoQueue és multiprocessing.Queue használatával, ez a feladat egy „Last in, First Out” (LIFO) vermet vár el, amely egy saját készítésű egyszeresen láncolt listát használ:
Ezt nem szabad összekeverni a LIFO vermet dinamikus tömbbel vagy listával megvalósító változattal, amely alul list-et, queue-t vagy array-t használhat.
A dinamikus tömbön alapuló stacks-nek más a head pozíciója, más az időbonyolultsága (Big-O) és más a memóriaigénye.
Nézz meg két Stack Overflow-kérdést néhány szempont átgondolásához: Tömbalapú vs. listaalapú vermek és sorok és Különbségek a tömbalapú verem, a láncolt verem és a verem között.
A láncolt listákról, a LIFO vermekről és más absztrakt adattípusokról (ADT) Pythonban további részleteket itt találsz:
ADT-t bemutat, nem csak a láncolt listákat)A láncolt lista „kanonikus” implementációja Pythonban általában egy vagy több class-t igényel.
A class-ek jó bevezetőjéhez lásd a classes fogalmat és a hozzá tartozó ellens-alien-game feladatot, vagy a A hivatalos Python-oktatóanyag osztályokról szóló része című részt.
A feladat tesztjei a len() függvényt fogják meghívni a LinkedList-eden.
Ahhoz, hogy a len() működjön, létre kell hoznod egy __len__ speciális metódust.
A speciális vagy „dunder” metódusok Pythonbeli megvalósításáról lásd a Python-dokumentáció: Az objektumok alapvető testreszabása és a Python-dokumentáció: object.len(self) című részt.
Ahhoz, hogy a LinkedList-eden végig lehessen iterálni vagy meg lehessen fordítani, meg kell valósítanod a __iter__ speciális metódust.
A megvalósítás részleteiért lásd az iterátor implementálása egy osztályhoz című részt.
Néha a kódodban egyszerre kell testre szabnod és raise a kivételeket.
Amikor ezt teszed, mindig adj meg egy beszédes hibaüzenetet, amely jelzi, mi a hiba forrása.
Ettől olvashatóbb lesz a kódod, és a hibakeresést is jelentősen megkönnyíti.
Egyedi kivételeket új kivételosztályok létrehozásával hozhatsz létre (részletekért lásd a classes részt), amelyek általában a Exception leszármazottai.
Ha tudod, hogy a hiba forrása egy bizonyos kivétel_típus_ leszármazottja lesz, akkor választhatod azt is, hogy az Exception osztály alatti built in error types egyikéből örökölsz.
A hiba kiváltásakor ilyenkor is adj meg egy beszédes üzenetet.
Ez a feladat azt kéri, hogy hozz létre egy egyedi kivételt, amelyet kiváltani/„dobni” kell, amikor a láncolt listád üres.
A tesztek csak akkor lesznek sikeresek, ha testre szabod a megfelelő kivételeket, raise-eled őket, és megfelelő hibaüzeneteket adsz meg.
Egy általános kivétel testre szabásához hozz létre egy class-t, amely a Exception-ből örököl.
Amikor üzenettel együtt váltod ki az egyedi kivételt, az üzenetet a exception típus argumentumaként add meg:
# subclassing Exception to create EmptyListException
class EmptyListException(Exception):
"""Exception raised when the linked list is empty.
message: explanation of the error.
"""
def __init__(self, message):
self.message = message
# raising an EmptyListException
raise EmptyListException("The list is empty.")
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.