DebugList

Siekiant paprasčiau paaiškinti rikiavimo algoritmų veikimą, susikursime klasę kuri praneš kiekvieną pasikeitimą. Tai padaryti nesudėtinga dėka technikos vadinamos Duck-Typing. Terminas atsirado iš angliško posakio ,,If it looks like a duck, quacks like a duck - it is a duck''. Kadangi Python(kaip ir kitos dinaminės kalbos), remiasi dinaminiais tipais, mes galime pateiti klasę kurios nesitiki, tačiau viskas veikia, nes klasė padengia visus būtiniausius metodus.

Pirmas žingsnis - sukuriam klasę

class DebugList(object):
    pass

Dabar prisimenam savo tikslą ...

pradmenys python rikiavimas


Hashable

Terminas naudojamas įvairiose kalbose, tačiau visose gaubia vienodas kiekis mistikos.

Kodėl parašius:

d[[1, 2, 3]] = "test"

arba

key = [1, 2, 3]
d[key] = "test"

Gauname piktą errorą TypeError: unhashable type: 'list'

Tačiau pakeitus kodą į:

key = (1, 2, 3)
d[key] = "test"

Viskas veikia kuo puikiausiai? Dažniausiai tokios situacijos kyla norint panaudoti kompleksinį žodyno raktą. Rečiau - kai bandome serializuoti objektą (cache, multiprocessing, pickle). Ši klaida gali įvaryti į neviltį.

Taigi kaip šios klaidos išvengti ...

python


Argumentas ir parametras

Parametras - abstrakti reikšmė kurią gali atiktikti bet kas, kas tenkina kriterijus (duomenų tipas).

Pvz.:

def mano_funkcija(x, y):
    return x + y

xir y yra parametrai. Į juos galima paduoti visus duomenis. Su dalimi mūsų kodas nuluš, bet esmės nekeičia... :)

Argumentas - konkreti reikšmė tuo metu t.y.

mano_funkcija(3, 5)

šiuo atveju 3 ir 5 - argumentai

pradmenys argumentas parametras


Interfeisai ir klasės

Tarp šių dviejų yra plonytė linija daugumoje kalbų. Kai kurios, pvz.: C++ tokios sąvokos apskritai neturi, tačiau tas galiausiai pasiekiama naudojant tam tikrą programavimo šabloną.

Interfeisas neturi realizacijos

Interfeisas (angliškai "Interface", lietuviškai dažnai verčiama kaip "Sąsaja") neturi realizacijos. Kaip minėta kalbant apie klases (Klasė ir Objektas) klasė pati savaime yra šablonas aprašyti objektui, tačiau Interfeisą būtų galima apibrėžti lygiai taip pat. Taigi koks skirtumas?

a) Interfeise draudžiama realizuoti Metodus.

b) Iš Intefeiso negalima sukurti Objekto ...

pradmenys klasė interfeisas


Klasė ir objektas

Jų skirtumas yra gan aiškus, tačiau labai dažnai painiojamas ir nesuprantamas naujokų.

Klasė - šablonas, taisyklių rinkinys aprašantis Objektą

Objektas - duomenų struktūra sukurta pagal Klasėsaprašymą.

Pavyzdžiui, jeigu turime klasę Asmuo:

class Asmuo(string vardas, int amžius)

Tai ji mums nusako, jog kiekvienas asmuo turės vardą ir amžių, bet tai yra abstraktu, šablonas kitaip sakant. Konkretūs asmenys gali būti:

a = Asmuo("Onutė", 20)
b = Asmuo("Jonas", 14)
...

Šie konkretūs asmenys ir yra objektai

pradmenys klasė objektas


Iteratorius vs Generatorius

Kiekvienas generatorius yra iteratorius, bet ne kiekvienas iteratorius yra generatorius.

Iteratorius - objektas, kuris mums gražina reikšmes tol, kol seka išsenka (pasibaigia)

Generatorius - objektas, kuris ne tik gražina, bet ir kuria naujas reikšmes.

Iš vartotojo pusės tai yra vienas ir tas pats, dėl to dažnai šios sąvokos naudojamos (ir aš tai darau) kaip sinonimai,tačiau sąvokos išsiskiria kai pradedama kalbėti apie begalines sekas, tokią seką gali kurti tik generatorius.

pradmenys iteratorius generatorius