Zhrnutie kurzu Python - Programovanie

Je tu koniec kurzu programovania v Pythone a ideme sa pozriet na to, co sme sa behom kurzu naučili, prípadne, čo by bolo dobré si doma naštudovať a kam smerovať v samoštúdiu ďalej v závislosti od toho, čomu sa chcem venovať.

Instalacie

Vieme uz:

  • Nainstalovat Python, ktory bezi samostatne vo virtualnom prostredi. Virtualne prostredie sa vytvara prikazom python3 -v venv {nazov}
  • Nainstalovat si rozne kniznice pomocou pip.

Ked chcem pridat novu kniznicu najdeme si na strankach vybranej kniznice sekciu Installation a sposob instalacie cez pip.


Priklad:

Budeme chciet pracovat s kniznicou na krajsie vizualizacie grafov napriklad Bokeh. Pojdeme na stranky kniznice, kde si pozrieme, ake vsetky kniznice je potrebne mat nainstalovane k behu nami vybranej. Nainstalujeme si ich pomocou pipu. A nasledne aj samostnu kniznicu bokeh prikazom pip install bokeh

Doplnok

Vypis vsetkych nainstalovanych kniznic v danom virtualnom prostredi a ich ulozenie napriklad do suboru s nazvom requirements.txt sa robi pomocou prikazu pip freeze > requirements.txt.
Nasledne ked niekto novy zacne pracovat na projekte si vsetky kniznice moze nainstalovat pomocou prikazu pip install -r requirements.txt

Uloha

  1. Uisti sa ze si v zlozke digitalacademy/10 a mas zapnute virtualne prostredie
  2. Nainstaluj kniznicu Beautiful Soup
  3. Vytvor si subor requirements.txt, v ktorom budu vsetky nainstalovane kniznice
  4. Pozri si co sa nachadza v subore requirements.txt pomocou prikazu notepad/nano/vim requirements.txt alebo si ho klasicky otvor cez rozhranie v pocitaci

Importovat kniznice

Ukazali sme si, ze vzdy po nainstalovani je potrebne kniznicu importovat, aby sme mohli pouzivat jej metody a funkcie. Aby sme vedeli, ktore funkcie a metody mame z kniznice dostupne je dobre vzdy hladat v dokumentacii.

Existuju tri druhy importu kniznic

  1. import pandas as pd
  2. from datetime import *
  3. from datetime import timedelta

V praxi sa pouziva najviac treti sposob, najme kvoli efektivite, kedy nie je nutne importovat do projektu vsetky funkcie a zbytocne ho zatazovat a taktiez aj kvoli prehladnosti.

Vlastne moduly

Tak ako importujeme metody, atributy z inych kniznic, mozeme aj z nasich vlastnych. Staci si vytvorit python subor, do ktoreho si nadefinujeme funkcie, premenne a budu k dispozicii tam, kde ich naimportujeme. Je to dobre takto clenit aj kvoli minimalizacie logiky v jednom kode a funkcii, lepsej organizacii a podobne.

Ulohy

  • Vytvor subor clovek.py a napis donho farba_vlasov = "zlta" a vek=12
  • Pridaj do suboru este funkciu, def popis(): return "Clovek ma farbu vlasov: {farba} a vek {vek}".format(farba = farba_vlasov, vek = vek)
  • Vytvor si dalsi subor s nazvom co.py
  • Pridaj do suboru co.py import clovek
  • Pridaj do suboru print(clovek.popis())
  • Chod do konzoly a pusti python/python3 co.py

Ulohy

  • Spusti novy jupyter notebook
  • Vytvor si novy notebook typu python3
  • Z kniznice datetime si vyber lubovolnu funkciu a importuj ju pomocou from datetime import *
  • Z random importuj randint pomocou tretieho sposobu from random import randint
  • Skus pouzit volanie funkcie z datetime kniznice, ktoru si si importovala
  • Skus pouzit volanie funkcie z random, ktoru si si importovala

Datove typy v Pythone

Naucili a pracovali sme s roznymi datovymi typmi v Pythone.

Ulohy

  • Vytvor premennu typu string s nazvom meno a uloz do nej svoje meno.
  • Vytvor premennu typu cele cislo a uloz do nej svoj vek
  • Vytvor premennu typu desatine cislo a uloz do nej svoju vahu na 2 desatine miesta

Doplnok

V pythone mozeme napisat aj nieco taketo:
name, age, weight = "Sveta", 26, 45.36

In [19]:
name, age, weight = "Sveta", 26, 45.36
print (name)
print (age)
print (weight)
Sveta
26
45.36

Datove struktury

V Pythone je mnoho dalsich datovych struktur, s ktorymi mozeme efektivne pracovat

  • List
  • Slovnik
  • Mnozina
  • N-tica
  • Sekvencia znakov ako string
  • Dalsie - mozne najst v dokumentacii

Pri strukturach je dolezite vediet, ktore su menitelne a ktore su nemenitelne

Ulohy

  • Skus vytvorit prazdne pole a uloz ho do premennej colors
  • Vytvor prazdny slovnik do premennej fakulty
  • Vytvor prazdnu nticu do premennej mena
  • Vytvor prazdnu mnozinu do premennej vektor
  • Do kazdej premennej pridaj dva prvky. Do slovnika pridaj keys name a logo a prirad im lubovolne hodnoty.
  • Z kazdej premennej vypis prvy prvok. V ramci slovnika vypis hodnotu z kluca name.

Doplnok

Dalsimi pomerne casto pouzivanymi a uzitocnymi strukturami su napriklad Counter a Enum

In [20]:
#Counter
from collections import Counter
my_items = Counter([1, "red"])
In [21]:
my_items
Out[21]:
Counter({1: 1, 'red': 1})
In [22]:
my_items_new = Counter([1, "red", 1, "blue"])
my_items_new
Out[22]:
Counter({1: 2, 'red': 1, 'blue': 1})
In [23]:
#Enum
from enum import Enum
class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
In [24]:
Color.RED
Out[24]:
<Color.RED: 1>
In [25]:
Color.RED.name
Out[25]:
'RED'
In [26]:
Color(3)
Out[26]:
<Color.BLUE: 3>
In [27]:
Color.RED.value
Out[27]:
1

Cykly

Vieme pracovat s for a while cyklom. Vieme cyklus ukoncit pomocou break alebo v cykle pokracovat pomocou continue. Hlavnym rozdielom medzi for a while je, ze for pouzivame, ked vieme pevny pocet opakovani. While cyklus sa pouziva ked nevieme presne pocet opakovani, ale kym je podmienka pravdiva. Nekonecny cyklus ukoncujeme prave pomocou prikazu break.

Ulohy

  • Napis program, ktory pomocou for cyklu naplni premenne do prazdneho pola numbers hodnotami od 0 do 10
  • Napis program, ktory dokym je cislo i>=3 bude vypisovat toto cislo je stale vetsie {i}. Za {i} v zatvorkach dopln hodnotu premennej i, ktora je ina kazdym prechodom cyklu. Cislo i zacina na 20 a kazdym prechodom cyklu sa znizuje o 2.

Podmienky

S podmienkami pracujeme na zaklade vetvenia toku programu. Mozeme definovat, co ma stat, kym je podmienka pravdiva, co sa ma stat , ak pravdiva nie je. Ak mame viacero podmienok, ktore moze program vratit pouzivame elif. V Pythone narozdiel od inych jazykov neexistuje prikaz switch, ktory vlastne je ekvivalent k if..elif..else

Ulohy

  • Napis program, ktory ked sa zada cislo uzivatel, ak je to cislo 1 vypise toto je cislo 1, ked sa zada cislo vetsie alebo rovne ako 2 a mensie alebo rovne ako 10 zaroven vypise toto je moje stastne cislo, ked sa zada cislo, ktore je vetsie ako 11 a zaroven je neparne vypise toto je moje nestastne neparne cislo. Ak nie je splnena ziadna z podmienok vypis, no do kelu, dneska mi to s tymi cislami nejde.

Funkcie

Funkcie sa definuju pomocou def. Mozu mat 0..N parametrov, s ktorymi pracujeme. Mozu ale nemusia mat navratovu hodnotu pomocou return. Sluzia nam na lepsiu organizaciu kodu a znovupouzitelnost.
Narozdiel od metod je mozne ich pouzit obecne. Metoda sa najme od funkcie odlisuje pristupom cez . a v jej definicii sa nachadza klucove slovo self.

Ulohy

  • Napis funkciu zrataj, ktora na vstupe nacita dve cisla a vrati ich sumu
  • Napis funkciu nic, ktora na vstupe nema parameter a vypise Dneska je super den

Odchytenie chyb

Často zistíš, že program, ktorý napíšeš, nebude fungovať správne na prvý krát. Dôležité je vedieť, ako chybu nájsť. Na to slúžia chybové výpisy. Chybove hlasky mozu byt zo zaciatku tazko pochopitelne, zvyknut sa na iba praxou. Najdolezitejsie je vediet najst, cislo riadku, kde je chyba. Ked vidis, ze je chyba na riadku cislo 23, mozes sa na ten riadok pozriet a chybu najst. Ked chyba nie je na danom riadku, moze byt o par riadkov vyssie alebo nizsie.

Ulohy

  • Otvor si terminal
  • Vypni jupyter notebook ak ti bezi
  • Zadaj do terminalu python alebo python3
  • Zadaj do terminalu v pythone a = 12. Na dalsom riadku print ("ahoj" + 12) a pozri sa aku chybu ti vyhodilo. Je tam TypeError
  • Ukazeme si spolu dalsie typy chyb

Ukazka dalsich typov chyb, s ktorymi mozeme prist do styku:
name error, type error , import error, indentational error, index error, syntax error, zero division error

In [35]:
def nacitaj_cislo():
    odpoved = input('Zadaj číslo: ')
    try:
        cislo = int(odpoved)
    except ValueError:
        print('To nebolo číslo!')
In [37]:
nacitaj_cislo()
Zadaj číslo: 12
In [44]:
def nacitaj_cislo2():
    odpoved = input('Zadaj číslo: ')
    cislo = int(odpoved)
In [45]:
try:
    nacitaj_cislo2()
except ValueError:
    print('Tohle se provede, pokud nastane ValueError')
except NameError:
    print('Tohle se provede, pokud nastane NameError')
except Exception:
    print('Tohle se provede, pokud nastane jiná chyba')
else:
    print('Tohle se provede, pokud chyba nenastane')
finally:
    print('Tohle se provede vždycky; i pokud v `try` bloku byl např. `return`')
Zadaj číslo: 'a'
Tohle se provede, pokud nastane ValueError
Tohle se provede vždycky; i pokud v `try` bloku byl např. `return`

Praca s datami

Vieme citat data z roznych zdrojov. Zdrojmi mozu byt:

  • API - ak chceme data napriklad z nejakeho externeho systemu, aplikacie a podobne. API moze byt bud REST a vracia sa nam json alebo SOAP, vracia sa nam xml. Pri praci s api je potrebne poznat http kody, informujuce o spracovani. Pre nas je dolezity najme stav 200, 404 a 500.
    Pri praci s API je vzdy potrebne pozriet sa na format, v akom su data vracane. Dolezite je najme vediet, ci su data v slovniku alebo v poli a podla toho k nim pristupovat.
    V pythone na pracu s webovymi strankami mame requests kniznicu a kniznicu json na pracu s jsonom.
  • XML - data mozeme ziskavat napriklad z roznych rss feedov, alebo suborov, ktore su generovane z roznych uctovnych systemov ako pohoda, ktore su najcastejsie vo forme xml.
    V Pythone na pracu s xml mame kniznicu xml. Rovnako ako pri praci s jsonom je potrebne si pozriet strukturu , v akej data su, najme hlbka zanorenia, v ktorej sa nachadzaju data, s ktorymi chceme pracovat.
  • CSV - data v csv nam najcastejsie poslu analytici a ini kolegovia ako export z roznych systemov, napriklad z fb, marketingovych nastrojov, prevedene exceli do csv a je to najcastejsi format exportu dat z databazy. Pri praci s CSV je dolezite aby bol subor kodovany v utf-8, mal spravne delimiter a enclosure. Ak nam nejde otvorit je vetsinou nutne subor pregenerovat pri exporte alebo si ho spravne ulozit u seba.

Praca s CSV subormi

S datami v CSV subore mozeme pracovat bud:

  • V pandase. Praca v kniznici Pandas nam usetri vela casu. Je naprogramovana, odladena, efektivna, s datami pracujeme ako s tabulkami v SQL. Mozeme nad nimi vykonavat vsetky matematicke, statisticke, analyticke vypocty. Pracovat s datami v roznych formatoch a ukladach ich do roznych formatov
  • V cistom Pythone bez pouzitia kniznice. Na pracu so subormi mame prikaz with open .... Do suboru mozeme zapisovat pomocou w a citat pomocou r

Rovnako ako s CSV je takto mozne pracovat s TXT, word, pdf, excelom a subormi v inych formatoch

Stiahnutie dat z webu

Niekedy nie je mozne ziskat data priamo, preto je mozne pouzit web scraping. Na webscriping je dobrou kniznicou Beautiful Soup

In [47]:
import urllib.request
import socket
import ssl
from bs4 import BeautifulSoup
import pandas as pd
titles = []
dates = []
places = []
categories = []
ssl._create_default_https_context = ssl._create_unverified_context
url = "http://www.czechitas.cz/cs/kalendar-akci/events"
response = urllib.request.urlopen(url)
the_page = response.read()
soup = BeautifulSoup(the_page, 'html.parser')
events = soup.find_all("div", class_="cal-entry")
for element in events:
    titles.append(element.h4.get_text())
    categories.append(element.span.get_text())
    dates.append(element.p.get_text())
    place = element.find(class_="cal-place").get_text()
    places.append(place)

courses = {'title': titles,
         'category': categories,
         'date': dates,
         'place': places}
courseDf = pd.DataFrame.from_dict(courses)
courseDf
Out[47]:
category date place title
0 \n\t\t\t\t\tAkademie programování\n\t\t\t\t \n neděle, 26. 03. 2017\n \n\t\t\t\t\t ... Den s Legoroboty
1 \n\t\t\t\t\tProgramuju\n\t\t\t\t \n pondělí, 27. 03. 2017\n \n\t\t\t\t\t ... Czechitas Coding Club
2 \n\t\t\t\t\tTvořím web\n\t\t\t\t \n úterý, 28. 03. 2017\n \n\t\t\t\t\t ... Tvořím web od A do Z
3 \n\t\t\t\t\tJsem digitální!\n\t\t\t\t \n sobota, 1. 04. 2017\n \n\t\t\t\t\t ... Product Management
4 \n\t\t\t\t\tProgramuju\n\t\t\t\t \n čtvrtek, 6. 04. 2017\n \n\t\t\t\t\t ... Java pokročilá
5 \n\t\t\t\t\tDalší\n\t\t\t\t \n neděle, 9. 04. 2017\n \n\t\t\t\t\t ... Bezpečnost
6 \n\t\t\t\t\tProgramuju\n\t\t\t\t \n neděle, 9. 04. 2017\n \n\t\t\t\t\t ... Úvod do testování
7 \n\t\t\t\t\tDalší\n\t\t\t\t \n pondělí, 10. 04. 2017\n \n\t\t\t\t\t ... Kurz na míru - Grafika pro HR
8 \n\t\t\t\t\tProgramuju\n\t\t\t\t \n pondělí, 10. 04. 2017\n \n\t\t\t\t\t ... Czechitas Coding Club
9 \n\t\t\t\t\tTvořím web\n\t\t\t\t \n úterý, 11. 04. 2017\n \n\t\t\t\t\t ... Tvořím web od A do Z
10 \n\t\t\t\t\tDalší\n\t\t\t\t \n čtvrtek, 13. 04. 2017\n \n\t\t\t\t\t ... Kurz na míru - Excel pro HR
11 \n\t\t\t\t\tProgramuju\n\t\t\t\t \n čtvrtek, 13. 04. 2017\n \n\t\t\t\t\t ... Java pokročilá
12 \n\t\t\t\t\tDalší\n\t\t\t\t \n sobota, 15. 04. 2017\n \n\t\t\t\t\t ... Excel
13 \n\t\t\t\t\tTvořím web\n\t\t\t\t \n úterý, 18. 04. 2017\n \n\t\t\t\t\t ... Tvořím web od A do Z
14 \n\t\t\t\t\tProgramuju\n\t\t\t\t \n čtvrtek, 20. 04. 2017\n \n\t\t\t\t\t ... Java pokročilá

Databazy

K datam mozeme pristupovat taktiez priamo z databazy. Existuju dve primarne clenenia databaz na:

  • Relacne databazy - napriklad MySQL, PostgreSQL, SQLite ukladaju data vo forme tabuliek. V SQL databazach mame jazyk na pracu s datami, ktory nam umoznuje vykonavat rozne operacie. Pracujeme so stlpcami a data su ulozene v riadkoch. Struktura dat v SQL databaze umoznuje data prepajat na zaklade cudzych klucov, rozne ich linkovat.
  • Nerelacne databazy - napriklad MongoDb, Firebase, Cassandra. Pracuju a ukladaju data vo forme kolekcii, vo forme JSONu. Ak vsak napriklad pracujeme s velkym objemom dat, je moznou volbou prave nosql databaza. NoSQL databazy ukladaju data bez duplicit, prepojenia medzi datami funguju na inom principe. Nemusime vzdy poznat strukturu dat a mozu byt vygenerovane inak.

    Export dat je vo forme jsonu napriklad.

Vyber vhodnej databazy

Vyber vhodnej databazy zavisi od toho, co chceme dosiahnut, analyzu projektu, dat s akymi pracujeme.


Relacne databazysa hodia na pracu s datami, ktore su casto volane pomocou sql quries, vykonvame nad nimi rozne transakcie, denne datove analyzy.

Nerelacne databazy su vhodne napriklad na spracovanie logov, bankovych transakcii, zaznamenanie jazd taxikov. Uchovanie roznych geosuradnic.

Pripojenie k databaze

K databazam sa pripajame bud:

  • Lokalne - zo svojho pocitaca, kde nam na localhoste bezi databaza. Vytvorime si uzivatela a mozeme s datami pracovat.
  • Vzdialene - databaza moze byt hostovana na inom serveri, v ramci vybranej infrastuktury alebo ako casto byva teraz zvykom v cloude.

Je jedno, ci sa pripajame lokalne, alebo vzdialene, vetsinou vzdy potrebujeme tieto udaje:

  • Nazov hostu
  • Nazov servera
  • Cislo portu
  • Nazov databazy
  • Uzivatelske meno
  • Heslo

In [34]:
#Pripojenie k databaze v Pythone. Zavisi podla databazy s akou pracujeme. Je potrebne si
#nainstalovat vybranu kniznicu. Pre pripojenie napriklad k postgresql nainstalujeme
# pip install psycopg2
# dokumentacia http://initd.org/psycopg/docs/

hostname = 'ec2-54-235-124-2.compute-1.amazonaws.com'
username = 'zthecpvosjyyvb'
password = 'NMGCO8Cm2GNrYxCIAtbttkPB-M'
database = 'd30eqr9m400pva'

def doQuery( conn ) :
    cur = conn.cursor()

    cur.execute( "SELECT first_name, last_name from auth_user" )

    for first_name, last_name in cur.fetchall() :
        print (first_name, last_name)

import psycopg2
myConnection = psycopg2.connect( host=hostname, user=username, password=password, dbname=database )
doQuery( myConnection )
myConnection.close()
Svetlana Margetová
Czechitas Admin
Pavla Verflová
mobile user
Peter Morávek
Dita Přikrylová
In [1]:
"""
with open('config.json', 'r') as outfile:
        data_config = json.loads(outfile.read())

    db_name = data_config["config"]["pycon_db"]
    f = Firebase('https://name.firebaseio.com/' + db_name + '/')
    f.child('rooms').set(final_output)
    f.child('main').set(data_config)
"""
Out[1]:
'\nwith open(\'config.json\', \'r\') as outfile:\n        data_config = json.loads(outfile.read())\n\n    db_name = data_config["config"]["pycon_db"]\n    f = Firebase(\'https://name.firebaseio.com/\' + db_name + \'/\')\n    f.child(\'rooms\').set(final_output)\n    f.child(\'main\').set(data_config)\n'

Data v databaze mozeme citat alebo zapisovat. Je potrebne vzdy vediet, ake prava nad danou databazou mame. Okrem zapisu a citania su tu dalsie prava na mazanie, upravy a podobne.

Navrh datoveho modelu

Navrh datoveho modelu zavisi od zadania, lisi sa od databazy nad akou pracujeme a taktiez od frameworku/jazyka alebo systemu nad akym pracujeme.

Ukazka zadania na vyhotovenie datoveho modelu pre aplikaciu

Ukazka zadania

Pri vypracovani si najprv precitame zadanie ako celok. Potom by sme zo zadania mali byt schopni identifikovat:

  • Entity - tabulky, nase triedy
  • Atributy, stlpce a ich datove typy v pozadovanom rozsahu
  • Ak pracujeme s nejakym ORM, je dobre aj navrhnut metody nad datami

Po vydefinovani zakladnych entit je potrebne vediet urcit vezby medzi nimi. Vezby mozu byt:

  • 1:1 - priklad 1 clanok ma iba jednu kategoriu a jedna kategoria moze byt priradena iba jednemu clanku.
  • 1:N - 1 clanok moze patrit do viacerych kategorii. Mnohokrat moze mat entita vezbu aj sama na seba. Prikladom je napriklad komentar, ktory moze obsahovat viacero komentarov vnorenych.
  • M:N - 1 clanok moze mat viacerych autorov a jeden autor moze napisat viacero clankov

Ked si data spiseme do tabuliek je nutne ich este normalizovat

Uloha

  • Prejdi si zadanie a skus vypisat aspon 2 entity
  • Vypis zo zadania k dvom entitam co si si vybrala 2 atribty a ich datove typy

Doplnok - nastroje na datove modelovanie

Dobrymi nastrojmi su napriklad

Navrh datoveho modelu pre ine nastroje

Ak napriklad navrhujeme datovy model pre nejaky analyticky system, alebo pre nosql databazu je potrebne zohladnit standardy datoveho modelovania vybraneho systemu. Vid priklad pre datovy model GoodData alebo Tableau

Spracovanie vystupu

Vystupy mozeme spracovat a nasledne zobrazovat:

  • Na webe
  • Ulozit spet do inej databazy
  • Ulozit spet do ineho systemu
  • Vizualizovat v roznych vizualizacnych nastrojoch
  • Poslat na email
  • Vygenerovat do suborov v roznych formatoch, pdf, excel, csv....

Graficke kniznice v Pythone

JavaScript

Niekedy mozeme pouzit kombinaciu Pythonu a Javascriptu

In [50]:
from IPython.display import IFrame
In [57]:
IFrame('http://demo.interface.club/limitless/layout_1/LTR/default/index.html', width=800, height=950)
Out[57]:
In [56]:
IFrame('http://fuse-angular-material.withinpixels.com/dashboard-project', width=800, height=950)
Out[56]:
In [58]:
IFrame('http://eliteadmin.themedesigner.in/demos/eliteadmin-dark/index.html', width=800, height=950)
Out[58]:

Git a Github

Informacie v mojom kurze https://svetlanam.gitbooks.io/html-kurz-2016/content/chapter16.html

In [ ]: