Python (programski jezik)
Python je interpretni visokoravni večnamenski programski jezik, ki ga je ustvaril Guido van Rossum leta 1990. Jezik je dobil ime po priljubljeni angleški televizijski nanizanki Leteči cirkus Montyja Pythona (Monthy Python's Flying Circus). Python podpira dinamične podatkovne tipe, kar ga naredi drugačnega od npr. Jave ali družine C. Zaradi dinamičnih podatkovnih tipov je podoben jezikom Perl, Ruby, Scheme, Smalltalk in Tcl. Upravlja s pomnilnikom in podpira funkcionalen, imperativen oziroma proceduralen, strukturiran in objektno orientiran programski stil. Razvili so ga kot odprtokodni projekt, ki ga upravlja neprofitna organizacija Python Software Foundation. Pogosto uporabljene knjižnicePython ima že ob namestitvi nekaj knjižnic oz. modulov. To so skupki programske kode, najpogosteje funkcij, ki jih nato pisci kode uporabijo v svojih programih. Nekaj izmed teh je napisanih v jeziku C[6] za doseganje optimalnih časov pri klicanju in izvedbi funkcij. Navkljub dejstvu, da je Python večplatformski, standardni nabor knjižnic ni enak na Linuxu[7] ali Windowsu[8]. Primarne knjižnice standardnega nabora so math[9] – podpora matematičnih funkcij, sys[10] – za uporabo sistemskih funkcij in os[11] – za nadziranje funkcij operacijskega sistema.
Python je zaradi svoje preproste sintakse izredno preprost za uporabo. To omogoča programiranje tudi začetnikom. Je tudi odlika, ki veliko doprinese pri oblikovanju lastnih knjižnic. Knjižnice, ki niso v standardnemu naboru, so knjižnice t.i. 3. nabora (third party). Naložene so na portalu PyPi in jih uporabnik sam namesti. Med njimi najdemo veliko knjižnic za velik asortiment področij. Trenutno je na portalu več kot 670.000 projektov z več kot 7.000.000 verzijami.
Uporaba in namembnost Pythona v aplikacijahPython uporablja različna orodja za različne tipe aplikacij, saj vsebuje tako orodja za pripravo grafike kot matematični modul za izračunavanje... Med grafično orientiranimi moduli so najbolj pogosti tkinter, ki je tudi del standardnega nabora. Poznamo tudi PyQt5 za naravni izgled oken na Windowsih ter Kivy, posebej prilagojen za grafiko na telefonih sistema iOS in Android. Ima tudi orodja za razvijanje internetnih aplikacij, med najbolj pogosto uporabljena spadajo Django, ki ima svojo posebno knjižnico in deluje večinoma v relaciji s podatkovno bazo, Bottle, Flask, Tornado (orodje), web2py in Jade. Večina teh orodij mora uporabnik naložiti s spleta v intergrirano razvijalno okolje (Intergrated development enviroment, IDE). Zaradi preprostosti Pythona ga včasih uporabljajo za statistično-napovedovalne modele in programe, kot alternativo jeziku R. Med najpogosteje uporabljena analitična orodja spadajo SciPy, Pandas in Numpy. Večina analitičnih orodji je programiranih v jeziku C za optimalno delovanje in večplatformnega delovanja. Za razvijanje programske opreme pa se uporabljajo predvsem naslednja orodja: Buildbot, Trac in Roundup. Uporabljajo se tudi orodja za administracijo sistema, kot na primer: Ansible, Salt in OpenStack. Le-ti sistemi pa uporabljajo način MLA (multi language architecture, večjezična programska arhitektura), najdemo ga tudi v spletnih straneh[16]. Na področju umetne inteligence se Python uporablja zaradi preprostosti in velikega števila uporabnikov navkljub manjši hitrosti izvajanja. Uporabljajo ga NASA,[17] Pixar, Google, Facebook,[18] YouTube[19] in mnoge druge organizacije. Zmogljivost in težavePython je bil prvotno napisan za računalnike v 80. letih 20. stoletja, kjer so imeli večinsko samo enojedrne sisteme. Vse niti so tako delovale na enem jedru, ker računalnikov z več jedri preprosto ni bilo veliko. S časom pa so se pojavili računalniki z več jedri v CPE, katere še danes Python ne koristi zaradi t.i. GIL (Global Interpreter Lock). V naslednjih letih je pričakovano, da se bo GIL verjetno odstranil s pomočjo ti. podtolmačev, ki bi tolmačili vsak na svojem jedru ter komunicirali med seboj. Sicer pa se poraja vprašanje kakšen zmogljvostni vtis bo imela taka implementacija brez GIL na do sedaj napisane enojedrne Pythonove programe. Od verzije Python 3.13 se lahko onemogoči GIL.[20] Ker je Python sam po sebi relativno počasen bodisi zaradi GIL (Global Interpreter Lock), ki dovoli uporabo samo enega jedra na enkrat, bodisi zaradi dinamičnih tipov ali režije (overhead), ki ga povzročijo pri tekoči izvršitvi, se Python pogosto uporablja na visokonivojski plasti, ki kliče nižjenivojske funkcije, napisane v prevedenem jeziku kot na primer C. Tako povezavo med plastmi je možno doseči s standardno knjižnico Poleg glavne implementacije Pythonovega tolmača t.i. CPython, imamo mnoge druge implementacije, kot npr. PyPy, ki doda JIT (Just-in-time compiler), kar lahko za določen tip aplikacij močno pospeši hitrost programa za nekatere pa močno upočasni hitrost programa. Struktura Python projektaV splošnem se Python programi pišejo v Poleg shebang vrstice imamo tudi vrstico kodiranja, ki določa / namigne tolmaču kateri nabor znakov uporablja ta datoteka, npr: Če za modul / datoteko vemo, da se lahko uporablja kot vhodna točka programa, potem po konvenciji vanjo zapišemo sledečo kodo: # Deklaracije/definicije, tisto kar se lahko vnese v druge module
if __name__ == "__main__":
# Koda ki se izvršuje
pass
Tako ima lahko Python program več vstopnih točk, zaganjamo pa lahko samo eno na enkrat. Ponavadi se Python moduli nahajajo znotraj paketov ti pa znotraj t.i. virtualnih okolji. Virtualno okolje je kot svoj lasten Python za specifičen projekt katerega drugi projekti v splošnem ne vidijo (čeprav ga je možno deliti). Najbolj primitivno virtualno okolje (tj. samo tolmač s Za večji nadzor in ker ni praktično imeti celotnega Pythona v istem imeniku kot dejanski projekt so na voljo t.i. package managerji drugega nivoja na primer Poleg package managerjev drugega in prvega nivoja, virtualnih okolji in zgeneriranih datotek, se uporabljata še dve orodji – linter in formater. Linter je program, ki prebere kodo in strukturo projekta ter programerju vrne morebitne težave oziroma neupoštevanje določenim konvencijam, ki so se izkazale za dobre. Linte (težave) je možno zatreti za določen segment kode z raznimi lint direktivi. Najbolj popularen python linter je Formater je program, ki preoblikuje kodo da sledi raznim konvencijam. Npr. Program 'Pozdravljen svet'Python je znan po preprostosti kode, zato je eden izmed najbolj priljubljenih jezikov v zadnjem času[21] ter pri otrocih. Program je skoraj enak svoji psevdokodi, tj. besedilu, ki ga programerji pogosto naredijo med razmišljanjem o problemu. V Pythonu se tip niz ( # To bo izpisalo 'Pozdravljen svet', ta vrstica pa bo prezrta
print('Pozdravljen svet')
SpremenljivkeV svetu informatike spremenljivka predstavlja prostor, kamor se shrani neka vrednost. Spremenljivke lahko poimenujemo s poljubnim nizom alfanumeričnih znakov in podčrtajev, ampak ime se ne sme začeti s številko ali biti ena izmed rezerviranih besed. Definirajo se tako, da jih poimenujemo in jim dodelimo vrednost. V nasprotju z drugimi programskimi jeziki se spremenljivke same prilagodijo pravemu podatkovnemu tipu. Prevladujejo numerične, nizne in logične spremenljivke. Za preverjanje podatkovnega tipa uporabimo funkcijo pozdrav = "Živjo" # niz (string)
denar = 100 # celo število (integer)
povprečje = 12.699 # decimalno število (float)
jeVesel = True # boolean (True ali False), lahko ju tudi izrazimo z 1(True) ali 0(False)
kompleksno_število = 2+5j # kompleksno število (complex)
nič = None # ničelni podatkovni tip (NoneType) ta tip je poseben, saj nima dejanske vrednosti.
seznam = [1, 2, 3] # seznam (list)
slovar = {"Ana": "041 310239", "Berta": "040 318319"} # slovar (dict)
terka = (1, 2, 3) # terka (tuple)
print(type(pozdrav)) # ali katerokoli drugo že definirano spremenljivko
Tudi objekti, definirani s strani uporabnika, se štejejo kot tip spremenljivke, npr. x = "Danes je oblačno"
print(x[3]) # izpiše črko "e", saj Python začne vedno šteti z 0.
print(x[5:]) # izpiše " je oblačno", saj izreže vse pred 5 (šteje se tudi presledek)
print(x[:4]) # izpiše "oblačno", saj izreže vse po 4.
print(len(x)) # izpiše dolžino besede shranjene v spremenljivki x. Izpiše '16'.
print(x[:-3]) # izpiše "a", saj kadar uporabimo znak minus (-), začne šteti od desne proti levi.
Dostopnost spremenljivke[23]
Poznamo 3 stopnje dostopnosti spremenljivke. To so ime = 'Janez'
# Spremenljivka ime je globalna
def pozdravi():
pozdrav = 'Dober dan' # Spremenljivka je lokalna
print(pozdrav)
print(pozdrav) # Vrne napako
# Primer upoerabe spremenljivke z statusom nonlocal
def pozdravi_z_imenom():
pozdrav = 'Dober dan'
def ime():
nonlocal ime
ime = 'Marija'
print(ime)
print('{}, {}'.format(pozdrav, ime))
Funkcije Niz ali stringV računalniškem svetu je string ali niz zaporedje črk ali znakov v obliki spremenljivke ali izhodne sekvence. V Pythonu je niz spremenljiv ali v velikosti ali v vsebini. Definiran je kot matrica bajtov, ki shranijo posamezen sekvenčni del oziroma črko glede na črkovno notacijo. V sebi lahko v obliki niza nosi tudi druge podatkovne tipe, na primer cela števila ali nize podatkov. Konkatinacija niza[24]Konkatinacija ali zdrževanje niza se uporablja, kadar moramo združiti več manjših nizov (string) objektov v končni izpis. Pri tem se uporablja operator V Pythonu je konkatinacija niza izvedena ob času izvedbe programa in njeni rezultati niso znani vnaprej. V primeru absolutnega niza z izhodnimi sekvencami pa je rezultat konkatinacije niza znan že ob izgradnji programa v Pythonovem predpomnilniku. Velja tudi izjema pri več-vrstičnih nizih. Ti so označeni z x = "Pozdravljen"
y = "svet"
print(x + " " + y)
# Izpis konzole:
# Pozdravljen svet
# Primer prevoda podatkovnega tipa
jeŽalosten = False
kolikoLet = 100000
jeŽalosten = str(jeŽalosten)
kolikoLet = str(kolikoLet)
print("Ali si žalosten: " + jeŽalosten)
print("Koliko let imaš: " + kolikoLet)
# Izpis konzole:
# Ali si žalosten: False
# Koliko let imaš: 100000
# Primer večvrstičnega niza
print("""Rad imam
Python 3.8.""")
# Izpis konzole:
# Rad imam
# Python3.8
Za dva niza S1 in S2 je konkatinacija niza S1S2 sestavljena iz nizov v obliki ab, kjer je a del niza S1, w pa je del niza S2. To lahko izrazimo z . Velikokrat pa se znajdemo v primeru konkatinacije niza in samostojnega znaka. To pa lahko izrazimo z in . Osnovno formatiranje niza[25]Preprosto formatiranje niza je verjetno največkrat uporabljena oblika formatiranja in/ali konkatinacije niza. Uporabljamo ga v primeru enakega vrstnega reda parametrov v relativno majhnem obsegu združenih elementov. Zaradi dveh generacij Pythona (2 in 3), se je tudi način formatiranja spremenil. Tako poznamo stari in novi slog. Stari deluje tudi v 3. generaciji Pythona, novi pa ne deluje obratno. V novem slogu formatiranja Python kliče Formatiranje pa ne omogoča samo konkatinacije, ampak tudi poravnavo 2 nizov. Po privzetih parametrih formatiranje 2 nizov zavzame samo toliko prostora, kot ga potrebuje. V starem načinu je zamik desnosučni, v novem pa levosučni. Mogoča je uporaba vseh primitivnih podatkovnih tipov, pri številih z decimalno vejico pa jim moramo podati tudi število mest za vejico. x = 5
y = "Jure"
k = "Nina"
e = 2+3j
# prvi primer (novejši način)
print(y + " je vesel, saj je dobil oceno {}".format(x))
# ali pa uporabimo znak % (starejši način)
print(y + " je vesel, saj je dobil oceno %d"%x)
# V tem primeru funkcija 'format' spremeni vrednost vseh y, k, e vrednosti v niz. Vpiše jih v glavni niz objekt po vrsti z začetkom od 0 do 2
print("{0} in {1} sta skupaj rešila enačbo {2}".format(y, k, e))
# Tukaj je posebna vrsta niza, ki omogoča formatiranje niza med dejanskim nizom. Gre za novejši način.
print(f"{y} + {k} = {x} + {e}")
#Zamikanje besede z uporabo format funkcije, novejši način.
print('{:>10}'.format('test'))
Matematični operatorjiMatematični operatorji v Pythonu so posebni rezervirani simboli, ki izvedejo aritmetične ali logične operacije. Operatorji delujejo na operande. Operatorji se v Pythonu delijo na unarne in binarne. Poznamo aritmetične, logične, bitne in primerjalne operatorje. Python v izrazih sledi uporabi oklepajev in precedenci vseh operatorjev. Izračun se izvaja v času izvajanja programa (čeprav to ni nujno, določene stvari se lahko izračunajo pred izvajanjem zaradi konstantne narave), medtem ko se spremenljivke zapišejo že med izgradnjo programa. Med tekom kode procesor najprej izvede # Osnovne operacije
x + y # seštevanje
x - y # odštevanje
x * y # množenje
x / y # deljenje (zaokroženo na decimalno vrednost)
x // y # deljenje
x ** y # potenciranje (produkt x-ov y-krat)
x % y # modulo (ostanek pri deljenju)
# Primerjalni operatorji
x == y # primerjava
x > y # je večje
x < y # je manjše
x >= y # je večje ali je enako
x <= y # je manjše ali je enako
x != y # ni enako
# Logični operatorji
x = True
y = False
x and y # konjunkcija
x or y # disjunkcija
not y # negacija
# Bitni operatorji
x & y # bitni AND
x | y # bitni OR
~ x # bitna negacija
x ^ y # bitni XOR
x >> 2 # bitni desni premik
x << 2 # bitni levi premik
# Vse račune lahko shranjujemo v spremenljivke
a = 2 + 5 # shrani rezultat računa v spremenljivko a
print(x) # izpiše vrednost a
print(3 + 7 * 2) # Izpiše 17, ker ima množenje prednost
print((5 - 7) * 4) # Izpiše -8, ker ima operacija v oklepaju prednost
. Razlika med standardnimi in hitrimi operatorji[26]
Metoda # Hitre operacije namenjene dodelitvi vrednosti izraza v konjunkciji z drugo spremenljivko
x += y # dodelitev seštevka (ekvivalent x = x + y)
x -= y # dodelitev odštevka (ekvivalent x = x - y)
x *= y # dodelitev zmnožka (ekvivalent x = x * y)
x /= y # dodelitev količnika zaokroženega na najbližjo celoštevilsko vrednost (ekvivalent x = x / y)
x //= y # dodelitev količnika (ekvivalent x = x // y)
x **= y # dodelitev produkta x-ov y-krat (ekvivalent x = x ** y)
x %= y # dodelitev ostanka pri deljenju (ekvivalent x = x % y)
x <<= y # ekvivalent x = x << y
x >>= y # ekvivalent x = x >> y
x &= y # ekvivalent x = x & y
x |= y # ekvivalent x = x | y
x ^= y # ekvivalent x = x ^ y
Definiranje operatorjev znotraj objektov[27]
Definiranje operatorjev znotraj objektov pomeni dodajanje nove funkcionalnosti operatorju. Operator class A:
def __init__(self, parameter):
self.parameter = parameter
#Definiramo "drugačno" ozadje funkcije __add__
def __add__(self, other):
return self.parameter + other.parameter
obj1 = A('Janezek')
obj2 = A('Micka')
print(obj1 + obj2)
# Konzola izpiše: JanezekMicka
Kolektivni podatkovni tipiPython pozna kar nekaj tipov spremenljivke, s katerimi lahko interpretiramo oz. integriramo množice. To so Nespremenljiv pomeni, da množici vrednosti programsko ne moremo dodati ene ali več vrednosti. Vrednosti znotraj množice ponavadi vsebujejo več tipov spremenljivk, z dodajanjem Vsi kolektivni tipi, razen Spremenljivke v kolektivnih tipih niso prave instance njihovih baznih objektov, ampak so to referenčne točke, ki vodijo do njihovega izvora[28]. Zato je velikost množice odvisna od števila elementov in ne od velikosti objektov. Čas iteracije skozi celoten seznam je ne glede na dolžino enak , čas dodajanja pa je konstanta. znamke = ["Ferrari", "BMW", "Honda", "Alfa"] # To je list z 4 vrednostmi enakega tipa podatkov
vse = (0, "Vito", 44, True, None, "Živjo", 2.44) # To je tuple, ki lahko vsebuje katerikoli tip podatka
tabela_ocen = {"Miha":4, "Jure":2, "Jaz":5, "Nekdo":1, "Maja":4, "Nina":3} # To je dict vsebuje key and value. Key so v tem primeru imena, vsako ima svojo oceno torej value. Torej tuple ima key=string in value=intiger podatke.
# vse podatke lahko izpišemo s print funkcijo
print(znamke)
print(vse)
print(tabela_ocen)
print(type(znamke))
print(type(vse))
print(type(tabela_ocen))
# Izpis konzole:
# ['Ferrari', 'BMW', 'Honda', 'Alfa']
# (0, 'Vito', 44, True, None, 'Živjo', 2.44)
# {'Miha':4, 'Jure':2, 'Jaz':5, 'Nekdo':1, 'Maja':4, 'Nina':3}
# <type 'list'>
# <type 'tuple'>
# <type 'dict'>
Urejanje kolektivnih podatkovnih tipovČasovna kompleksnost dodajanja elementov[29] k listi je ublaženi . Če imamo Prvih 8 elementov je potisnjenih v , 9. sproži relokacijo in odpre ostalim 8 dostop v . V 17. iteraciji se sproži relokacija 16 prejšnjih členov in 15 novih členov pride v . 33. ponovitev zanke sproži novo relokacijo 32 prejšnjih členov in v pride 17 novih. Po vseh relokacijah imamo časovno kompleksnost , v kateri je 56 kopij in 3 realokacije v , za . Če upoštevamo, da je to geometrijska serija je to asimptotično enako za n = končna velikost seznama. To pomeni, da je celotna operacija potiskanja n predmetov na seznam . Če to amortiziramo na element, je . Če je seznam dolg, pa se lahko časovna kompleksnost poveča tudi na . x = ["A", "B", "C", "D"]
print(x[2])
# konzola izpiše C saj se list začne šteti z 0
# da dodamo vrednost listu uporabimo metodo append
x.append("E") # to doda x listu na konec vrednost "E"
# da odstranimo vrednost listu uporabimo metodo pop
x.pop(1) # izbriše drugo vrednost na listu v tem primeru "B"
print(x)
# konzola izpiše
['A', 'C', 'D', 'E']
# če nevemo katero število pripada določeni vrednosti na listu uporabimo metodo count
št_a = x.count("A")
print(št_a) # izpiše 0 saj je a na prvem mestu.
# Kolektivne podatkovne tipe je mogoče tudi gnezditi.
j = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# Spremenljivka je list listov torej če uporabimo enonivojsko klicanje podatkov preko [] operatorja
print(j[0]) # Izpiše [1, 2, 3]
# Do dostopamo do notranje vsebine recimo števila 5
print(j[1][1]) # Izpiše 5
Za vsak kolektivni podatek obstaja vsaj 5 metod. VnosVnos se izraža z dvema vgrajenima funkcijama # primer raw_input keyworda
x = raw_input("Vnesi svoje ime: ")
print("Pozdravljen " + x + "!")
print("Dolžina tvojega imena je {}".format(len(x))) # len() keyword se uporablja pri ugotavljanju dolžine določene besede
# primer input keyworda
y = input("Vnesi svoje ime: ") # Ekvivalent starejši raw_input
k = int(input("Vnesi svojo starost: "))
print("Tvoje ime je " + y)
print("Star si {}".format(k)) # intiger tipe vedno formatiramo saj se jih ne more konkatinirati s string, razen v primeru prevoda podatkovnega tipa.
Pogojni stavkiPogojni stavki se uporabljajo predvsem za zastavljanje pogojev skozi katere mora neka vrednost priti, da se nekaj izvaja. Izraža se jih s ključnimi besedami # Primer if-elif-else stavka
barva = input("Vnesi svojo najljubšo barvo: ")
if barva == "rdeča" or barva == "modra":
print("Zelo lepo")
elif barva == "zelena" or barva == "rumena":
print("Lepo")
elif barva == "črna" or barva == "bela" or barva == "roza":
print("Ne najbolje")
elif barva == "rjava" or barva == "oranžna" or barva == "lila":
print("Slaba izbira")
else:
print("Ne poznam te barve")
# Primer if-else stavka
s = int(input("Prosim vnesi svojo starost: "))
if s < 18:
print("Dostop ni dovoljen.")
else:
print("Dobrodošli")
# Matematični primer
if 9 + 1 == 10:
print("Pravilno")
elif 9 + 1 != 10:
print("Narobe")
# Primer nested stavka
c = input("Vnesi črko: ")
k = int(input("Vnesi številko: "))
if c in ['A','B','C','D','E','F']:
if k > 50:
print("Uspešno")
elif k <= 40:
print("Skoraj uspešno")
else:
print("Ni uspešno")
elif c in ['K','L','M','N','O']:
print("Bravo zmagal si")
elif len(c) < 1 and len(c) > 1:
print("Moraš vpisati natanko eno črko")
else:
print("Napaka")
# Primer walrus operatorja v 'while' zanki
while (n := int(input("Vnesi število (0 za konec): "))) != 0:
print(f"Vnesel si {n}")
print("Konec")
# Brez walrus operatorja bi koda izgledala tako
n = int(input("Vnesi število (0 za konec): "))
while n != 0:
print(f"Vnesel si {n}")
n = int(input("Vnesi število (0 za konec): "))
print("Konec")
# Primer match stavka
c = "Žaba"
def zvok():
match c:
case "Žaba": return "Reganje"
case "Pes": return "Lajanje"
case _: return "Neznano" # Ekvivalent 'default' v ostalih jezikih (npr. Java, C)
print(zvok()) # vrne "Reganje"
ZankeZanke so ukazi, s katerimi lahko večkrat izvedemo nek del kode. V Pythonu poznamo 2 tipa zank: # Primer for zanke
pozdravi = ['Živjo', 'Zdravo', 'Pozdravljeni']
for x in pozdravi:
print(x)
# Ali pa
for i, x in enumerate(pozdravi):
print(i, x)
# Vrednost i in x sta razpakirana iz enumerate(pozdravi). 'i' je indeks elementa.
# Izpis konzole
# Živjo
# Zdravo
# Pozdravljeni
# 0, Živjo
# 1, Zdravo
# 2, Pozdravljeni
# Primer while zanke
p = "12345"
while True:
r = input("Vnesi geslo: ")
if r != p:
print("Napačno Geslo")
elif r == p:
print("Dobrodošli")
# Izpis konzole
# Vnesi geslo: 54321
# Napačno Geslo
# Vnesi geslo: 12345
# Dobrodošli
ModuliVsaka Python datoteka predstavlja natanko en modul. Modul lahko vpeljemo v drug modul s stavkom Denimo, da imamo sledeči Python datoteki v istem imeniku (direktoriju). pozdravi.py: def reči_živjo(ime):
print(f"Živjo {ime}")
glavni.py: import pozdravi as p
x = "Anastazija", "Špela", "Marija"
for w in x:
p.reči_živjo(w)
# izpis konzole
# Živjo Anastazija
# Živjo Špela
# Živjo Marija
Vsi stavki PaketiPaket (angl. package) je skupek modulov v nekem direktoriju. Minimalni Python paket ustvarimo če imamo v nekem direktoriju datoteko FunkcijeFunkcija je del kode, ki se izvede, ko jo kličemo. Z uporabo funkcij se izognemo večkratnemu ponavljanju iste kode, hkrati pa izboljšamo njeno berljivost. V funkcijo lahko podamo vhodne podatke, imenovane parametri ali argumenti, s katerimi funkcija lahko operira. Pogosto nam funkcija tudi vrne izhodne podatke. Funkcije lahko gnezdimo. Funkcije lahko podajamo kot parametere, saj so samo kazalci na različne lokacije pomnilnika ter tako z njimi formiramo sintaktični sladkor, funkcijske dekoratorje (poznamo namreč tudi razredne dekoratorje). Anonimne funkcije se imenujejo lambde. Definiramo jih z besedo # Primer gnezdene funkcije
def a():
def b():
print(42)
b()
print(88)
a() # Izpiše: 42 in v novi vrstici 88
b() # Napaka: ta funkcija je definirana v resoluciji a()-ja ne v globalni resoluciji
# Primer funkcije podane kot parameter
def a(fn):
print("kličem fn()")
fn()
def b():
print("v b()")
a(b) # Izpiše : "kličem fn()" nato pa še "v b()" v novi vrstici
# Zgornje se lahko zapiše s funkcijskim dekoratorjem sledeče, vendar je bolj pogosto, da
def a(fn):
def wrapper():
print("kličem fn()")
fn()
wrapper()
@a
def b():
print("v b()")
b() # Izpiše "kličem fn()" nato "v b()" v novi vrstici
@a
def c():
print("v c()")
c() # Izpiše "kličem fn()" nato "v c()" v novi vrstici
def seštej(x, y):
print("Rezultat = {}".format(x + y))
seštej(2, 4) # klic funkctije
# izpis
6
# Funkcija Seštej je ubistvu tako miniaturna, da jo lahko zapišemo kot lambdo
seštej = lambda x, y: x + y
print(seštej(2, 4)) # Izpiše 6
# primer funkcije brez parametrov
def zahtevaj_vpis():
uporabniško_ime = input("Vnesi uporabniško ime: ")
geslo = input("Vnesi geslo: ")
if len(geslo) < 6:
print("Geslo more vsebovati več kot 6 znakov")
else:
print("Dobrodošel uporabnik {}".format(uporabniško_ime))
# primer funkcije s poimenovanimi parametri
# če drugi argument ni podan, se upošteva y=1
def inkrement(x, y=1):
return x+y
# primer funkcije s pozicijskimi parametri
def odštej(a, b):
return a-b
število = 3
rezultat = inkrement(3)
print("3 + 1 = " + str(rezultat))
print("5 - 7 = " + str(odštej(5, 7)))
# izpis konzole
3 + 1 = 4
5 - 7 = -2
Funkcijo lahko pokličemo tudi v drugi funkciji saj so vse funkcije globalne. Z izjemo metod definiranih v UDR. def pozdravi(ime):
print("Živjo "+ime)
def vprašanje():
i = raw_input("Vnesi ime: ")
pozdravi(i)
vprašanje()
# izpis konzole
Vnesi ime: Nekdo
Živjo Nekdo
Podatkovni tip parametrov je lahko namignjen z ti. angl. type hinting-om vendar to *ne* zagotovi deklariranega tipa (oz. statičnega tipkanja) in je samo v pomoč IDE okoljem pri indeksiranju knjižnice. def odštej(a:int, b:int):
print("{}".format(a + b))
def prepoznaj_tip(t:(list, dict))
if type(t) is type(list):
print("Tip je list")
elif type(t) is type(dict):
print("Tip je dict")
else:
print("Tip ni prepoznan")
Primeri Funkcij import time
def štej(od, do, zamik=0.5):
while od < do:
od = od + 1 # ali pa z uporabo hitrega operatorja od += 1
print(od)
time.sleep(zamik) # ustavi izvajanje za zamik sekund
def vnos():
ime = input("Vnesi ime: ")
priimek = input("Vnesi priimek: ")
print(f"Pozdravljen {ime} {priimek}")
# tukaj se uporablja ti. nested funkcije pri kateri je lahko funkcija v funkciji
def kalkulator():
def seštej(x, y):
return x + y
def odštej(x, y):
return x - y
def množi(x, y):
return x * y
def deli(x, y):
return x / y
def potenciraj(x, y):
return x ** y
def moduliraj(x, y):
return x % y
print("Izberi možnost")
print("Seštevanje = 1")
print("Odštevanje = 2")
print("Množenje = 3")
print("Deljenje = 4")
print("Potenciranje = 5")
print("Moduliranje = 6")
o = str(input("Izbira: "))
p = int(input("Prvi: ")
d = int(input("Drugi: ")
if o == "1":
seštej(p, d)
elif o == "2":
odštej(p, d)
elif o == "3":
množi(p, d)
elif o == "4":
deli(p, d)
elif o == "5":
potenciraj(p, d)
elif o == "6":
moduliraj(p, d)
else:
print("Neznana operacija.")
kalkulator()
# izpis konzole
Izberi možnost
Seštevanje = 1
Odštevanje = 2
Množenje = 3
Deljenje = 4
Potenciranje = 5
Moduliranje = 6
Izbira: 2 # jaz napisal 2
Prvi: 10
Drugi: 4
# izpis funkcije
6
KontekstiKonteksti so deli kode, v katerih se določene surovine inicializirajo in deinicializirajo avtomatično. Kontekste se definira z ti. # Primer brez branja datoteke konteksta
fp = open("datoteka.txt", "rt")
vsebina = fp.read()
print(vsebina)
fp.close()
Medtem ko se z kontekstom lahko s pomočjo with open("datoteka.txt", "rt") as fp:
vsebina = fp.read()
print(vsebina)
# fp.close() ni potreben saj bo kontekstni upravljavec sam zaprl datoteko.
Kontekste je možno tudi gnezditi ali pa jih inicializirati več na istem nivoju. DekoratorjiFunkcije ter razrede lahko dekoriramo z dekoratorjem tik nad definicijo funkcije oz. razreda z IteratorjiVsak kolektivni podatkovni tip lahko spremenimo v iterator z vgrajeno funkcijo ime = "Anastazija"
ime_iterator = iter(ime)
assert next(ime_iterator) == "A" # propade če prva črka ni A.
GeneratorjiGeneratorji so funkcije, ki lahko začasno prekinejo delovanje nato pa nadaljujejo. Delovanje se prekine z rezervirano besedo def naravna_stevila():
num = 0
while True:
yield num
num += 1
Vsak klic zgornje generatorske funkcije vrne število za 1 večje od prejšnjega.
Možno je konstruirati generator generatorjev itd. veliko uporabnih funkcij najdemo v standardni knjižnici RazrediRazredi lahko vsebujejo funkcije. Funkcije v razredu se imenujejo metode. Razrede se inicializira tako da dobimo novo instanco z # glavni razred
class A:
def __init__(self): # klic konstruktorja
print("Inicializeran razred A")
# podrazred
class Z(A):
def __init__(self):
super(Z, self).__init__(A) # klic superkonstruktorja
class U(Z, A):
def __init__(self, m1, m2):
super(Z, U, A, self).__init__(m1, m2) # klic superkonstruktorja s parametri
# primer nelogičnega oziroma nepravilnega razreda
class B:
def __init__(self):
pass
# novo definirane globalne spremenljivke v razedu B
B.ime = "Tone"
B.priimek = "Altgr"
r = B.ime # objekte in njihove člane lahko shranjujemo v spremenljivke
print(r)
# primer razreda za osebe
class Oseba:
def __init__(self, ime:str, priimek:str, starost:int, email:str):
self.ime = ime # če damo pred objek parameter self lahko dostopamo do njegovih atributov
self.priimek = priimek
self.starost = starost
self.email = email
podatki = [[], []] # multidimenzionali list
podatki[0].append(ime)
podatki[0].append(priimek)
podatki[1].append(starost)
podatki[1].append(email)
def zahtevaj_podatke(self): # funkcija za klic izpisa podatkov na formatni način
print("Ime: {}".format(self.ime))
print("Priimek: {}".format(self.priimek))
print("Starost: {}".format(self.starost))
print("Email: {}".format(self.email)
def zahtevaj_dimenzije(self):
print(podatki)
Jaz = Oseba("Null", "PError", 15, "[email protected]")
# Jaz postane Object Oseba z določenimi člani npr. ime. ter metodami za interpretacijo objekta ali postaktivnost tega objekta oziroma njegovih članov.
Jaz.zahtevaj_podatke()
# izpis konzole
Ime: Null
Priimek: PError
Starost: 15
Email: abc.PError@unknow.abc
# ali
print(Jaz.ime) # . pomeni član nekega kolektiva v razredu.
print(Jaz.priimek)
print(Jaz.starost)
print(Jaz.email)
Referenčna izvedbaCPython je referenčna izvedba Pythona. Napisano je v jeziku C, ki ustreza standardu C89 z več izbranimi funkcijami C99 (s poznejšimi različicami C se šteje za zastarele;[30] CPython vključuje lastne razširitve C, vendar razširitve drugih proizvajalcev niso omejene na starejše različice C, lahko jih npr. Implementiramo s C11 ali C++). Program Python prevede v vmesno bajtno kodo, ki jo nato izvede navidezni stroj.[31] CPython je razdeljen z veliko standardno knjižnico, napisano v mešanici C in domačega Pythona. Na voljo je za številne platforme, vključno z operacijskim sistemom Windows (začenši s Python 3.9, namestitveni program Python se namenoma ne namesti v operacijski sistem Windows 7 in 8; Windows XP je bil podprt do Python 3.5) in v večini sodobnih sistemov, podobnih Unixu, vključno z macOS (in Apple M1 Mac, od Pythona 3.9.1, z eksperimentalnim namestitvenim programom) in neuradno podporo za npr VMS.[32] Prenosljivost platforme je bila ena njegovih prvih prioritet, v časovnem okviru Python 1 in 2 sta bila podprta celo OS/2 in Solaris; podpora je od takrat opuščena za številne platforme.[33] Generatorji dokumentacije APIOrodja, ki lahko ustvarijo dokumentacijo za Python API, so med drugim pydoc (na voljo kot del standardne knjižnice), Sphinx, Pdoc in njegove vilice, Doxygen in Graphviz.[34] Zunanje povezave
Sklici
|