Zdroje
- viď starší, ale skvelý seriál Létající cirkus
Úvod
- budeme používať Python 2.x
- Trojková rada sa začína už vehementne používať, ale veľa tutoriálov je pre 2.X, s ktorou sa ešte dlho nestratíme
- budeme používať zabudované IDE
IDLE
. Sú aj lepšie IDE:pyWriter
, alebo Python v Eclipse
Príklady
Šachová úloha
Naprogramujte šachovo-obilnú úlohu.
sum( 2**x for x in range(64) )
Využijeme jednoduchú list comprehension a priamy prepis matematického vzorca do Pythonu.
Trojuholníky
Úloha z Learn you a Haskell for great good: nájdite všetky pravouhlé trojuholníky, ktorých každá strana je celočíselná a má dĺžku maximálne 10
print [ (a,b,c) for a in range(1,10) for b in range(1,10) for c in range(1,10) if a**2 + b**2 == c**2]
- využijeme megalist megacomprehension
- všetko uvedieme v podmienkach
- keďže chceme hľadať trojice, využijeme na začiatku zoznamu tuple pre strany a, b, c
Frekvencie slov v dokumente
frequencies = {}
file = open("babel.txt")
for line in file:
for word in line.split():
if word in frequencies:
frequencies[word] += 1
else:
frequencies[word] = 1;
def compare_entries(first, second):
return cmp(first[1], second[1])
top_ten = sorted(frequencies.iteritems(), compare_entries, reverse=True)[:10]
for word, freq in top_ten:
print word, freq
{}
je syntax pre prázdny slovník (dictionary), teda mapu- mapy majú hranatozátvorkovú notáciu, ako polia, ibaže indexy nemusia byť len čísla
- neexistuje operátor
++
- funkcia
sorted
zotriedi ľubovoľnú iterovateľnú vec iteritems()
vráti iterátor nad mapou, kde každý prvok je dvojprvková usporiadaná dvojica- funkcia
sorted
potrebuje v druhom parametri funkciu, ktorá porovná dva argumenty- podobná filozofia ako
Comparator
v Jave
- podobná filozofia ako
- využívame tiež pomenované parametre funkcie:
reverse=True
obracia poradie triedeniaTrue
je konštanta pre “pravda”
- využívame tiež rezy, ktorými vezmeme prvých 10 prvkov
- premenná
top_ten
obsahuje dvojice slov a frekvencií, vofor
cykle to môžeme odbaliť (unpack) do dvoch premennýchword
afreq
Aktuálna teplota
Zistite aktuálnu teplotu v meste.
from json import load
from urllib import urlopen
mesto = "Kosice"
url = "http://api.openweathermap.org/data/2.5/weather?q=%s&units=metric" % mesto
response = urlopen(url)
weather_object = load(response)
w = weather_object["weather"][0]["description"]
temp = weather_object["main"]["temp"]
print w, temp
- využijeme dve knižnice:
urllib
pre načítavanie textových dát z webu ajson
pre spracovávanie JSONu z OpenWeatherMap. - potrebujeme dve funkcie (
load
aurlopen
), ktoré importneme z príslušných knižníc - výsledok
urlopen
sa správa ako súbor, čiže vieme cezeň iterovať alebo ho vieme priamo poslať doload
. - výsledok
json.load
je slovník slovníkov, ku ktorému pristupujeme príslušnou syntaxou
Zbojníci
Máte n vecí od draka, rozdeľte ich medzi dvoch zbojníkov tak, aby rozdiel cien bol čo najmenší.
from itertools import *
korist = [200, 700, 300, 700, 700]
najmensi_rozdiel = sum(korist)
najlepsia_suma_pre_zbojnika1 = sum(korist)
for combination in product([1,2], repeat=len(korist)):
delenie = zip(korist, combination)
suma_zbojnik1 = sum([cena for (cena, majitel) in delenie if majitel == 1])
suma_zbojnik2 = sum(korist) - suma_zbojnik1
rozdiel = abs(suma_zbojnik1 - suma_zbojnik2)
if rozdiel < najmensi_rozdiel:
najmensi_rozdiel = rozdiel
najlepsia_suma_pre_zbojnika1 = suma_zbojnik1
print "Prvý zbojník", najlepsia_suma_pre_zbojnika1, "Druhý zbojník", sum(korist) - najlepsia_suma_pre_zbojnika1
- ideme na to hrubou silou
- vygenerujeme všetky kombinácie jednotiek a dvojek dĺžky n, kde n je počet vecí v lupe
- zip() každej položke z lupu priradí zbojníka (buď 1 alebo 2), a vygeneruje zoznam dvojíc, kde prvá zložka bude predmet z lupu a druhá potenciálny majiteľ
- cez list comprehension spočítame sumu lupu pre prvého zbojníka
- sumu pre druhého zistíme ako zvyšok
- predbežne rátame najmenší rozdiel a najmenšiu sumu pre prvého zbojníka
Ďalšie príklady mimo ukážok
HTTP Server
from BaseHTTPServer import *
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.wfile.write("Hello World")
server_address = ('', 8000)
httpd = HTTPServer(server_address, Handler)
httpd.serve_forever()
- navštívte potom
http://localhost:8000
a uvidíteHello World
Grupovanie dát
Vypíšte krajinu a počet jej obyvateľov.
from itertools import groupby
from operator import itemgetter
sales = [('Scotland', 'Edinburgh', 20000),
('Scotland', 'Glasgow', 12500),
('Wales', 'Cardiff', 29700),
('Wales', 'Bangor', 12800),
('England', 'London', 90000),
('England', 'Manchester', 45600),
('England', 'Liverpool', 29700)]
for country, group in groupby(sales, itemgetter(0)):
print country, sum(e[2] for e in group)