UINF/PRJ1a Softvérový projekt 2014: Python

Zdroje

Ú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
  • využívame tiež pomenované parametre funkcie: reverse=True obracia poradie triedenia
    • True je konštanta pre “pravda”
  • využívame tiež rezy, ktorými vezmeme prvých 10 prvkov
  • premenná top_ten obsahuje dvojice slov a frekvencií, vo for cykle to môžeme odbaliť (unpack) do dvoch premenných word a freq

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 a json pre spracovávanie JSONu z OpenWeatherMap.
  • potrebujeme dve funkcie (load a urlopen), 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ť do load.
  • 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íte Hello 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)

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *