Programavimo kalba Python
2005 m. ruduo
Laisvai pasirenkamas dalykas, 4 kreditai.
Paskaitos vykdavo antradieniais, 18:00, 301 auditorijoje.
Pratybos vykdavo antradieniais 16:00 val. 4-oje ir 5-oje kompiuterių klasėse, bei trečiadieniais 14:00 val. 13-oje o kompiuterių klasėje.
Per paskaitas dėsčiau teoriją (žr. skaidres), per pratybas priiminėdavau atsiskaitymus.
Visa svarbi informacija turėtų būti surašyta šiame puslapyje
Atsiskaitymai
Per pratybas reikės atsiskaityti tris mažas programėles (arba vieną didelę). Sąlygas reikia susigalvoti patiems -- aš tik pateiksiu bendrus reikalavimus, tematiką, bei sąlygų pavyzdžius. Prieš pradėdami jas daryti, sąlygą parodykite man (el. paštu -- marius@gedmin.as -- arba per pratybas asmeniškai), kad aš ją patvirtinčiau. Visos sąlygos turi būti pakankamai skirtingos (kad du žmonės nedarytų tos pačios užduoties). Jei sąlygą nusiuntėte man pašu, o aš per pakankamai greitą laiką (porą dienų) neatsiliepiau, galite pakartotinai mane krutinti emailu arba tiesiog pradėti ją daryti. Jei iškyla problemų su paštu (jūsų siųstas laiškas grįžta), bandykite mano darbo adresą -- marius@pov.lt.
Deadlainai: viską reikia atsiskaityti iki semestro galo. Atsižvelkite į tai, kad jūsų daug (85), aš vienas, ir atsiskaitymas užima laiko (bent 5 minutes).
Pirmoji užduotis. Parašyti programą, kuri apdoroja tekstinį failą (ar kelis failus).
Mano tikslai šiai užduotėlei: noriu, kad būtų proga susipažinti su ciklais, duomenų įvedimu ir išvedimu, sąrašais ir/arba žodynais.
Sąlygų pavyzdžiai (kai kurie iš praėjusių metų, kiti šiaip į galvą atėję):
- Skaičiuoti raidžių/žodžių dažnumus
- Palyginti du failus pažodžiui (kaip GNU wdiff)
- Atsitiktinio labirinto generavimas.
- Suskaidyti failą į N dalių bei suklijuoti atgal.
- Užkoduoti/atkoduoti failą.
- Suskaičiuoti raidžių/žodžių dažnumus ir papaišyti tekstinį grafikėlį.
- Parašyti paprastą suspaudimo programėlę (LZW ir RLE algoritmai jau pasirinki).
- Paprastas kokios nors kalbos sintaksės išryškinimas (išvedimas HTMLu).
- Paprastas kokios nors kalbos sintaksės išryškinimas (išvedimas tekstu su ANSI spalvų kodais).
- Spręsti kvadratinę lygtį ax2+bx+c=0 (pradiniame faile koeficientai a, b, c).
- Lygiuoti tekstą, kad dešinys kraštas būtų lygus (įterpiant kur reikia tarpus).
- Tekstiniame faile pakeisti kai kurios žodžius į kitus žodžius (antrajame faile nurodyti pakeitimai).
- Iš failo išrinkti žodžius, kurie pasikartoja daugiau nei N kartų, ir surašyti į kitą failą.
- Papaišyti Mandelbroto aibę tekstiniais simboliais.
- Tvarkingai išmėtyti/sudėlioti tarpus tekste (kad po kabelio būtų, prieš kablelį nebūtų, skliaustų viduje nebūtų, išorėje būtų, bet tik jei neseka skyrybos ženklas ir pan.)
- Daryti tą patį kokiai nors programavimo kalbai (pvz. Python ;-)
- Iš WWW serverio log failo išrinkti dažniausiai pasitaikančius IP adresus.
Antroji užduotis. Praeitais metais tai buvo programėlė, kuri iš internetinio puslapio (HTML/XML) krapšto informaciją ir ją apdoroja.
Šiais metais siūlau įdomesnę temą: mažas tekstinis nuotykinis žaidimukas (interactive fiction/MUD). Komandų eilutėje įvedate veiksmus ("go north" arba "paimti akmenį"), nedidukas pasaulio modelis jos vykdo.
Arba dar viena mintis: geometrija/grafika. Pvz., tekstiniame faile aprašytos geometrinės figūros, kurias reikia pavaizduoti ekrane grafiškai. Arba išspręsti kokią geometrinę užduotėlę.
Mano tikslai šiai užduotėlei: noriu, kad apsirašytumėte porą klasių, modeliuojančių kažkokius pasaulio objektus.
Trečioji užduotis. Visų reikalavimų dar nesugalvojau (tai reiškia, kad galite sąlygą susigalvoti patys), bet norėsiu unit testų.
Mano tikslai šiai užduotėlei: noriu, kad pasitreniruotumėte rašyti testus; stipriai rekomenduoju Test-Driven Developmentą.
Galima (bet nebūtina) atiskaitinėti tą pačią pirmąją ar antrąją užduotėlę, pridėjus jai testus. Tokiu atveju lengviau bus, jei kodą rašysite iš naujo, naudodami testai pirma metodiką, egzistuojantį kodą naudodami tik kaip prototipą. Bus įdomu palyginti kodo, rašyto be testų, ir kodo, rašyto testai pirma būdu, kokybę.
Projektas. Vietoje trijų mažų programėlių galima rašyti vieną didelę. Reikalavimai:
- Programa turi turėti grafinę vartotojo sąsają (GUI) arba būti tinklo serveris, leidžiantis prisijungti keliems vartotojams lygiagrečiai.
- Ji turėtų daryti ką nors naudingo/įdomaus.
- Ji turėtų turėti unit testus.
Pavyzdys: mp3 serveris -- galima prisijungti prie jo per telnetą (arba per webinį interfeisą), ieškoti dainų pagal failo pavadinimą ir/arba ID3 atributus, peržiūrinėti dainų sąrašą, pridėdinėti dainas į playlistą ir jas groti (galima paleisti mpg123 su os.system).
Pavyzdys: grafinė programa laiko žymėjimui -- vartotojas pasižymi, kada pradeda, ir kada baigia daryti tam tikrą užduotį ir gali pasiųsti dienos ar savaitės darbų ataskaitą emailu.
Pavyzdys: MagicPoint -> PDF konverteris. MagicPoint yra įrankis, kuriuo aš rengiu skaidres paskaitoms. MagicPoint skaidrės aprašomos tekstiniame faile labai paprastu formatu. PDFų generacijai apsimoka naudoti Reportlab biblioteką. Nei GUI nei tinklo čia nėra -- bet PDFą galima laikyti kaip ir GUI... programa tikrai bus pakankamai sudėtinga.
Literatūra
- Python Tutorial -- įžanga.
- Dive into Python -- knyga patyrusiems programuotojams. Galima skaityti online, galima parsisiųsti, galima nusipirkti popierinį variantą.
- Learning Python O'Reilly knyga. Skaityti online nepavyks.
- PEP 8 gero Python stiliaus rekomendacijos.
Python kalbos interpretatorių įvairioms operacinėms sistemoms galite rasti www.python.org. Daugelyje Linux distribucijų bei naujesnėse Mac OS X versijose Python interpretatorius ateina su operacine sistema ir jo atskirai siųstis nereikia.
Įžanga
Python -- dinaminė aukšto lygio programavimo kalba. Python yra griežtai tipizuota (neturi typecastų), bet nėra statiškai tipizuota (tipus turi ne kintamieji, o reikšmės). Python leidžia naudoti struktūrinio, objektinio, bendro (generic) bei, šiek tiek, funkcinio programavimo paradigmas. Python yra interpretuojama kalba, panašiai kaip Java (programa pirma kompiliuojama į baitinį kodą, o paskui virtuali mašina tą kodą interpretuoja). Skirtingai nuo Java, Pytohn kompiliavimas atliekamas automatiškai, paleidus interpretatorių.
Štai kaip atrodo trumpa tradicinė Hello, World programėlė:
print "Hello, world!"
Štai kaip atrodo daug rimtesnė tos pačios programėlės versija:
#!/usr/bin/env python # -*- coding: UTF-8 -*- """ Labas, pasauli. Demonstracinė programėlė Python kursui. Autorius -- Marius Gedminas """ def main(): """Spausdina ekrane žodžius "Hello, world!".""" print "Hello, world!" if __name__ == "__main__": main()
Pirmoji eilutė -- specialus komentaras, nurodantis, jog tai yra Python kalbos skriptas. Unix šeimos operacinės sistemos pagal šią eilutę nustato, kokį interpretatorių reikia paleisti.
Antroje eilutėje -- dar vienas specialus komentaras, nurodantis failo koduotę (jo reikia, jei faile pasitaiko raidžių, nepatenkančių į US-ASCII).
Trigubomis kabutėmis Pythone apibrėžiamos ilgos simbolių eilutės (multiline strings). Tradiciškai tokios eilutės naudojamos dokumentacijai, analogiškai Javos dokumentaciniams komentarams. Kiekvieno failo, klasės, funkcijos pradžioje verta įrašyti dokumentacinę eilutę. Egzistuoja programų (pvz., pydoc), kurios iš Pythono programų ištraukia ir gražiai suformatuoja tokiu pavidalu pateiktą dokumentaciją.
Toliau matome funkcijos main
apibrėžimą. Funkcijos
kūną sudaro visos eilutės, kurios yra pastumtos į dešinę (keturiais
tarpais). Ši funkcija nieko negražina.
Programos pabaigoje -- idiomatiškas patikrinimas, ar programa yra vykdoma, ar tik importuojama. Apie tai detaliau parašysiu vėliau.
Paskaitos
Šių metų skaidrės (PDFai bei MagicPoint pradiniai failai).
Taip pat galite pasižvalgyti į praėjusių metų paskaitų konspektus HTMLu.