Autor sekcije: Vedran Miletić

Osnovna sintaksa programskog jezika Python

  • Greg Stein u prezentaciji Python at Google kaže:
    • Google’s programming environment
      • Primary languages: C++, Java, Python
    • Python at eShop:
        1. “What in the world is Python?”
        1. “This is great stuff.”
      • (eShop gets assimilated by Microsoft)
    • Python at Microsoft:
        1. “It’s called what?”
        1. “You actually shipped Python code?” (MerchantServer 1.0)
        1. “Nice prototype. We’ll rewrite it in the next version.” And they did, in C++.
    • Python at CollabNet (poznati kao autori Subversiona):
        1. “No, we don’t really use Python here.”
        1. “Definitely write that in Python.”
    • Python at Google:
        1. “Of course we use Python. Why wouldn’t we?” Python caught on here [at Google] like a virus, moving from developer to developer.
  • Programski jezik Python:
    • programski jezik visoke razine,
    • naglasak na čitljivost koda,
    • vrlo bogata standardna biblioteka,
    • sličan C/C++-u, Perlu, Javi, Rubyju, JavaScriptu,
    • referentna implementacija je CPython:
      • napisana u C-u,
      • višeplatformska,
      • dostupna pod slobodnom licencom,
      • interpreter (nema kompajliranja).
    • danas vrlo korišten u raznim domenama, od numeričkog računanja u kvantnoj fizici i poravnavanja sekvenci gena do poslovne logike i web aplikacija
  • Povijesni razvoj Pythona:
      1. verzija 0.9.0, Guido von Rossum na alt.sources,
      1. verzija 1.0, 1995. 1.2, 1996. 1.4, ...,
      1. verzije 1.6 i 2.0, Python razvojni tim napušta CNRI, interes za Python u zajednici otvorenog koda raste,
      1. verzija 3.0 poznata kao Python 3000 ili kraće Py3k, nekompatibilna s verzijom 2.0, promjene u sintaksi, izbačeni zastarjeli dijelovi.
  • Python 2 i Python 3 danas:
    • python == python2 == python2.7
    • python3 == python3.2
  • Python 2 i Python 3 u skoroj budućnosti:
    • python == python3 == python3.?
    • python2 == python2.7
  • koristit ćemo Python 3.4
    • pa recite da nismo moderni!
    • (i u trendu, in, otkačeni, kul i popularni)

Rad s Python interpreterom

  • interaktivni način rada

    • pokretanjem naredbe python3 dobivamo ljusku u koju možemo unositi naredbe
    • >>> unos naredbe
    • ... nastavak prethodnog retka
  • pokretanje programa pomoću interpretera

    • spremimo niz naredbi u datoteku s ekstenzijom .py i pokrenemo je interpreterom python3

    • zaglavlje je oblika

      #!/usr/bin/env python3
      
    • env traži python3 na sustavu; on bi mogao biti u /usr/bin, /usr/local/bin ili čak u /opt/python3/bin; autor skripte o tome ne mora brinuti

  • Unicode

    • Python 3 ga koristi u zadanim postavkama

    • kod Pythona 2 potrebno eksplicitno navesti u drugom retku zaglavlja

      #!/usr/bin/env python
      # -*- coding: utf-8 -*-
      
  • Python dokumentacija

    • vrlo detaljno i kvalitentno napisana, i mnogo ćemo je koristiti; možete je koristiti na kolokviju
    • naročito važni Tutorial i Library Reference
  • dinamički tipovi (engl. dynamic typing) – nema deklaracije tipa varijable, određuje se prema pridruženoj vrijednosti

    a = 3
    b = "rijec"
    
    // ekvivalentan C++ kod
    int a = 3;
    char* b = "rijec";
    
  • tipovi (klase) varijabli

    • objektno orjentiran jezik: svaka varijabla je objekt
    type() # vraća tip (klasu) objekta
    
  • osnovni tipovi varijabli

    • bool, int, long, float, complex
      • float je pandan C++-ovom float i double
    • nepromjenjivi: str, bytes, tuple, frozenset
      • str i bytes su pandani C++-ovom std::string i char*
      • tuple je pandan C++-ovim poljima
    • promjenjivi: list, set, dict, bytearray
      • list je pandan C++-ovom std::list i std::vector
      • set je pandan C++-ovom std::set
      • dict je pandan C++-ovom std::map
    • za svaki od tipova postoji istoimena funkcija (tzv. konstruktor) koja služi za stvaranje instanci klase i pretvaranje među različitim tipovima
  • osnovni operatori

    • =, +, -, *, **, /, //, %
    • pridruživanje, zbrajanje, oduzimanje, množenje, potenciranje, dijeljenje, cjelobrojno dijeljenje, modulo dijeljenje
  • “hello world”: funkcija print() vrši ispis na ekran

    print("Pozdrav Rijeci")
    
    // ekvivalentan C++ kod
    #include <iostream>
    using namespace std;
    
    int main ()
    {
      cout << "Pozdrav Rijeci" << endl;
      return 0;
    }
    
  • sustav pomoći help() – interpreter ima u sebi ugrađenu dokumentaciju

    help(xyz) # pomoć za funkciju xyz()
    help("xyz") # pomoć na temu xyz
    

Rad s ljuskom IPython

Ljuska IPython proširuje funkcionalnost osnovnog intepretera.

  • <Tab> kompletira uneseni niz znakova do imena naredbe/varijable/funkcije/tipa/modula, dvostruki <Tab> nudi sve mogućnosti (isto kao u ljusci bash).
  • help(modul/funkcija/objektu) ili modul/funkcija/objekt? daje detaljne informacije o modulu/funkciji/tipu, koje su pored toga lijepo formatirane.

Napomena

Intrepreter ipython je moguće testirati i izravno u web pregledniku.

Podrška za Python u uređivaču teksta Emacs

Emacs u standardnoj distribuciji ima python.el koji mu omogućuje napredno baratanje Python kodom:

  • python-shift-left, C-c C-<: Decrease indentation of the region
  • python-shift-right, C-c C-<: Increase indentation of the region
  • python-switch-to-python, C-c C-z: Start (or switch) to a Python shell
  • python-send-buffer, C-c C-c: Run the current buffer in the Python interpreter
  • python-send-region, C-c C-r: Run the selected code in the Python interpreter
  • python-describe-symbol, C-c C-f: Get help on a Python symbol (Better than visiting the slow Python website, right?)

Zadatak

Napišite “hello world” program u Pythonu s pozdravom po želji, a zatim ga modificirajte kako je opisano.

  • Pokušajte spomenuti način ispisati i varijable tipa int i float.
  • Isprobajte na koji način radi ispis znakovnih nizova s našim znakovima.
  • Ostavite proizvoljan znakovni niz sam u svom retku i pokušajte pokrenuti program. Što se ispisuje na ekran kod pokretanja programa? Što se mijena kod interaktivnog načina rada?

Objektni pristup programiranju

  • atribut objekta je konstanta vezana uz objekt
  • metoda objekta je funkcija vezana uz objekt
  • funkcija dir() vraća popis atributa i metoda
a = 5 # varijabla a će dinamički postati tipa int
dir() # vraća popis atributa i metoda tipa int

Zadatak

U Pythonu se varijabli može pridružiti vrijednost kompleksnog broja na nekoliko načina, a najjednostavniji je a = 2+3j (naravno, vrijednosti 2 i 3 mogu se zamijeniti bilo kojim int ili float brojevima).

  • Pronađite način da ispište realni i imaginarni dio kompleksnog broja.
  • Pronađite način da ispište kompleksni konjugat tog broja. Objasnite koju razliku pravi par zagrada () nakon metode.

Naredbe if, else, for, while

  • Python zahtjeva točnu uvlaku koda; u protivnom, interpreter javlja grešku

    • nedostatak uvlake: IndentationError: expected an indented block
    • višak uvlake: IndentationError: unexpected indent
    • Emacs za Python uvlaku koristi 4 razmaka (preporučeno, PEP 8) i automatski pravilno uvlači pritiskom na tipku Tab
  • None – tip podataka ništa; (a nedefiniran) != (a = None)

  • True i False – boolean tip podataka; False su int(0), float(0.0), str(""), list([])

  • operatori and i or

  • naredbe if i else

    if x < 0:
      print("Negative")
    elif x == 0:
      print("Zero")
    else:
      print("Positive")
    
    // ekvivalentan C++ kod
    #include <iostream>
    using namespace std;
    
    int main ()
    {
      if (x < 0)
        {
          cout << "Negative" << endl;
        }
      else if (x == 0)
        {
          cout << "Zero" << endl;
        }
      else
        {
          cout << "Positive" << endl;
        }
      return 0;
    }
    
  • tip podataka range

    • funkcija range([start,] stop[, step]) vraća niz brojeva od start do step u koracima step
    • “početak uključen, kraj isključen” (prema idejama knjige C Traps and Pitfalls Andrewa Koeniga)
  • in označava iteraciju po “elementima” nekog objekta (liste, uređene n-torke, rječnika, ...)

  • naredba for

    for x in range(2, 7):
      print(x, x**2)
    
    // ekvivalentan C++ kod
    #include <iostream>
    using namespace std;
    
    int main ()
    {
      for (int x = 2; x < 7; x++)
        {
           cout << x << " " << x * x << endl;
        }
    }
    
  • naredba while

    x = 0
    while x < 5:
      x += 1
      print(x, x**2)
    
    // ekvivalentan C++ kod
    #include <iostream>
    using namespace std;
    
    int main ()
    {
      int x = 0;
      while (x < 5)
        {
           x++;
           cout << x << " " << x * x << endl;
        }
    }
    

Zadatak

Napišite program koji ispisuje:

  • sve neparne brojeve u rasponu od 1 do 101 (uključujući 101),
  • sve brojeve djeljive s 3 u rasponu od 5 do 45 (uključujući 45).

Rad sa znakovnim nizovima

  • Python koristi i jednostruke i dvostruke navodnike za navođenje znakovnih nizova

    • "...'...", '..."...' ili "...\"..."
    • mi ćemo koristiti dvostruke navodnike, s prekidnim znakom po potrebi
  • podnizovi znakovnih nizova rade po pravilu “početak uključen, kraj isključen”

    a[i] # i-ti znak u nizu; ista sintaksa kao C++
    a[i:j] # znakovi od i-tog do j-tog
    a[i:j:k] # svaki k-ti znak od i-tog do j-tog
    
  • str.strip() miče razmake s početka i s kraja

  • str.split() cijepa znakovni niz u listu po razmacima

  • str.lower()

  • str.upper()

Zadatak

Neka je a = "AndrewKoenig".

  • Isprobajte čemu je jednako, pa objasnite zašto za iduće podnizove:
    • a[1:5],
    • a[:3],
    • a[2:],
    • a[-3],
    • a[:-1],
    • a[1::2],
    • a[::-1].
  • Pretvorite a u listu (korištenjem funkcije list()) i spremite je u varijablu b. Dobivate li iste rezultate kada tražite podliste?

Zadatak

Neka je a = "Miami 2 Ibiza".

  • Pretvorite a u listu (korištenjem funkcije list()) i spremite je u varijablu b.
  • Pretvorite a u listu korištenjem metode split i spremite je u varijablu c.
  • Je li b jednako c? Objasnite zašto je ili zašto nije.

Rad s listama

  • ista sintaksa pristupanja pojedinom elementu kao kod znakovnih nizova
  • list.append() dodaje element na kraj liste
  • list.pop() miče element s kraja liste
  • list.insert() ubacuje element u listu na određeno mjesto

Zadatak

Neka je a = [1, "Bok", [24, 7, 365], ["Da", "Ne"]].

  • Isprobajte čemu je jednako, pa objasnite zašto za iduće podliste:
    • a[1],
    • a[2],
    • a[2][0],
    • a[2][4],
    • a[3][1].
  • Promijenite vrijednost elementa a[0] na 5.
  • Umetnite element “Swedish House Mafia” na mjesto 1.
  • Maknite element s kraja liste, a zatim na kraj liste umetnite listu koja sadrži brojeve 5, 4, 2.