Cvičenie 3 - Úvod do programovacieho jazyka Python II

Cieľom tretieho cvičenia je naučiť sa základom funkcionálneho programovania a práce so súbormi v jazyku Python.

Ak už viete programovať v jazyku Python, prečítajte si aspoň kapitolu o Funkcionálnom programovaní a Lambda výrazoch.

Pre vlastné skripty si na serveri vytvorte v adresári /home/student/ adresár s vaším priezviskom a všetky svoje súbory ukladajte tam.

Funkcie

Funkcie v Pythone definujete pomocou kľúčového slova def za ktorým nasleduje meno funkcie a zoznam parametrov v zátvorkách () oddelených čiarkou. Príkazy funkcie musia byť odsadené od začiatku riadku.

Pre dokumentovanie kódu sa v Pythone používajú tzv. dokumentačné reťazce (v angličtine docstring), ktoré sú uvedené na prvom riadku definovanej funkcie pred ostatnými príkazmi. Dokumentačné reťazce môžu mať viacero riadkov a sú ohraničené trojitými úvodzovkami """. Pre funkcie je text reťazca odsadený od začiatku riadka rovnako ako príkazy funkcie. Túto konvenciu potom využívajú rôzne nástroje, ktoré napr. automaticky vyextrahujú HTML dokumentáciu pre všetky funkcie programu.

Interpreter Pythonu má zabudovanú funkciu help, ktorá pre zadaný názov funkcie alebo modulu vypíše dokumentačný reťazec. Napr. po definovaní funkcie sum_squares z predchádzajúceho príkladu môžete vypísať jej dokumentáciu príkazom help(sum_squares). V dokumentácii môžete listovať klávesami šípka hore / šípka dole alebo Page Up / Page Down a zobrazovanie ukončíte klávesou q.

Ďalšie odporúčania pre písanie dokumentačných reťazcov nájdete tu (v angličtine).

Funkcionálne programovanie - Lambda výrazy

Funkcie sú v Pythone objekty s ktorými môžete pracovať ako s ľubovoľnou hodnotou, tzn. môžete ich napr. priradiť premennej, predať ich ako parameter pri volaní ďalšej funkcie, alebo môžete mať funkciu ktorá vracia funkciu ako návratovú hodnotu. Funkcionálne programovanie je zvlášť vhodné pre spracovanie veľkých dát, pretože zjednodušuje paralelné a distribuované výpočty.

Moduly

Zložitejšie skripty si môžete rozdeliť do viacerých súborov, ktoré potom môžete importovať ako samostatné moduly. Napr. ak chcete využívať vo svojom skripte funkcie z predchádzajúceho príkladu, skopírujte kód do samostatného súboru, ktorý uložíte do rovnakého adresára v akom je váš skript (napr. ak je váš skript uložený ako /home/student/[priezvisko]/skript.py, skopírujte príklad do súboru /home/student/[priezvisko]/priklad16.py). V skripte potom môžete naimportovať funkcie modulu príkazom import [názov modulu], napr.:

Práca so súbormi

Objekt pre čítanie a zápis dát do súboru vytvoríte funkciou open([názov súboru], [nastavenia]). Reťazec s nastaveniami je zložený z písmen, ktoré udávajú spôsob prístupu k súboru: "r" – iba pre čítanie, "w" – iba pre zápis a "r+" – aj čítanie aj zápis. Parameter s nastaveniami je nepovinný a ak ho vynecháte, súbor bude otvorený na čítanie. Dodatočne sa k nastaveniam pridáva aj písmeno "b" označujúce binárny prístup k dátam (binárny a textový prístup sa rozlišuje iba v systéme Windows, pre Linux nemá nastavenie "b" žiadny efekt).

Všetky svoje súbory ukladajte do adresára s vaším priezviskom /home/student/[priezvisko]/.

Viac sa o práci so súbormi dočítate tu (v angličtine).

Súbory CSV a JSON

Python podporuje čítanie a zapisovanie štruktúrovaných dát, ktoré sú uložené v textových formátoch CSV (Comma Separated Values) alebo JSON (JavaScript Object Notation).

CSV je jednoduchý textový formát pre tabuľkové dáta pri ktorom sú hodnoty v riadku oddelené znakom oddeľovača (napr. , alebo znakom tabulátora).

Viac o spracovaní CSV dát si môžete prečítať tu (v angličtine).

JSON je textový formát, ktorý súži na zápis štruktúrovaných dát. Dáta sú ukladané v podobe objektov zložených z pomenovaných vlastností. Hodnoty vlastností môžu byť čísla, reťazce, Boolovské hodnoty truefalse, polia hodnôt alebo vnorené objekty.

Viac o práci so súbormi JSON sa dočítate tu (v angličtine).

Úlohy

Úloha 3.1

Naprogramujte funkciu get_value(s, emptyvalue="", boolvalues=("true", "false")), ktorá prevedie zadaný reťazec na dátovú hodnotu Pythona:

  • Ak sa reťazec rovná hodnote emptyvalue, skonvertuje sa na None.
  • Ak sa reťazec rovná hodnote boolvalues[0] alebo boolvalues[1], skonvertuje sa na True alebo False.
  • Reťazec sa prevedie na desatinné číslo ak sa dá skonvertovať funkciou float(s) (prevod môžete ošetriť príkazom try/except).
  • Inak hodnota zostane nezmenená a vráti sa ako reťazec.

Úloha 3.2

Naprogramujte funkciu load_csv_data(fn), ktorá načíta údaje uložené v CSV súbore s názvom fn. Pre konverziu hodnôt využite funkciu get_value(s) z predchádzajúceho príkladu. Funkcia by mala mať voliteľné parametre pre znak oddeľovača a ohraničenia hodnôt podobne ako má funkcia csv.reader.

Úloha 3.3

Naprogramujte funkciu reduce_by_key(items, opr, init=None), ktorá má na vstupe zoznam dvojíc (kľúč, hodnota) items a na výstupe mapu, kde jednotlivým kľúčom sú priradené hodnoty agregované funkciou opr zoskupené podľa kľúča. Napr. pre vstup [("setosa", 2.5), ("setosa", 1.3), ("virginica", 1.5), ("virginica", 3.0), ("setosa", 1.3)] bude na výstupe pre operáciu sčítania lambda x, y: x + y mapa {"setosa": 5.1, "virginica": 4.5}.

Úloha 3.4

Stiahnite si súbor http://people.tuke.sk/martin.sarnovsky/tsvd/files/iris.csv a načítajte ho funkciou load_csv_data(fn) z predchádzajúceho príkladu. Pomocou funkcií reduce a reduce_by_key vypočítajte základné štatistiky - min., max., priemer, štandardná odchýlka pre číselné atribúty a početnosť hodnôt pre nominálne atribúty.