Preskoči na sadržaj

Programiranje i programski jezik Python

Motivacija:

Python je programski jezik visoke razine opće namjene. Odlikuje ga jednostavnost učenja i čitljiv kod. Može se primijeniti u raznim područjima poput podatkovne znanosti, velikih podatka, testiranja, automatizacije, strojnog učenja, računalnih i mobilnih aplikacija i drugo. Nudi brzu izradu prototipa, jasnu sintaksu, veliki ekosustav biblioteka i podršku za više platformi.

Preduvjeti

Jupyter Notebook projekt je otvorenog koda koji omogućuje jednostavno kombiniranje Markdown teksta i izvršnog Python izvornog koda na jednom platnu koje se zove bilježnica. Visual Studio Code podržava rad s Jupyter Notebooks izvorno i putem Python kodnih datoteka.

Ukoliko nemate instaliranu jezgru IPythona, možete je instalirati naredbom:

pip install -U ipykernel

Osnovna sintaksa

U VS Codeu stvorimo novu praznu Jupyter bilježnicu kombinacijoom tipki (Ctrl+Shift+P) i u paleti naredbi odaberite Jupyter Notebook: Create New Blank Notebook. Ova opcija stvara novu bilježnicu ekstenzije .ipynb.

U izvršnjoj ćeliji (engl. execute cell) napišimo i pokrenimo sljedeće:

print("Hello, World!")

Zadatak

Ispiši svoje ime i prezime na ekran.

Komentari

Komentari se označavaju znakom # i protežu se do kraja linije. Oni imaju ulogu opisivanja dijelova koda radi lakšeg razumijevanja i ne izvršavaju se tijekom izvođenja programa.

# Program koji ispisuje Hello, World! na ekran
print("Hello, World!") # Još jedan komentar
# Treći komentar
print("# Ovo nije komentar jer se nalazi unutar navodnika!")

Python omogućava korištenje komentara i kroz nekoliko linija programskog koda. Takvi komentari počinju i završavaju s tri dvostruka navodnika""":

"""Ovo je komentar
koji se proteže
kroz nekoliko
linija koda"""

Varijable

Varijable u programu čuvaju vrijednosti i omogućuju pristup tim informacijama iz različitih dijelova koda. Možemo ih zamisliti kao "kutije" u koje pohranjujemo vrijednosti, koje zatim možemo koristiti, mijenjati ili pridruživati drugim varijablama.

Pridruživanje vrijednosti varijabli vrši se pomoću operatora =. Nazivi varijabli trebali bi logički odražavati pohranjenu vrijednost. Na primjer, varijablu koja sadrži zbroj brojeva prikladnije je nazvati zbroj nego umnozak.

varijabla = 5
print(varijabla)

Zadatak

Spremi svoje ime i godine u varijable te ispiši podatke na ekran. Na primjer, Iva ima 25 godina.

Napomena: kada u funkciji print() želimo ispisati više varijabli odvojit ćemo ih zarezom.

Aritmetički operatori

Python podržava nekoliko aritmetičkih operatora za rad s brojevima. U nastavku je prikazana tablica koja sadrži popis dostupnih aritmetičkih operatora:

Operator Namjena Primjer Rezultat, a = 10; b = 5
+ Zbrajanje (engl. addition) x = a + b x = 15
- Oduzimanje (engl. subtraction) x = a – b x = 5
* Množenje (engl. multiplication) x = a * b x = 50
/ Dijeljenje (engl. division) x = a / b x = 2
% Ostatak dijeljenja (engl. modulus) x = a % b x = 0
** Potenciranje (engl. power) x = a ** b x = 100 000
// Cjelobrojno dijeljenje (engl. flor division) x = a // b x = 2

Pored prethodno navedenih aritmetičkih postoje i skraćene verzije operatora pridruživanja:

Operator Primjer Osnovni oblik Rezultat, a = 10; b = 5
+= a += b a = a + b a = 15
-= a -= b a = a – b a = 5
*= a *= b a = a * b a = 50
/= a /= b a = a / b a = 2
%= a %= b a = a % b a = 0
**= a **=b a = a ** b a = 100000
//= a //= b a = a // b a = 2
= a = b a = b a = 5

Zadatak

  1. U varijable imena po izboru spremi dva broja te na ekran ispiši njihov zbroj i umnožak.
  2. Napiši zbroj i umnožak iz prethodnog zadatka koristeći se skraćenim verzijama operatora pridruživanja.

Operatori usporedbe

Operatori usporedbe uspoređuju vrijednosti s obje strane operatora i određuju rezultat usporedbe. Oni vraćaju vrijednosti 0 (netočno, engl. false) ili 1 (točno, engl. true). Često se koriste za kontrolu toka programa, posebno u uvjetima koji provjeravaju točnost rezultata logičkih operatora.

Operator Opis Primjer Rezultat, a = 5; b = 10
== Usporedba jednakosti a == b False
!= Usporedba nejednakosti a != b True
> Strogo veće od a > b False
< Strogo manje od a < b True
>= Veće ili jednako od a >= b False
<= Manje ili jednako od a <= b True

Naredba if

Naredba if pripada kontroli toka za odluke. U najjednostavnijem obliku ova struktura sastoji se od zaglavlja i tijela odluke. Ako je uvjet zadovoljen, izvršava se tijelo odluke, u suprotnom, tijelo odluke se neće izvršiti.

Proučite primjere ispod i razmislite što će se ispisati na ekran:

a = 15
b = 200
if b > a:
    print("b je veće od a")
a = 15
b = 15
if b > a:
    print("b je veće od a")
elif a == b:
    print("a i b su jednaki")
a = 200
b = 15
if b > a:
    print("b je veće od a")
elif a == b:
    print("a i b su jednaki")
else:
    print("a je veće od b")

Zadatak

  1. Ispišite "1" ako je a jednako b, "2" ako je a veće od b, inače ispišite "3". Dodijelite vrijednosti varijblama po želji.
  2. Ispišite "Uvjet je zadovoljen" ako je a jednako b ili ako je c jednako d. Dodijelite vrijednosti varijblama po želji.

Biblioteka NumPy

NumPy je biblioteka za programski jezik Python koja pruža podršku za rad s višedimenzionalnim nizovima i matricama, zajedno s kolekcijom matematičkih funkcija za rad s tim strukturama podataka. Iako u Pythonu imamo liste koje funkcioniraju kao nizovi, rad s njima je spor u odnosu na druge programske jezike. NumPy koristi objekt niza koji se naziva ndarray i nudi mnogo funkcionalnosti koje olakšavaju rad s nizovima.

Ako već imate instaliran Python i pip, tada je instalacija NumPyja vrlo jednostavna:

$ pip install numpy

Da biste pristupili NumPy-u i njegovim funkcijama, potrebno ga je uvesti u svoj Python kod:

import numpy as np

Skraćujemo uvođenje imena na np kako bismo poboljšali čitljivost koda koji koristi NumPy. Ova široko prihvaćena konvencija čini kod čitljivijim i jasnijim.

Nula-dimenzionalni niz

Nula-dimenzionalni (0D) nizovi predstavljaju pojedinačne brojeve ili skalare. Ovi nizovi nemaju dimenzije, što znači da su jednostavno pojedinačni elementi, a ne vektori, matrice ili višedimenzionalni nizovi.

import numpy as np

niz = np.array(1)

print(niz)

Jednodimenzionalni niz

Jednodimenzionalni (1D) niz je niz koji sadrži elemente poput uobičajenog niza ili vektora.

import numpy as np

niz = np.array([1, 2, 3, 4, 5, 6])

print(niz)

Dvodimenzionalni niz

Dvodimenzionalni (2D) niz predstavlja matricu koja se sastoji od redova i stupaca elemenata.

import numpy as np

niz = np.array([[1, 2, 3], [4, 5, 6]])

print(niz)

Ovaj niz ima dva retka i tri stupca. Svaki redak predstavlja jednodimenzionalni niz, a skup redaka tvori dvodimenzionalni niz.

Trodimenzionalni niz

Trodimenzionalni (3D) niz je skup elemenata organiziranih u tri dimenzije. To se može zamisliti kao skup dvodimenzionalnih nizova, stvarajući 3D strukturu podataka.

import numpy as np

niz = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])

print(niz)

Broj dimenzije niza možemo saznati pomoću atributa ndim, a ukupan broj elemenata u nizu pomoću size.

import numpy as np

a = np.array(1)
b = np.array([1, 2, 3, 4, 5])
c = np.array([[1, 2, 3], [4, 5, 6]])
d = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])

print(a.ndim)
print(b.ndim)
print(c.ndim)
print(d.ndim)

print(a.size)
print(b.size)
print(c.size)
print(d.size)

Jednostavno kreiranje niza

Osim stvaranja niza od već definiranog niza elemenata, možete jednostavno stvoriti niz ispunjen nulama ili jedinicama pomoću np.zeros(n), np.ones(n), gdje je n broj elemenata niza.

Zadatak

Kreirajte nula niz od 5 elemenata i niz ispunjen jedinicama od 3 elementa te ih ispišite na ekran.

Možete stvoriti niz s intervalom elemenata np.arange(n) ili niz s ravnomjerno raspoređenih intervala pri čemu ćete navesti prvi n i posljednji broj m te veličinu koraka k, np.arange(n, m, k).

Zadatak

  1. Kreirajte niz koji sadrži elemente u intervalu od 10 do 15 i ispišite ga na ekran.
  2. Kreirajte niz koji sadrži elemente u intervalu od 2 do 8 s veličinom koraka 2 i ispišite ga na ekran.
  3. Stvorite niz od 5 elemenata. Neka se ti elementi generiraju nasumično u rasponu od 50 do 100 (np.random.randint). Zatim izračunajte zbroj svih elemenata niza (np.sum), srednju vrijednost (np.mean) te razliku između najvećeg (np.max) i najmanjeg (np.min) elementa niza. Ispišite rezultate na ekran.

Pristup elementima niza

Za dohvaćanje određenog elementa niza koristi se indeksiranje. Indeksi počinju s 0, što znači da prvi element niza ima indeks 0 (niz[0]), drugi indeks 1 (niz[1]) i tako dalje.

Zadatak

  1. Kreirajte niz koji sadrži elemente u intervalu od 1 do 10. Pristupite prvom i drugom elementu niza te ih zbrojite.
  2. Pomoću negativnog indeksiranja pristupite zadnjem elementu niza.

Elementima niza možemo pristupiti i momoću definiranog intervala od interesa:

  • niz[1:5]
  • niz[3:]
  • niz[:5]
  • niz[1:9:2]
  • niz[-3:3:-1]

Za pristup elementima iz 2D nizova možemo koristiti cijele brojeve odvojene zarezima koji predstavljaju dimenziju i indeks elementa. Zamislite 2D nizove poput tablice s redovima i stupcima, gdje dimenzija predstavlja red, a indeks predstavlja stupac.

Zadatak

Kreirajte 2D niz oblika [[1,2,3,4,5], [6,7,8,9,10]] i pristupite drugom elementu prvog niza.

Elementima iz 3D nizova također pristupamo pomoću cijelih brojeva odvojenih zarezima koji predstavljaju dimenzije i indeks elementa.

Zadatak

Kreirajte 3D niz oblika [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]] i pristupite trećem elementu drugog podniza u prvom nizu.

Biblioteka Matplotlib

Matplotlib je biblioteka za stvaranje statičnih, animiranih i interaktivnih vizualizacija. Većina Matplotlib pomoćnih programa nalazi se pod podmodulom pyplot i obično se uvoze pod aliasom plt.

import matplotlib.pyplot as plt

Koristit ćemo funkciju plot() za crtanje točaka u dijagramu. Prema zadanim postavkama, funkcija crta crtu od točke do točke. Primjerice, želimo li iscrtati liniju od točke (1, 2) do točke (6, 8), moramo proslijediti dva niza [1, 6] i [2, 8] funkciji iscrtavanja:

import matplotlib.pyplot as plt
import numpy as np

xtocke = np.array([1, 6])
ytocke = np.array([2, 8])

plt.plot(xtocke, ytocke)
plt.show()

Zadatak

  1. Stvorite niz godine u intervalu od 1990. do tekuće godine i drugi niz broj_radova kojeg cete generirati slučajnim odabirom od 50 do 5 000. Neka je niz broj_radova iste veličine kao i niz godine. Nacrtajte grafički prikaz broja objavljenih radova po godinama.
  2. Izmjenite prethodini zadatak tako da grafičkom prikazu dodate odgovarajući naslov i oznake.
  3. Nacrtajte grafički prikaz broja objavljenih radova od 1980 do 2020 koji uključuju izraz "molecular dynamics" u naslovu, sažetku ili ključnim riječima. Analizu provedite korištenjem baze Web of Science. Dodajte odgovarajući naslov i godine.
  4. Nacrtajte grafički prikaz pojednostavljenog Lennard-Jonesovog potencijala:

    \[U_{LJ}(r) = 4 \epsilon [(\frac{\sigma}{r})^{12} - (\frac{\sigma}{r})^6]\]

    zajedno s njegovim pojedinačnim članovima. Za parametre \(\epsilon\) i \(\sigma\) uzmite vrijednost 1, a raspon udaljensoti na kojem će se prikazivati potencijal definirajte pomoću funkcije np.linspace() i uzmite vrijednosti od 1 do 3.

Author: Matea Turalija, Vedran Miletić