Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Kaj je ekosistem Pythona?

Marsikaterega bralca beseda ekosistem zmoti/zmede. Slovar slovenskega knjižnega jezika danes pozna samo rabo v povezavi z ekologijo. V računalništvu pa se v zadnjih desetletjih beseda ekosistem uporablja tudi v kontekstu t. i. digitalnega ekosistema; v primeru Pythona to pomeni vso množico različih paketov (samo pypi.org trenutno hrani več kot 685 tisoč različnih paketov), ki temeljijo na programskem jeziku Python in so med seboj povezani.

Ekosistem Pythona je veliko več kot pa samo programski jezik Python! Ta knjiga se v okviru prvih štirih predavanj osredotoča na tisti del tega ekosistema, ki je zanimiv in koristen predvsem za inženirske poklice.

Python je visokonivojski programski jezik, z visokim nivojem abstrakcije. Nizkonivojski programski jeziki, v nasprotju, imajo nizek nivo abstrakcije (npr. strojna koda).

Poglejmo si izračun Fibonaccijevega števila, ki sledi definiciji:

F1=F2=1inFn=Fn−1+Fn−2.F_1 = F_2 = 1\qquad\textrm{in}\qquad F_n = F_{n-1} + F_{n-2}.

Izračun FnF_n v strojni kodi: Strojna koda

MASM koda MASM koda

C

int Fibonacci(int n)
{
   if ( n == 0 )
      return 0;
   else if ( n == 1 )
      return 1;
   else
      return ( Fibonacci(n-1) + Fibonacci(n-2) );
} 

Python

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
[16, 25]

Python omogoča visok nivo abstrakcije in zato abstraktno kodo. Sedaj si bomo pogledali primer kode Python:

števila = [1, 2, 3, 4, 5] # seznam števil
[število for število in števila if število%2]

Čeprav v tem trenutku še nimamo dovolj znanja, poskusimo razumeti/prebrati:

  1. prva vrstica definira seznam števil; vse kar sledi znaku # pa predstavlja komentar

  2. rezultat druge vrstice je seznam, kar definirata oglata oklepaja; znotraj oklepaja beremo:

    • vrni število za vsako (for) število v (in) seznamu števila, če (if) je pri deljenju število z 2 ostanek 1.

Vidimo, da je nivo abstrakcije res visok, saj smo potrebovali veliko besed, da smo pojasnili vsebino!

Poglejmo rezultat:

[1, 3, 5]

Kratek pregled začetkov nekaterih programskih jezikov:

  • 1957 Fortran, * 1970 Pascal, * 1972 C

  • 1980 C++, * 1984 Matlab, * 1986 Objective-C

  • 1991 Python, * 1995 Java, * 1995 Delphi

  • 2006 Rust, 2009 Go, 2012 Julia

Kdo se uči Python, zakaj ga uporabljati?

Na univerzi Berkeley v začetku študijskega leta 2017/18 (več kot 1200 študentov pri predmetu Data science, ki temelji na tehnologiji Jupyter notebook).

Loading...

Python v zadnjih 10 letih pospešeno pridobiva na popularnosti in je danes eden od najboljših (IEEE Spectrum.) in tudi najpopularnejših programskih jezikov (Why is Python Growing so Quickly? in Python’s explosive growth).

Uporaba Pythona?

Nekatera mednarodna podjetja: Nasa, Google, Cern.

Nekatera podjetja v Sloveniji: Gorenje, Kolektor, Iskra Mehanizmi, Hidria, Mahle, Domel, ebm-papst Slovenia, Efaflex...

Čedalje več programov, ki imajo vgrajeno skriptno podporo za Python: Abaqus, Ansys Workbench, MSC (Adams, SimXpert), MS Excel, ParaView, LMS Siemens, AVL.

Nekateri komercialni programi v Pythonu: BitTorrent, Dropbox.

Obširni seznam je tukaj.

Python vs Matlab

Matlab je bil v preteklosti pogosto poučevan na univerzah in imel tudi veliko uporabnikov v industriji. Že vrsto let je ekosistem Pythona za večino opravil bistveno močnejše orodje. Na spletu boste našli ogromno primerjav, npr.: Python vs Matlab.

Kratka primerjave glede na vir:

Primerjava py

Sintaksa je načeloma zelo podobna. Pomembna razlika je, da se indeksi pri Matlabu začnejo z 1, v Pythonu pa z 0.

Če ste mlajši od 25-30 let, preostanek te celice verjetno lahko preskočite.

Če niste, ste se verjetno učili Matlab in se sprašujete zakaj je v vašem klubu čedalje manj članov. Verjetno je čas za prehod na Python; tukaj prispevek, ki vam lahko pomaga: MATLAB vs Python: Why and How to Make the Switch.

Namestitev Pythona

Pojdite na www.python.org ter namestite Python; izberite najnovejšo različico (trenutno 3.14) (64 bit). Pri tem sledite pripravljenim video navodilom.

Uporaba githuba repozitorija in posodobitve

Ta knjiga se vedno dopolnjuje, zadnja verzija je dosegljiva na:

Najbolje je za sinhronizacijo s spletnim repozitorijem uporabljati kakšnega od Git klientov, npr. GitHub Desktop ali znotraj Visual Studio Code (predstavljen v nadaljevanju). Git je sicer zelo močno orodje in skupini razvojnikov omogoča relativno enostavno delo na isti kodi in kontrolo nad različnimi verzijami datotek.

Visual Studio Code

VSC

Pri tem predmetu bomo v glavnem programirali v Jupyter Lab/Notebooku znotraj Visual Studio Code - VSC, kar nam omogoča zelo učinkovito programiranje ob uporabi polno formatiranega besedila in interaktivnih prikazov. Za namestitev VSC sledite pripravljenim video navodilom.

Kadar želimo programirati obsežnejše in bolj splošno uporabne pakete ter namenske programe, pa se ponavadi poslužimo še drugih funkcij, ki nam jih razvojno okolije (angl. integrated development environment - IDE) VSC ponuja. V zadnjem obdobju VSC, zaradi hitrosti, enostavnosti uporabe in razširljivosti, pridobiva na priljubljenosti. Kako nam lahko VSC pomaga pri programiranju odlično prikaže video posnetek na temo produktivnosti z VSC.

Nameščanje dodatkov in posodobitev

Na pypi.org se nahaja veliko različnih paketov! Namestimo jih iz ukazne vrstice* (angl. command prompt) z ukazom pip.

* Ukazno vrstico prikličete v operacijskem sistemu Windows tako, da kliknite "Start" in napišite "command prompt" ter pritisnete "enter" ali pa odprete terminal znotraj VSC (video).

Podrobnosti nameščanja dodatkov si bomo pogledali naslednjič. Da boste imeli zadnjo verzijo paketov, izvedite naslednje:

  1. Odprite ukazno vrstico,

  2. sprožite ukaz za posodobitev paketov, ki jih bomo potrebovali tekom predmeta:

    pip install numpy scipy matplotlib sympy requests jupyter --upgrade

Jupyter notebook (Jupyter lab)

Jupyter notebook je interaktivno okolje, ki deluje kot spletna aplikacija in se lahko uporablja z različnimi programskimi jeziki (npr. Python, Julia, R, C, Fortran ... iz prvih treh je nastalo tudi ime JuPyt[e]R).

Jupyter notebook je najlažje preizkusiti tukaj: try.jupyter.org ali colab.research.google.com.

Jupyter notebook zaženemo (v poljubni mapi) iz ukazne vrstice ali iz Raziskovalca/Explorerja z ukazom: jupyter notebook,

Jupyter notebook

ali znotraj VSC kot je predstavljeno v posnetku.

Opombe:

  • s sprožitvijo jupyter lab pridemo do nadgradnje jupyter notebook okolja (rahlo bolj zahtevno okolje, vendar bistveno bolj napredno okolje),

  • tukaj predpostavimo, da je pot do datoteke jupyter[.exe] dodana v spremenljivke okolja (in jo lahko prožite iz ukazne vrstice v poljubni mapi),

  • če želite ukazno vrstico sprožiti v poljubni mapi, potem v explorerju pridržite shift in kliknite mapo z desnim gumbom; nato izberite Odpri ukazno vrstico tukaj / Open command window here.

Do Jupyter strežnika dostopamo prek spletnega brskalnika. Najprej se vam prikaže seznam map in datotek do katerih lahko dostopate v okviru mape, v kateri ste sprožili ukaz jupyter notebook. Nato poiščite v desnem kotu zgoraj ikono new in nato kliknite Python 3. S tem boste zagnali vaš prvi Jupyter notebook (v okviru jedra Python). Najdite ukazno vrstico in na desni strani kliknite na Help in nato User interface tour. Poglejte si še Help/Keyboard shortcuts.

Jupyter notebook je sestavjen iz t. i. celic (angl. cell).

Celica ima dve stanji:

  • Ukazno stanje / Command mode: v to stanje se vstopi s pritiskom [escape],

  • Stanje za urejanje / Edit mode v to stanje se vstopi s pritiskom [enter].

V obeh primerih se celico izvrši s pritiskom [shift + enter].

Celice so lahko različnega tipa; tukaj bomo uporabljali dva tipa:

  • Code: v tem primeru celica vsebuje programsko kodo (bližnjica v ukaznem stanju je tipka [y]),

  • Markdown: v tem primeru celica vsebuje besedilo oblikovano po standardu Markdown (bližnjica v ukaznem stanju je tipka [m]).

Markdown

Jupyter notebook omogoča zapis v načinu markdown, ki ga je v letih 2003-2004 predstavil John Gruber. Namen markdowna je, da se pisec osredotoča na vsebino, pri tem pa za oblikovanje uporablja nekaj preprostih pravil. Pozneje se markdown lahko prevede v spletno obliko, v pdf (npr. prek LaTeX-a) itd. Bistvena pravila (vezana predvsem na uporabu na Githubu) so podana tukaj; spodaj jih bomo na kratko ponovili.

Naslove definiramo z znakom #:

  • # pomeni naslov prve stopnje,

  • ## pomeni naslov druge stopnje itd*.

* Če pogledate kodo opazite, da se znak \ pojavi pred znakom # zato, da se prikaže sam znak # in ne uporabi njegovo funkcijo za naslov prve stopnje. Podobno je tudi pri drugih posebnih znakih.

Oblikovanje besedila definirajo posebni znaki; če želimo besedo (ali več besed) v poševni obliki, moramo tako besedilo vstaviti med dva znaka *: tekst v stanju za urejanje v obliki *primer* bi se prikazal kot primer.

Pregled simbolov, ki definirajo obliko:

  • poševno:*

  • krepko: **

  • ~~prečrtano~~: ~~

  • simbol: `

  • funkcije: ``

  • blok kode: ```.

Opomba: za primer bloka kode Python glejte uvodno poglavje, primer Fibonacci.

V okviru markdowna lahko uporabljamo tudi LaTeX sintakso. LaTeX je zelo zmogljiv sistem za urejanje besedil; na Fakulteti za strojništvo, Univerze v Ljubljani, so predloge za diplomske naloge pripravljene v LaTeXu in Wordu. Tukaj bomo LaTeX uporabljali samo za pisanje matematičnih izrazov.

Poznamo dva načina:

  • vrstični način (angl. inline): se začne in konča z znakom \,primer:, primer: a^3=\sqrt{365}$,

  • blokovni način (angl. block mode): se začne in konča z znakoma \\\, primer: $$\sum F=m\,\ddot{x}$$, kar se izriše kot:

∑F=m x¨\sum F=m\,\ddot{x}

Zgoraj smo že uporabljali sezname, ki jih začnemo z znakom * v novi vrstici:

  • lahko pišemo sezname

    • z več nivoji

      • 3. nivo

    • 2. nivo

  • lahko pišemo poševno

  • lahko pišemo krepko.

Če želimo oštevilčene sezname, začnemo z “1.” nato pa nadaljujemo z “1.”:

  1. prvi element

  2. drugi

  3. naslednji ...

V dokument lahko vključimo tudi html sintakso (angl. Hypertext Markup Language ali po slovensko jezik za označevanje nadbesedila). V markdownu najenostavneje vključimo slike.

Uporabimo:

![Ladisk (to je opcijski opis slike)](./fig/ladisk.png)

Za prikaz: Ladisk

Vključimo lahko tudi zunanje vire (npr. video posnetek iz Youtube). Ker gre za morebitno varnostno tveganje, tega ne naredimo v celici tipa markdown kakor zgoraj, ampak v celici tipa code, pri tem pa uporabimo t. i. magični ukaz (angl. magic) %%html, ki definira, da bo celoten blok v obliki html sintakse (privzeto so celice tipa code Python koda):

Loading...

Magičnih ukazov je v notebooku še veliko (glejte dokumentacijo) in nekatere bomo spoznali pozneje, ko jih bomo potrebovali!

Doslej smo že večkrat uporabili sklicevanje na zunanje vire, to naredimo tako:

[Ime povezave](naslov do vira)

Primer: [Spletna stran laboratorija Ladisk](https://www.ladisk.si) se oblikuje kot: Spletna stran laboratorija Ladisk.

V okviru markdowna lahko pripravimo preproste tabele. Priprava je relativno enostavna: med besede enostavno vstavimo navpične znake | tam, kjer naj bi bila navpična črta. Po naslovni vrstici sledi vrstica, ki definira poravnavo v tabeli.

Primer:

| Ime   | Masa [kg]  | Višina [cm]  |
|:-|-:|:-:|
| Lakotnik  | 180  | 140  |
| Trdonja | 30  | 70  |
| Zvitorepec  | 40  | 100  |

Rezultira v:

ImeMasa [kg]Višina [cm]
Lakotnik180140
Trdonja3070
Zvitorepec40100

Opazimo, da dvopičje definira poravnavo teksta v stolpcu (levo :-, desno -: ali sredinsko :-:).

Prvi program in PEP

Sedaj smo pripravljeni na prvi program napisan v Pythonu:

a = 5.0
print(a)

Program lahko zapišemo v poljubnem urejevalniku tekstovnih datotek (npr. Beležka/Notepad) in ga shranimo v datoteko ime.py.

Primer kode v okolju Visual Studio Code: Prvi program

To datoteko nato poženemo v ukazni vrstici (predpostavimo, da je pot do datoteke python.exe dodana v spremenljivke okolja, sicer glejte tale vir):

python ime.py
>>> 5.0

Z znaki >>> označimo rezultat, ki ga dobimo v ukazni vrstici.

Zgornji primer izvajanja Python programa predstavlja t. i. klasični način poganjanja programov od začetka do konca. Tukaj bomo bolj pogosto uporabljali t. i. interaktivni način, ko kodo izvajamo znotraj posamezne celice tipa code:

5.0

PEP - Python Enhancements Proposal

Python ima visoke standarde glede kakovosti in estetike. Že zgodaj v razvoju jezika se je uveljavil princip predlaganja izboljšav prek t. i. Python Enhancements Proposal (PEP na kratko).

PEP8

Eden od bolj pomembnih je PEP8, ki definira stil:

  • zamik: 4 presledki,

  • en presledek pri operatorju =, torej: a = 5 in ne a=5,

  • spremenljivke in imena funkcij naj bodo opisne, pišemo jih s podčrtajem: širina_valja = 5,

  • za razrede uporabljamo t. i. format CamelCase.

  • pri aritmetičnih operaterjih postavimo presledke po občutku: x = 3*a + 4*b ali x = 3 * a + 4 * b,

  • za oklepajem in pred zaklepajem ni presledka, prav tako ni presledka pred oklepajem ob klicu funkcije: x = sin(x), ne pa x = sin( x ) ali x = sin (x),

  • presledek za vejico: range(5, 10) in ne range(5,10),

  • brez presledkov na koncu vrstice ali v prazni vrstici,

  • znotraj funkcije lahko občasno dodamo po eno prazno vrstico,

  • med funkcije postavimo dve prazni vrstici,

  • vsak modul uvozimo (import) v ločeni vrstici,

  • najprej uvozimo standardne pythonove knjižnice, nato druge knjižnice (npr. numpy) in na koncu lastne.

Opomba: moderna razvojna orodja nam pomagajo pri oblikovanju kode, ki ustreza PEP8 (v VSC pritisnite ctrl+shift+P ter napišite “Format document” in pritisnite enter)!

PEP20

PEP20 je naslednji pomemben PEP, ki se imenuje tudi The zen of Python, torej zen Pythona; to so vodila, ki se jih poskušamo držati pri programiranju. Tukaj navedimo samo nekatera vodila:

  • Lepo je bolje kot grdo.

  • Preprosto je bolje kot zakomplicirano.

  • Premočrtno je bolje kot gnezdeno.

  • Berljivost je pomembna.

  • Posebni primeri niso dovolj posebni, da bi prekršili pravilo

  • Če je implementacijo težko pojasniti, je verjetno slaba ideja; če jo je lahko, je mogoče dobra.

Osnove Pythona

Osnovni podatkovni tipi in operatorji

Dinamično tipiziranje

Python je dinamično tipiziran jezik. Tipi spremenljivk se preverjajo šele med izvajanjem, ne ob zapisu kode. Posledično nekatere operacije niso mogoče na nekaterih tipih oz. so prilagojene tipu podatka (pozneje bomo na primer pogledali množenje niza črk). Tip se določi pri dodelitvi vrednosti, poglejmo primer:

1

Tip prikažemo z ukazom type:

int

Vrednost a lahko prepišemo z novo vrednostjo:

1.0
float

Za izpis vrednosti sicer lahko uporabimo tudi funkcijo print(), ki jo bomo podrobneje spoznali pozneje:

1.0

Dokumentacijo funkcije lahko kličemo s pritiskom [shift + tab]. Npr: napišemo pri in pritisnemo [shift + tab] ter se bo v pojavnem oknu prikazala pomoč; če pridržimo [shift], se z dodatnim pritiskom na [tab] prikaže razširjena pomoč, z nadaljnjim dvojnim pritiskom [tab] (skupaj torej 4-krat) se pomoč prikaže v novem oknu.

Do pomoči dostopamo tudi, tako, da pred funkcijo postavimo ? (za pomoč) ali ?? (prikaže tudi izvorno kodo, če je ta na voljo).

Primer:

?print
??print
Logični operatorji

Logični operatorji so (vir):

  • or, primer: a or b; opomba: drugi element se preverja samo, če prvi ni res,

  • and, primer: a and b; opomba: drugi element se preverja samo, če prvi je res,

  • not, primer: not a; opomba: ne-logični operatorji imajo prednost: not a == b se interpretira kot not (a == b).

Primerjalni operatorji

Primerjalni operatorji (vir):

  • < manj kot,

  • <= manj ali enako,

  • > večje kot,

  • >= večje ali enako,

  • == enako,

  • != neenako,

  • is istost objekta primerjanih operandov,

  • is not ali operanda nista isti objekt.

Primer:

True

Lahko naredimo niz logičnih operatorjev:

True

preverimo istost (ali gre za isti objekt):

True

Uporabimo še logični operator:

True
False

Tukaj velja izpostaviti, da je v logičnih izrazih poleg False neresnična tudi vrednost 0, None, prazen seznam (ali niz, terka, ...); vse ostalo je True.

Poglejmo nekaj primerov:

True
0
True
Podatkovni tipi za numerične vrednosti

Pogledali si bomo najbolj pogoste podatkovne tipe, ki jih bomo pozneje uporabili (vir):

  • int za zapis poljubno velikega celega števila,

  • float za zapis števil s plavajočo vejico,

  • complex za zapis števil v kompleksni obliki.

Bolj podrobno bomo podatkovne tipe (natančnost zapisa in podobno) spoznali pri uvodu v numerične metode.

Primeri:

Operatorji numeričnih vrednosti

Operatorji, razvrščeni po naraščajoči prioriteti (vir):

  1. x + y vsota,

  2. x - yrazlika,

  3. x * y produkt,

  4. x / y deljenje,

  5. x // y celoštevilsko deljenje (rezultat je celo število zaokroženo navzdol),

  6. x % y ostanek pri celoštevilskem deljenju,

  7. -x negiranje,

  8. +x nespremenjen,

  9. abs(x) absolutna vrednost,

  10. int(x) celo število tipa int,

  11. float(x) realno število tipa float,

  12. complex(re, im) kompleksno število tipa complex,

  13. c.conjugate() kompleksno konjugirano število,

  14. divmod(x, y) vrne par (x // y, x % y),

  15. pow(x, y) vrne x na potenco y,

  16. x ** y vrne x na potenco y.

Pri aritmetičnih operatorjih velja izpostaviti različico, pri kateri se rezultat priredi operandu (vir). To imenujemo razširjena dodelitev (angl. *augmented assignement).

Poglejmo si primer. Namesto:

2

lahko zapišemo:

2
Operatorji na nivoju bitov

Operatorje na nivoju bitov bomo v inženirski praksi redko uporabljali, vseeno jih navedimo po naraščajoči prioriteti (vir):

  • x | y ali na nivoju bitov x in y,

  • x ^ y ekskluzivni ali (samo en, ne oba) na nivoju bitov x in y,

  • x & y bitni in na nivoju bitov x in y,

  • x << n premik bitov x za n bitov levo,

  • x >> n premik bitov x za n bitov desno,

  • ~x negiranje bitov x.

Poglejmo si primer (vir):

1

Prikažimo število v bitni obliki:

'0b1'

Sestavljene podatkovne strukture

Niz (string)

Niz je sestavljen iz znakov po standardu Unicode. V podrobnosti se ne bomo spuščali; pomembno je navesti, da je Python od verzije 3 naprej naredil velik napredek (vir) in da lahko poljubne znake po standardu Unicode uporabimo tako v tekstu, kakor tudi v programskih datotekah .py.

Niz se začne in zaključi z dvojnim " ali enojnim ’ narekovajem.

'tekst'

Pri tem ni težav z imeni, ki smo jih bolj vajeni:

Znak π\pi se v notebooku zapiše, da napišemo \pi (imena so ponavadi ista kot se uporabljajo pri zapisu v LaTeXu) in nato pritisnemo [tab].

Nekatere operacije nad nizi:

kratek tekst
To je množenje niza. To je množenje niza. To je množenje niza. 
Celo število: 10
Število s plavajočo vejico: 10.0
Terka (tuple)

Tuples (vir) ali po slovensko terke so seznami poljubnih objektov, ki jih ločimo z vejico in pišemo znotraj okroglih oklepajev:

(1, 'programiranje', 5.0)

Večkrat smo že uporabili besedo objekt. Kaj je objekt? Objekte in razrede si bomo podrobneje pogledali pozneje; zaenkrat se zadovoljimo s tem, da je objekt več kot samo ime za določeno vrednost; objekt ima tudi metode. Npr. drugi element je tipa str, ki ima tudi metodo replace za zamenjavo črk:

'p8og8ami8anje'

Če ima terka samo en objekt, potem jo moramo zaključiti z vejico (sicer se ne loči od objekta v oklepaju):

tuple

Terke lahko zapišemo tudi brez okroglih oklepajev:

(1, 'brez oklepajev', 5.0)

Do objektov v terki dostopamo prek indeksa (se začnejo z 0):

1

Terke ni mogoče spreminjati (angl: immutable), elementov ne moremo odstranjevati ali dodajati. Klicanje spodnjega izraza bi vodilo v napako:

terka_1[0] = 3
>>> TypeError: 'tuple' object does not support item assignment
Seznam (list)

Seznami (vir) se zapišejo podobno kot terke, vendar se uporabijo oglati oklepaji:

[1.0, 2, 'd']

Za razliko od terk, se sezname lahko spreminja:

[10, 2, 'd']

Seznami so spremenljivi (angl. mutable) in treba se je zavedati, da ime v bistvu kaže na mesto v pomnilniku računalnika:

[10, 2, 'd']

Sedaj tudi b kaže na isto mesto v pomnilniku.

Poglejmo, kaj se zgodi s seznam, če spremenimo element seznama b:

[9, 2, 'd']
[9, 2, 'd']

Če želimo narediti kopijo podatkov, potem moramo narediti tako:

[99, 2, 'd']
[9, 2, 'd']

Primer seznama seznamov:

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Več o matrikah bomo izvedeli pozneje.

Izbrane operacije nad seznami

Tukaj si bomo pogledali nekatere najbolj pogoste operacije, za več, glejte dokumentacijo.

Najprej si poglejmo dodajanje elementa:

[0, 1, 'test', 'dodajanje elementa']

Potem vstavljanje na določeno mesto (z indeksom 1, ostali elementi se zamaknejo):

[0, 'na drugo mesto', 1, 'test', 'dodajanje elementa']

Potem lahko določeni element odstranimo. To naredimo s seznam.pop(i) ali del seznam[2]. Prvi način vrne odstranjeni element, drugi samo odstrani element:

seznam: [0, 'na drugo mesto', 'test', 'dodajanje elementa']
odstranjeni element: 1

Z metodo .index(v) najdemo prvi element vrednosti v:

[0, 'na drugo mesto', 'test', 'dodajanje elementa']
2
Zakaj uporabiti terko in ne seznama?

Terk ne moremo spreminjati, zato je njihova numerična implementacija bistveno bolj lahka (v numeričnem smislu) in spomin se lahko bolje izrabi. Posledično so terke hitrejše od seznamov; poleg tega jih ne moremo po nerodnosti spremeniti. Za širši odgovor glejte vir.

Množice (Sets)

Množice so v principu podobne množicam kot jih poznamo iz matematike. Množice v Pythonu (dokumentacija) za razliko od ostalih sestavljenih struktur:

  • ne dovoljujejo podvojenih elementov in

  • nimajo urejenega vrstnega reda (pomembno, npr. za pravilno uporabo v zankah).

Vredno je poudariti, da sta dodajanje in ugotavljanje pripadnosti elementa množici zelo hitri operaciji.

Kreiramo jih z zavitimi oklepaji {} ali ukazom set():

{2, 3, 4, 'a', 'ž'}

Če se želimo v seznamu znebiti podvojenih elementov, je zelo enostaven način, da kreiramo množico iz seznama:

{4, 6}

Uporabimo lahko tipične matematične operacije nad množicami:

{6}
{2, 3, 4, 6, 'a', 'ž'}
{4}
{2, 3, 6, 'a', 'ž'}
Slovar (dictionary)

Slovar (dokumentacija) lahko definiramo eksplicitno s pari ključ : vrednost, ločenimi z vejico znotraj zavitih oklepajev:

{'višina': 5.2, 'širina': 43, 'g': 9.81}

Do vrednosti (angl. value) elementa dostopamo tako, da uporabimo ključ (angl. key):

5.2

Pogosteje uporabljamo metode:

  • values(), ki vrne vrednosti slovarja,

  • keys(), ki vrne ključe slovarja,

  • items(), ki vrne seznam terk (ključ, vrednost); to bomo pogosto rabili pri zankah.

Primer:

dict_items([('višina', 5.2), ('širina', 43), ('g', 9.81)])

Slovarje lahko spreminjamo; npr. dodamo element:

{'višina': 5.2, 'širina': 43, 'g': 9.81, 'lega_težišča': 99999}

Elemente odstranimo (podobno kot zgoraj pop odstrani in vrne vrednost del samo odstrani):

99999
{'višina': 5.2, 'širina': 43, 'g': 9.81}
Operacije nad sestavljenimi podatkovnimi strukturami

Večina sestavljenih podatkovnih struktur dovoljuje sledeče operacije (dokumentacija):

  • x in s vrne True, če je kateri element iz s enak x, sicer vrne False,

  • x not in s vrne False, če je kateri element iz s enak x, sicer vrne True,

  • s + t sestavi s in t,

  • s * n ali n * s rezultira v n-krat ponovljen s,

  • s[i] vrne i-ti element iz s,

  • s[i:j] vrne s od elementa i (vključno) do j (ni vključen),

  • s[i:j:k] rezanje s od elementa i do j po koraku k,

  • len(s) vrne dolžino s,

  • min(s) vrne najmanjši element iz s,

  • max(s) vrne največji element iz s,

  • s.index(x[, i[, j]]) vrne indeks prve pojave x v s (od indeksa i do j),

  • s.count(x) vrne število pojavitev elementa x.

Nekateri primeri:

True

Zgoraj smo imeli slovar parametri:

{'g': 9.81, 'višina': 5.2, 'širina': 43}

Preverimo, ali vsebuje element s ključem širina:

True
Štetje in rezanje sestavljenih podatkovnih struktur

Predpostavimo spodnji niz:

V Pythonu začnemo šteti indekse z 0! Na spletu lahko najdete razprave o tem ali je prav, da se indeksi začnejo z 0 ali 1. Zakaj začeti z 0 zelo lepo pojasni prof. dr. Janez Demšar v knjigi Python za programerje (vir, stran 28) ali pa tudi prof. dr. Edsger W. Dijkstra v zapisu na spletu.

Rezanje imenujemo operacijo, ko iz seznama izrežemo določene člene.

Splošno pravilo je:

 s[i:j:k]

kar pomeni, da se seznam s razreže od elementa i do j po koraku k. Če katerega elementa ne podamo potem se uporabi privzeta vrednost:

  • i je privzeto 0, kar pomeni prvi element,

  • j je privzeto len(s) (dolžina zaporedja), zato je vključen tudi zadnji element,

  • k je privzeto 1.

Prvi znak je torej:

'a'

Prvi trije znaki so:

'abc'

Od prvih 15 znakov, vsak tretji je:

'ačfil'

Zadnjih petnajst znakov, vsak tretji:

'jmpšv'

Ko želimo obrniti vrstni red, lahko to naredimo tako (beremo od začetka do konca po koraku -1, kar pomeni od konca proti začetku s korakom 1):

'žzvutšsrponmlkjihgfedčcba'

Kontrola toka programa

Pogledali si bomo nekatera osnovna orodja za kontrolo toka izvajanja programa (dokumentacija).

Stavek if

Tipična oblika stavka if (dokumentacija):

if pogoj0:
    print('Izpolnjen je bil pogoj0')
elif pogoj1:
    print('Izpolnjen je bil pogoj1')
elif pogoj2:
    print('Izpolnjen je bil pogoj2')
else:
    print('Noben pogoj ni bil izpolnjen')

Primer:

a je več od 5
-------------

Zgoraj smo funkcijo print zamaknili, saj pripada bloku kode, ki se izvede v primeru a > 5. Nekateri programski jeziki kodo znotraj bloka dajo v zavite ali kakšne druge oklepaje in dodatno še zamikajo. Pri Pythonu se samo zamikajo. Zamik je tipično 4 presledke. Lahko je tudi tabulator (manj pogosto), vendar pa smemo v eni datoteki .py uporabljati le en način zamikanja.

Stavke lahko zapišemo tudi v eno vrstico, vendar je taka uporaba odsvetovana, saj zmanjšuje preglednost kode:

taka oblika je odsvetovana
----------------------------------------
uporaba podpičja namesto nove vrstice
Izraz if

Poleg stavka if ima Python tudi izraz if (angl. ternary operator, glejte dokumentacijo).

Sintaksa je:

[izvedi, če je True] if pogoj else [izvedi, če je False]

Preprost primer:

'Ni res'

If izrazi so zelo uporabni in jih bomo pogosto uporabljali pri izpeljevanju seznamov!

Zanka while

Sintaksa zanke while (dokumentacija) je:

while pogoj:
    [koda za izvajanje]
else:
    [koda za izvajanje]

Pri tem je treba poudariti, da je del else opcijski in se izvede ob izhodu iz zanke while. Ukaz break prekine zanko in ne izvede else dela. Ukaz continue prekine izvajanje trenutne kode in gre takoj na testiranje pogoja.

Preprost primer:

0
1
2
--
Zanka for

V Pythonu bomo zelo pogosto uporabljali zanko for (dokumentacija). Sintaksa je:

for element in seznam_z_elementi:
    [koda za izvajanje]
else:
    [koda za izvajanje]

Podobno kakor pri while je tudi tukaj else del opcijski.

Poglejmo primer:

Jaka
Miki
Luka
Anja

Zelo uporabno je zanke delati čez slovarje:

Slovar je: {'višina': 5.2, 'širina': 43, 'g': 9.81}
višina = 5.2
širina = 43
g = 9.81
Izpeljevanje seznamov

Pri programiranju se pogosto srečujemo s tem, da moramo izvajati operacije na posameznem elementu seznama. Predhodno smo že spoznali zanko for, ki jo lahko uporabimo v takem primeru.

Oglejmo si primer, kjer izračunamo kvadrat števil:

[1, 4, 9]

Mnogo enostavneje lahko isti rezultat dosežemo s t. i. izpeljevanjem seznamov (angl. list comprehensions, glejte dokumentacijo).

Zgornji primer bi bil:

[1, 4, 9]

Izpeljevanje seznamov predstavlja koda [element**2 for element in seznam], ki v bistvu pove to, kar je napisano: izračunaj kvadrat za vsak element v seznamu. Da je rezultat seznam, nakazujejo oglati oklepaji.

Izpeljevanje seznamov ima sledečo sintakso:

[koda for element in seznam]

in ima predvsem dve prednosti:

  • preglednost / kompaktnost kode in

  • malo hitrejše izvajanje.

Preglednost/kompaktnost smo lahko že presodili. Kako preverimo hitrost? Najlažje to naredimo s t. i. magičnim ukazom %%timeit, torej meri čas (glejte dokumentacijo); spodaj bomo uporabili blokovni magični ukaz (označuje ga %%):

%%timeit -n1000

kjer parameter -n1000 omejuje merjenje časa na 1000 ponovitev.

Najprej daljši način:

176 µs ± 33.1 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

Nato izpeljevanje seznamov (bolj pregledno in malenkost hitreje):

151 µs ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

Poglejmo si še dva uporabna primera:

  • uporabo izraza if za izračun nove vrednosti,

  • uporabo izraza if, če se nova vrednost sploh izračuna.

Pri izračunu nove vrednosti izraz if vstavimo v del pred for:

[11, 4, 9]

Pogosto pa za določene elemente izračuna sploh ne želimo izvesti, v tem primeru izraz if vstavimo za seznam:

[4, 9]
Funkcija zip

Ko želimo kombinirati več seznamov v zanki, si pomagamo s funkcijo zip (dokumentacija); primer:

Pari so:  1 in 10
Pari so:  2 in 20
Pari so:  3 in 30
Funkcija range

Pogosto bomo uporabljali zanko for v povezavi s funkcijo range (dokumentacija). Sintaksa je:

range(stop)
range(start, stop[, step])

Če torej funkcijo kličemo z enim parametrom, je to stop: do katere številke naštevamo. V primeru klica z dvema parametroma start, stop, naštevamo od, do! Tretji parameter je opcijski in definira korak step.

Poglejmo primer:

0
1
2
Funkcija enumerate

Zanko for pogosto uporabljamo tudi s funkcijo enumerate, ki elemente oštevilči (dokumentacija).

Poglejmo primer:

0 Jaka
1 Miki
2 Luka
3 Anja

Za konec: plonk list :)

Veliko jih je; tukaj je povezava do enega.

Še nekaj branja: automatetheboringstuff.com.

In en twit:

Loading...

Vprašanja za vaje


Niz (string)

Vprašanje 1: V obliki niza zapišite svoje ime in priimek. Niz pretvorite v seznam in ga izpišite.

Vprašanje 2: Zadnji znak v pripravljenem seznamu dvajsetkrat izpišite.

Seznam (list), terka (tuple)

Vprašanje 3: V Jupyter notebooku poiščite pomoč za funkcijo tuple. Definirajte seznam s petimi različnimi števili s plavajočo vejico in ga pretvorite v terko.

Vprašanje 4: Ustvarjeni terki poskusite dodati nov element. Komentirajte, terko pretvorite v seznam...

Vprašanje 5: Poiščite indeks najvišjega elementa v seznamu in ta element odstranite. Če je treba poiščite pomoč za funkciji max, list.index.

Vprašanje 6: Pripravite nov seznam, tako da seznam iz prejšnje naloge uredite po velikosti in prve (najmanjše) tri shranite v nov seznam.

Funkcija zip

Vprašanje 7: Pripravite seznam treh nizov: ['najmanjši', 'srednji', 'največji'].

Z uporabo funkcije zip in list pripravite seznam terk iz seznama nizov in seznama iz prejšnjega vprašanja.

Slovarji

Vprašanje 8: Iz seznama terk iz prejšnje naloge tvorite slovar. Dodajte mu nov ključ ‘negativen’ in vanj shranite poljubno negativno število.

Stavek if, for in while zanke

Vprašanje 9: Pripravite seznam vseh lihih deliteljev poljubnega naravnega števila N, večjega od 100, ki ni praštevilo.

Vprašanje 10: Za vsa naravna števila i, manjša ali enaka 20, ki jih ni na seznamu deliteljev iz prejšnje naloge, v nov seznam zapišite ostanek pri celoštevilskem deljenju N z i.

Vprašanje 11: Iz zgornjega seznama ostankov odstranite podvojene elemente.

Vprašanje 12: Za vse elemente seznama iz prejšnje naloge izpišite par elementa in njegovega indeksa v seznamu, v obliki indeks: element.

Vprašanje 13: Z uporabo while zanke delite število 1000 z 2, tolikokrat, da bo rezultat manjši od 10-3.

Izpišite število potrebnih operacij deljenja.