Zadaci iz Python-a

Prof. dr Igor Dejanović (igord at uns ac rs)

Kreirano 2021-10-31 Sun 17:30, pritisni ESC za mapu, m za meni, Ctrl+Shift+F za pretragu

Sadržaj

1. Priprema

1.1. Instalacija editor-a

Instalirajte proizvoljan editor koji podržava Python. Npr. PyCharm ili VS Code.

1.2. Kreiranje i aktivacija virtualnog okruženja

Virtuelna Python okruženja služe za izolaciju instaliranih biblioteka po projektu.

Upotrebom venv modula kreirati i aktivirati virtualeno Python okruženje. Testirati instalacijom biblioteke textX sa PyPI:

python -m venv venv         # Po završetku ispitati sadržaj kreiranog venv foldera
source venv/bin/activate    # Na Windowsu venv\Scripts\activate.bat
pip install textx[cli]

Testirati da li je textX instaliran pozivom:

textx version

1.3. Instalacija paketa u razvojnom modu

pip omogućava instalaciju u razvojnom modu što je zgodno kada želimo da pratimo najsvežiju verziju iz nekog git repozitorijuma (npr. sa GitHub-a).

Klonirajte neki repozitorijum i instalirajte ga u tzv. editable modu za razvoj:

git clone git@github.com:pyflies/pyflies.git
pip install -e pyflies
pip list

Sa komandom pip list videćete da se kodu ovog paketa pristupa direktno iz kloniranog git repozitorijuma. Sada je moguće ažurirati paket upotrebom git-a:

cd pyflies
git pull

2. Liste, rečnici i fajlovi

2.1. Broj samoglasnika

Napisati funkciju koja transformiše listu reči u listu gde svaki element predstavlja broj samoglasnika iz originalne liste.

2.2. Akronim

Napisati funkciju koja kreira akronim (prva slova svake reči, kao velika slova) od zadate rečenice. Na primer: Fakultet tehničkih nauka -> FTN.

2.3. Rečnik iz fajla

Dat vam je tekstualni CSV fajl čije linije su oblika:

<reč>, <broj>

Na primer:

jabuka, 120
programiranje, 450
...

Napraviti funkciju koja za zadatu putanju do fajla vraća rečnik (dict) gde će ključevi biti reči a vrednosti odgovarajući brojevi iz datog fajla.

3. Klase i OOP

3.1. Properties

Kreirati klase Product sa atributima:

  • name - naziv proizvoda,
  • price - jedinična cena proizvoda,
  • discount - trenutno aktivan popust na cenu u procentima (npr. vrednost 10 znači 10% popusta). Podrazumevana vrednost je 0.

i klasu Stock sa atributima products koji će biti lista instanci klase ProductAmount. Klasa ProductAmount ima sledeće atribute:

  • product - referenca na instancu Product
  • amount - količina na lageru

Kreirati property discount_price nad klasom Product koji će da vraća vrednost sa uračunatim popustom.

Kreirati property total_value i total_discount_value nad klasom Stock koji vraća ukupnu vrednost lagera proizvoda bez i sa uračunatim popustom.

Napisati kod koji testira implementaciju.

3.2. Specijalne metode

Sortirati proizvode na lageru iz prethodnog zadatka po ceni:

  1. upotrebom sort i key
  2. upotrebom sort i definisanjem specijalnih metoda za poređenje u klasi Product

3.3. Translacije tačaka u ravni

Kreirati klasu Point sa atributima x i y. Omogućiti sabiranje instanci ove klase. Takođe, omogućiti poređenje tačaka po jednakosti.

Operacija + treba da vrati novu tačku sa koordinatama koje predstavljaju zbir odgovarajućih koorinata operanada. Odnosno:

a = Point(2, 4)
b = Point(3, 4)
assert a + b is not a
assert a + b == Point(5, 8)

Takođe implementirati sabiranje “u mestu” (operator +=) gde će rezultat izmeniti prvi operand, tj. obaviće translaciju za vrednost drugog operanda. Odnosno:

a = Point(2, 4)
x = a
b = Point(3, 4)
a += b
assert a == Point(5, 8)
assert a is x

Napisati test gde će lista tačaka biti translirana za isti vektor.

3.4. Polimorfizam kroz Duck typing

Proširiti prethodni zadatak uvođenjem klase Line koja sadrži dve tačke. Takođe omogućiti sabiranje sa tačkom (translaciju) sa operatorima + i +=.

Napisati test gde će lista koja sadrži i tačke i duži biti translirana za isti vektor. Prolazak kroz listu i translacija treba da se obavi kodom koji ne proverava tip elementa.

4. Struktura projekta

4.1. Konverzija iz rimskog u arapski brojni sistem

Napisati funkciju za konverziju iz rimskog brojnog sistema u arapski i obrnuto.

Omogućiti poziv konverzije sa komandne linije (CLI).

Napomena: Rešenje za Python postoji u vidu paketa roman. Probati uraditi samostalno. Uporediti svoje rešenje sa roman paketom.