Moj računalnik je lahko tudi kalkulator

Odpremo Python (ali PythonWin ali ipython ali karkoli že; če uporabljamo PyCharm, bomo izbrali še Tools/Run Python Console) in dobili smo ... kalkulator.

>>> 1+1 2 >>> 2*3 6 >>> 1+2 * 3+1 8

Nič posebnega. Temu, kar smo vpisovali, pravimo izraz. Pri tem predmetu se sicer ne bomo ukvarjali s pravorečjem; teoretiki nas učijo o razliki med izrazom, stavkom in bogvečim še, sam pa se tule enkrat za vselej opravičujem, ker bom dal prednost praksi, ne terminologiji. Še definicijo pomena besede izraz bom prepustil kolegu Slivniku, ki bo nekatere od vas v tretjem letniku učil zanimivo snov o jezikih, prevajalnikih in sploh vsem).

Izraz bo za nas pač nekaj, kar se da izračunati (kar je ravnokar zaropotalo, je neki Alan Turing, ki se je z jabolkom v ustih obrnil v grobu). In gornje stvari se očitno dajo izračunati. In niti niso preveč zanimive.

Razen, morda, zadnjega izraza. V izrazih lahko uporabljamo presledke in to moramo - kot tudi sicer - početi po občutku. V zadnjem izrazu tega nismo počeli, saj je zapis zavajajoč. Python je dovolj pameten, da ve, da ima operator množenja prednost pred operatorjem seštevanja in računa enako, kot če bi napisali

>>> 1+2*3+1 ali >>> 1 + 2*3 + 1

Najboljše je seveda tole, zadnje.

Kar se tiče presledkov, se zmenimo še nekaj: ne boste jih pisali na začetek. Dokler vam ne rečem, da jih morate.

Kakšni operatorji so nam še na voljo? Očitna sta še / za deljenje in - za odštevanje. Dvojna zvezdica, **, pomeni potenciranje (mednju ne smemo napisati presledka, ** je kot, recimo, ena beseda). Operator % izračuna ostanek po deljenju.

>>> 5**2 25 >>> 3**4 81 >>> 13 % 5 3

Potenciranje ima prednost pred vsem, kar poznamo doslej (še več operatorjev bomo namreč spoznali kasneje). Kadar je treba, lahko uporabimo oklepaje.

>>> (4+5)*4 36

Če ostane kak oklepaj odprt, Python ne izračuna izraza, saj ve, da ga še nismo dokončali. Namesto >>> (navadno, odvisno od okolja) pokaže tri pike in dovoli, da nadaljujemo izraz.

>>> (4+2*(3 ... +8)- ... 2) 24

Ni lepo, a prišlo nam bo še prav, boste videli.

Pri množenju je nujno uporabiti zvezdico. Se pravi, pisati moramo 7*(2+3) in ne 7(2+3). (Matematiki vas bodo učili, da se sme pisati tudi 7x+1 in da je to čisto prav. Ni res. Lažejo.

Za deljenje nam je poleg operatorja / na voljo tudi //, ki deli celoštevilsko.

>>> 4.5//1.2 3.0 >>> 7//2 3

1.2 gre v 4.5 trikrat ... in še malo ostane. A celoštevilskega deljenja ostanek ne zanima.

Pozornejšemu je padlo v oči še nekaj zanimivega: če delimo 4.5 z 1.2, dobimo 3.0, če delimo 7 z 2, pa 3. Za prvo predavanje bi lahko to tudi preskočili, a se vseeno pomudimo: Python loči med celimi in necelimi števili. Rezultat deljenja necelih števil je necelo število; slučajno je ravno okroglo (3), vendar Python še vedno ve, da gre za število, ki bi lahko bilo necelo (čeprav slučajno ni). Rezultat celoštevilskega deljenja celih števil pa je celo število, zato ga Python tudi izpiše brez decimalk. Podobno je s seštevanjem.

>>> 2.3 + 1.7 4.0 >>> 2 + 2 4

Če seštejemo realni števili 2.3 in 1.7 dobimo realno število 4.0. Če seštejemo celi števili 2 in 2, dobimo celo število 4.

Kako hitro napredujemo! To, kar smo pravkar spoznali, so "podatkovni tipi". Točneje, spoznali smo dva podatkovna tipa cela števila in števila s plavajočo vejico. V angleščini se jima reče integer in floating point number ali, krajše, int in float. Odkod ta čudna imena boste izvedeli pri kakem drugem predmetu. Vsaka reč v Pythonu je reč nekega tipa, in če je ta reč število, je bodisi tipa int bodisi float. (So števila lahko še kakega drugega tipa? Lahko, nekateri jeziki imajo celo kupe številskih tipov. Vendar nas za zdaj ne brigajo.)

Neučakanega študenta morda pograbila radovednost. Kateri podatkovni tipi pa še obstajajo - razen številskih? Le malo naj počaka, kmalu bodo na vrsti.

Preden gremo naprej, samo opozorimo, kaj vas čaka v večini drugih jezikov: v skoraj vseh drugih jezikih deljenje celih števil vrača celo število; v Javi, ki se jo boste učili v drugem semestru, bo 7/2 enako 3. Obratno opozorilo, seveda, velja za tiste, ki že znate programirati: v Pythonu 7/2 vrne 3.5. Je to pametno? Najbrž je: ko delimo, le redko v resnici želimo celoštevilsko deljenje, večinoma pa hočemo "pravo" deljenje. Še več, pri programiranju velikokrat naredimo napako, ko brezskrbno delimo, ne da bi mislili na to, s kakšnimi števili - celimi ali ne - delamo. Snovalci Pythona so se zato odločili, naj bo deljenje vedno "pravo", kadar hočemo celoštevilsko, pa moramo to posebej povedati tako, da namesto / uporabimo //.

Moj računalnik je lahko tudi kalkulator - s spominom

Izračunali bomo, koliko je 2+3 in rekli računalniku, naj si to zapomni.

>>> x = 2+3

Temu, kar smo napisali tu, pravimo prireditveni stavek, saj smo z njim x-u priredili vrednost izraza 2+3. Prireditveni stavek torej napišemo z enačajem, ki ima na levi strani ime in na desni izraz. Levo in desno od enačaja praviloma pišemo presledke, zaradi preglednosti.

Python tokrat ni izpisal ničesar v odgovor. Rezultat si je le zapomnil, shranil ga je pod imenom x. Kaj lahko počnemo s tem x? Lahko ga uporabljamo v drugih izrazih.

>>> x-77 -72 >>> x**2 25 >>> 13 % x 3 >>> x 5

Temu x Slovenci ponosno rečemo spremenljivka. Angleži temu namreč pravijo variable, Madžari pa változó. (Predvsem slednje ni posebej pomembno in ne pride v poštev kot izpitno vprašanje, čeprav ni nič narobe, če veste.) Spremenljivko lahko seveda uporabljamo tudi za računanje novih spremenljivk.

>>> y = x+2 >>> y 7

Spremenljivka pri programiranju (v večini jezikov) ne pomeni istega kot v matematiki. Spremenljivke v matematiki se, roko na srce, pravzaprav ne spreminjajo. V matematiki x ne more biti v eni vrstici 5, v naslednji pa 8. Pri programiranju pa s tem ni težav.

>>> x = 5 >>> x 5 >>> x = 8 >>> x 8

Še huje. Če matematiki ne bi znali programirati (pa navadno znajo in to dobro), bi jih utegnilo povsem pretresti tole:

>>> x = 5 >>> x = x+2 >>> x 7

Kako je x lahko enak x+2? Saj ni. Ta enačaj ne predstavlja enakosti, kot v matematiki, temveč prirejanje. Ja? V drugi vrstici Python izračuna vrednost izraza x+2, to je, 7, in to priredi spremenljivki x. Izraz x = x+2 torej pomeni, preprosto, povečaj x za 2. (Napišite kaj takega pred prof. Mramorjevo ali prof.Fijavžem, če si upate!)

Tiste, ki že znajo vsaj malo programirati v kakem drugem jeziku, je morda zmotilo, da spremenljivk nismo nikjer deklarirali. V Pythonu tega (skoraj) ne moremo narediti. Spremenljivka se pojavi, ko jo uporabimo, in izgine, ko je ne potrebujemo več. Ali je to dobro ali slabo, si teoretiki niso edini. Niti, ali je to dobro ali slabo za začetnika, ne.

Ostali, tisti, ki niso še nikoli programirali, pa se sprašujejo nekaj drugega. Kakšna so lahko imena spremenljivk? Vedno le ena črka? Angleške abecede?

Takole: imena (angleško govoreči jim pravijo identifier) so lahko poljubno dolga. Vsebujejo lahko črke angleške abecede, številke in podčrtaj, _, vendar se morajo začeti s črko ali podčrtajem. Python, kot skoraj vsi drugi jeziki, razlikuje med malimi in velikimi črkami: x in isto kot X. (V resnici smemo uporabljati tudi šumnike in kitajske pismenke, vendar se tega ne navadite, ker je nezaželeno in ker tega ne boste mogli početi v skoraj nobenem drugem jeziku kot v Pythonu, zato naj vam ne preide v kri.)

Poleg tega pa obstaja še par dogovorov. Podčrtaja praviloma ne dajemo na začetek; to storimo, kadar hočemo povedati nekaj posebnega. Kaj, bomo izvedeli veliko kasneje. Prav tako ima nek poseben pomen, če začnemo spremenljivko z veliko črko. Ime spremenljivke mora praviloma povedati, kaj spremenljivka vsebuje, npr. pospesek = 9.8. Včasih je ime spremenljivke dolgo več besed, v tem primeru pišemo bodisi visina_triglava = 2864 bodisi visinaTriglava = 2864. V zadnjem času je zaželeno prvo, v vsakem primeru pa v istem programu vedno uporabljajmo isti način pisanja.

Izogibali se bomo tudi malemu l-ju, ki ga v nekaterih pisavah ne moremo ločiti od velikega i-ja in v drugih od enice.

Vsi našteti dogovori (in še veliko podobnih bomo spoznali sproti) so samo dogovori. Če se jih ne držimo, bodo programi še vedno delovali. Pythonu je vseeno. Ni pa vseeno nam: če se držimo takšnih dogovorov, bodo naši programi preglednejši tako za nas, kot za druge, ki upoštevajo enaka pravila pisanja.

Poglavje polno napak

"Vsak, kdor dela, dela tudi napake," se je jež poklapano opravičil krtači. Čeprav nobenega omemba vrednega kosa programa, daljšega od, recimo, 20 vrstic, ne napišemo brez vsaj ene resne napake, začetni tečaji programiranja navadno ne posvečajo napakam nobene resne pozornosti. Tu te napake ne bomo ponovili, zato kar takoj naredimo nekaj napak.

Postavimo, najprej, a na 7 in izračunajmo a + b.

>>> a = 7 >>> a + b Traceback (most recent call last): File "<console>", line 1, in <module> NameError: name 'b' is not defined

Kadar računalnik česa ne more storiti, izpiše sporočilo o napaki. Ko bomo programirali zares, bomo videli tudi daljša, ki jih bomo težje razumeli, tole pa je preprosto: name 'b' is not defined. Pozabili smo definirati b, pozabili smo mu dati vrednost.

Kaj pa tole:

>>> 7 = a File "<console>", line 1 SyntaxError: can't assign to literal

Človek vajen matematike bi si mislil, da je a = 7 in 7 = a eno in isto. V matematiki da, pri programiranju (v normalnih jezikih) pa ne, saj enačaj pomeni prirejanje; v prvem primeru priredimo a-ju 7, v drugem primeru pa sedmici a, kar se seveda ne da. To ima natanko toliko smisla, kot če bi napisali 1 = 2. (Še več, Python nas bo po prstih celo, če bomo napisali 1 = 1. Ena je ena, to bo ostala in se ne bo spremenila, niti v ena ne.) Sporočila o napaki tokrat ne razumemo povsem, saj ne vemo, kaj je "literal", osnovno sporočilo, "can't assign", pa je jasno.

Pridelajmo še eno napako.

>>> True = 12 File "<console>", line 1 SyntaxError: assignment to keyword

Beseda True ima poseben pomen in je ni mogoče uporabljati kot spremenljivko. Takšnim besedam pravimo ključne besede, ali, kot bi jim rekel Michael Jackson, če bi bil še živ, keywords. Tokrat je bil Python še prijazen, pri večini drugih ključnih besed pa ne bo povedal kaj dosti več kot "nekaj je narobe". Poskusimo z dvema, if in in:

>>> if = 7 File "<console>", line 1 if = 7 ^ SyntaxError: invalid syntax >>> in = 7 File "<console>", line 1 in = 7 ^ SyntaxError: invalid syntax

Sporočilo "invalid syntax" pomeni, da smo napisali nekaj tako čudnega, da Python ne more uganiti, kaj smo mislili in nam lahko le pokaže tisto mesto, na katerem se je dokončno in popolnoma zmedel.

Morda je koga zaskrbelo, da nam bodo takšne, rezervirane besede v stalno napoto. Bi se dalo videti spisek? Ne bo hudega. Trenutno jih je le 33 in zelo hitro bomo mimogrede spoznali in uporabljali skoraj vse. Že od naslednjih predavanj naprej vam ne bo prišlo na misel, da bi uporabili if kot ime spremenljivke in še kak teden kasneje vam bo stavek if = 1 videti grotesken. (Vsaj mene zabolijo oči, ko ga pogledam in prsti se upirajo temu, da bi sploh natipkali kaj takšnega. Da, prsti mi krvavijo, ko tipkajo if = 1.) Spisek? Ne bom vas strašil z njim, lahko pa si pomagate z Googleom, če hočete. A ni potrebe.

Moj kalkulator ima tudi funkcije

Tako kot spremenljivke, ki v matematiki in v programiranju ne pomenijo čisto istega, tudi beseda funkcija (Angeline Jolie bi rekla function, če bi znala programirati; o tem ali v resnici zna, pa na spletu žal ni podatkov; jo bom vprašal jutri med kosilom, če ne pozabim) ne pomeni povsem istega. Videti pa je zelo podobno. Imamo, recimo, funkcijo abs, ki izračuna absolutno vrednost števila.

>>> abs(-2.8) 2.8

Ali pa pow, ki naredi isto kot operator **.

>>> pow(2, 3) 8

Za razliko od matematikov, ki na funkcijo gledajo kot da ima določeno vrednost pri določenih parametrih, računalnik izračuna vrednost funkcije, za kar moramo poklicati funkcijo. Se pravi, v zadnji vrstici smo poklicali funkcijo pow in ji podali dva argumenta, 2 in 3. Funkcija je izračunala vrednost in jo vrnila.

Tudi klic funkcije, pow(2, 3), je izraz. Kot katerikoli drugi izraz lahko tudi pow in abs nastopata kot del izraza.

>>> (pow(2, 3)+2) / 5 2.0 >>> pow(2, 3) + abs(-2) 10

In argumenti funkcij so lahko prav tako izrazi.

>>> x = 1 >>> yy = pow(abs(-2), x*3) >>> yy 8

Funkcije so v resnici zelo pomembna reč. Python ima milijone in milijone funkcij (ne pretiravam, samo en detajl sem zamolčal). Za vsako reč, ki si jo zamislite, obstaja funkcija. Obstaja funkcija, ki bo, če jo pokličete, poslala mail osebi, katere naslov podate kot argument in z vsebino, ki jo podate kot argument. Obstaja funkcija, ki izriše ali pokaže sliko. Funkcija, ki odpre Excel in funkcija, ki piše po njem. S Pythonom lahko naredimo karkoli, le ime funkcije moramo poznati. (Kot rečeno, izpuščam detajle.)

Nizi

Nas še vedno muči radovednost o tem, kakšne podatkovne tipe, poleg številskih, še imamo? Ker radovednost ni lepa čednost, jo bomo najlažje odpravili tako, da jo potešimo. Vsaj malo. ("Skušnjavo najlažje premagaš tako, da ji podležeš," je modroval Oscar Wilde.) Spoznajmo vsaj še en bolj zapleten podatkovni tip: niz.

Niz ali, po angleško, string (oprostite mi boste morali, da bom pogosto uporabljal angleške izraze; pa mi pokažite, lepo prosim, zidarja, ki ne uporablja vaservage temveč vodno tehtnico, pa se bom tudi jaz popravil), je zaporedje znakov. Aha, kaj pa je to znak? Znaki so črke, številke, ločila in take stvari. Nize moramo vedno zapreti v narekovaje, bodisi enojne (') bodisi dvojne ("). Uporabiti smemo take, ki so bolj praktični in tudi Python bo izpisoval tako, kot se mu bo zdelo bolj praktično.

>>> "Tole je primer niza." 'Tole je primer niza.' >>> "Tole je pa še en primer niza." 'Tole je pa še en primer niza.'

No, vidite, tudi ko smo niz zaprli v dvojne narekovaje, je Python izpisal enojne. V resnici mu je vseeno. (Kdor slučajno programira v Phpju: ne, v Pythonu je res vseeno.)

Tudi nize lahko priredimo spremenljivkam.

>>> napoved = "Jutri bosta matematika pa dež" >>> napoved 'Jutri bosta matematika pa dež'

Celo seštevamo jih lahko.

>>> "Jutri bosta " + "matematika" + " pa " + "dež" 'Jutri bosta matematika pa dež'

Ali pa oboje

>>> napoved_zac = "Jutri bosta " >>> mat = "matematika" >>> dez = "dez" >>> napoved_zac + mat + " pa " + dez 'Jutri bosta matematika pa dez'

Kako zapleten račun! Predvsem ne spreglejte, da smo dali besedo "pa" pod narekovaje, saj so napoved_zac, mat, dez spremenljivke, " pa " pa je niz kar tako. To je nekako tako, kot če bi, ko smo se igrali s številkami, pisali

>>> x = 1 >>> y = 3 >>> x + 2 + y 6

Kaj pa, če bi slučajno pozabili narekovaje?

>>> napoved_zac + mat + pa + dez Traceback (most recent call last): File "<console>", line 1, in <module> NameError: name 'pa' is not defined

Jasno? Brez narekovajev je pa ime spremenljivke - in to takšne, ki še ni definirana. To je tako, kot če bi namesto

>>> ime = "Benjamin" kar je pravilno, rekli >>> ime = Benjamin Traceback (most recent call last): File "<console>", line 1, in <module> NameError: name 'Benjamin' is not defined

Seveda pa lahko (z malim prekrškom enega pravila - katerega že?) naredimo tole:

>>> Benjamin = "otrok solza"

Potem imamo

>>> ime = Benjamin >>> ime 'otrok solza' a, istočasno, >>> ime = "Benjamin" >>> ime 'Benjamin' Jasno? Prvič imamo spremenljivko Benjamin, drugič pa niz, v katerem je besedilo Benjamin. Ko ni narekovajev, imamo spremenljivko, ko so, niz.

>>> napoved = Jutri bosta matametika pa dež Traceback ( File "<interactive input>", line 1 napoved = Jutri bosta matametika pa dež ^ SyntaxError: invalid syntax

Tule računalnik trpi še bolj. Ne le, da so Jutri, bosta, matematika, pa in dež nedefinirane spremenljivke (ker so pač brez narekovajev), računalnik tudi nima pojma, kaj hočemo pravzapravz početi z njimi, čemu mu naštevamo imena nekih spremenljivk. Jih hočemo sešteti ali zmnožiti ali kaj? Kot vedno, kadar računalniku napišemo kaj zares zmedenega, nam zastoka le "syntax error" in pokaže mesto, kjer se je dokončno izgubil.

Gornje je tako, kot da bi rekli

>>> x = 1 >>> y = 2 >>> z = 3 >>> x y z File "<console>", line 1 x y z ^ SyntaxError: invalid syntax Ubogemu računalniku pač ni jasno, kaj bi z x, y in z ter zakaj mu jih naštevamo.

Tiste, ki so ob vpisu na fakulteto nihali med računalništvom in slavistiko, je nemara zbodlo, da sem pisal "Jutri bo matematika pa dež". Mar ne bi bilo lepše (in bolj prav) "matematika in dež". Ponovite vse, kar smo napisali zgoraj, z in, pa boste videli, čemu.

Zakaj pa smo prejle rekli, da uporabimo te, ki so bolj praktični? Čemu bi bili kakšni narekovaji bolj praktični od drugih?

>>> "Cesar vpraša nekoliko nevoljen: "Kaj neki?"" Traceback ( File "<interactive input>", line 1 "Cesar vpraša nekoliko nevoljen: "Kaj neki?"" ^ SyntaxError: invalid syntax

Ni potrebno biti posebno pameten, da vidimo, kaj ga je onesrečilo tokrat. Ko vidi prvi narekovaj, ve, da gre za niz. Ko pride do naslednjega narekovaja, se niz, tako méni, konča. In potem se seveda zmede, ker nizu sledi nekaj, kar ni podobno ničemur. Zdaj pa poskusimo z enojnimi narekovaji.

>>> 'Cesar vpraša nekoliko nevoljen: "Kaj neki?"' 'Cesar vpraša nekoliko nevoljen: "Kaj neki?"'

Ker se niz začne z enojnim narekovajem, se bo s takim tudi končal in vsi dvojni narekovaji znotraj niza so samo znaki kot katerikoli drugi, tako kot dvopičje in vprašaj. O tej temi bi lahko napisali še marsikaj, vendar se za zdaj ustavimo.

Iz nizov v števila

Da se reč usede, meditirajmo ob naslednjih vrsticah:

>>> up = 1 +1 >>> down = "1 + 1" >>> strange = "1" + "1"

Kakšne so po tem vrednosti spremenljivk up, down in strange? Sploh pa, je vse troje legalno ali pa bo Python spet stokal? Poskusimo na pamet. V prvo nimamo dvomov, vrednost up mora biti enaka 2 (in tudi je). Drugo? "1 + 1" je niz; spremenljivki down smo priredili niz "1 +1", torej vsebuje ta niz. In ne niza 2? Ne, nihče mu ni naročil, naj poskuša izračunati, koliko je 1 + 1, tako kot pravzprav tudi v ime = "Benjamin" ne poskuša izračunati, koliko je Benjamin.

Najbolj zanimivo je tretje. Če bi rekli strange = "Benjamin" + "Ana" bi dobil strange vrednost "BenjaminAna", glede tega smo si menda enotni. (Ako kdo misli, da bomo dobili "Benjamin Ana", saj smo tudi poprej imeli presledke ob oni študijsko-vremenski napovedi, naj pozorno pregleda, kaj smo pisali ondi: vse presledke smo napisali sami.) Prav tako pa dobimo, ko seštejemo niza "1" in "1" niz "11". "1" in "1" torej ni "2", temveč "11".

Nikar ne zamudimo priložnosti za še eno napako!

>>> 1 + "1" Traceback (most recent call last): File "<interactive input>", line 1, in <module> TypeError: unsupported operand type(s) for +: 'int' and 'str' Seštevanje je operacija, zato tistemu, kar je levo in desno od + pravimo operanda. Sporočilo pravi, da seštevanje ne podpira operandov tipov int in str; dve števili ali dva niza bi znal sešteti, te kombinacije pa ne. Mimogrede, obratni vrstni red da nekoliko drugačno sporočilo: >>> "1" + 1 Traceback (most recent call last): File "<interactive input>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects Stikanje (concatenation) je le drugo ime za seštevanje nizov; sporočilo pravi, da ne moremo stakniti niza in števila.

Ker nam bo prišlo vsak čas prav, povejmo, kako iz niza dobimo število. Recimo, torej, da imamo a = "1" in b = "2". Radi bi ju sešteli - vendar zares, tako da bomo dobili 3, ne "12". Za to ju moramo najprej (ali pa sproti) spremeniti v števili. Iz niza dobimo število tako, da pokličemo funkcijo int ali float; obe funkciji pričakujeta kot argument niz, ki vsebuje neko število in kot rezultat vrneta celo (int) ali realno (float) število. (Tole bi bilo spodobno in pravično povedati: int in float v resnici nista funkciji, temveč nekaj drugega, a za potrebe prvih toliko in toliko predavanj, se bomo držali Pythonovega načela "Če hodi kot raca in gaga kot raca, potem je raca" ter ju brez slabe vesti oklicali za funkciji.)

>>> int("42") 42 >>> float("42") 42.0

Kar želimo, storimo na tri načine, vsak je poučen po svoje. Prvi:

>>> a = "1" >>> b = "2" >>> >>> aa = int(a) >>> bb = int(b) >>> aa + bb 3 Naredili smo dve novi spremenljivki, aa in bb, ki vsebujeta vrednosti a in b pretvorjene v števila. Nato ju seštejemo.

Drugi:

>>> a = "1" >>> b = "2" >>> >>> a = int(a) >>> b = int(b) >>> a + b 3 Tole je podobno kot prej, le da smo povozili stare vrednosti a in b z novimi, številskimi, namesto da bi števila zapisovali v druge spremenljivke.

Tretji:

>>> a = "1" >>> b = "2" >>> >>> int(a) + int(b) 3 Ker je int funkcija, lahko nastopa v izrazu; potrebe, da bi prepisovali številke v kake nove ali stare spremenljivke, niti ni.

Vpis in izpis

Doslej smo z računalnikom komunicirali tako, da smo tipkali ukaze v ukazno vrstico in če je imela reč kak rezultat (kot ima izraz 1 + 1 rezultat 2), ga je računalnik izpisal. Ukazna vrstica nam v Pythonu pogosto pride prav za kakšna preskušanja, ko programiramo zares, pa komunikacija z uporabnikom poteka drugače. Če hočemo, da računalnik kaj izpiše, mu moramo to posebej reči. Se pravi, ko bomo programirali, ne bomo napisali le 1 + 1 temveč "izpiši, koliko je 1 + 1".

Rekli smo, da funkcije pri programiranju niso nekaj takšnega kot funkcije v matematiki: funkcije v matematiki imajo določeno vrednost pri določenih argumentih (še huje, funkcije so pravilo, ki vsakemu elementu kodomene določi ... ah, pustimo). "Naše" funkcije pa nekaj delajo in včasih vrnejo kakšen rezultat, recimo številko ali niz ali kaj tretjega. Ena od teh funkcij je namenjena izpisovanju: če jo pokličemo, izpiše tisto, kar smo ji dali kot argument. Imenuje se print. Za razliko od, recimo, abs, ki zahteva en argument, število, in vrne njegovo absolutno vrednost, ali pow, ki hoče natanko dva argumenta, lahko damo printu poljubno število argumentov - številke, nize ali še kaj tretjega -, pa jih bo lepo izpisala.

>>> print(1+1, 27, "benjamin") 2 27 benjamin >>> print(napoved_zac, mat, "pa", dez, "in", 18, "stopinj") Jutri bosta matematika pa dez in 18 stopinj

Med reči, ki jih izpiše, bo print, če ne zahtevamo drugače, postavil presledke.

Druga funkcija, ki nam bo prišla prav, prosi uporabnika, da vpiše kako reč. Kot argument pričakuje niz, vprašanje, ki ga želimo zastaviti uporabniku. Kot rezultat "izračuna" vrne niz, ki ga je vpisal uporabnik.

>>> geslo = input("Geslo? ") Geslo? FR1.ru135 >>> geslo 'FR1.rul35'

(V drugi vrstici se geslo, FR1.ru135, ne izpiše, temveč ga vtipka uporabnik.)

Prvi čisto pravi program

Sestavimo tole: računalnik naj uporabnika prosi za temperaturo v Celzijevih stopinjah in računalnik mu bo izpisal, koliko je to v Kelvinih in koliko v Fahrenheitih. Iz Celzijev dobimo Kelvine tako, da jim prištejemo 273.15, Fahrenheite pa tako, da jih pomnožimo z 9/5 in prištejemo 32 (kogar zanima še kaj, naj pogleda na Wikipedijo).

>>> temp_C = input("Temperatura [C]? ") Temperatura [C]? 18 >>> temp_K = temp_C + 273.15 Traceback (most recent call last): File "<interactive input>", line 1, in <module> TypeError: cannot concatenate 'str' and 'float' objects

Damn. Funkcija input vrne niz, ki ga je vpisal uporabnik. Četudi utegne ta izgledati kot številka, je še vedno niz in k nizom ni mogoče prištevati števil. Storimo lahko, kot smo videli, troje: naredimo novo spremenljivko, na primer, temp_Cf = float(temp_C), povozimo staro z temp_Cf = float(temp_C) ali pa pretvorbo opravimo kar sproti, tako da računamo temp_K = float(temp_C) + 273.15. Izmed naštetih možnosti se odločimo za četrto in niz pretvorimo, čim ga uporabnik vpiše. Ponovimo torej vso vajo.

>>> temp_C = float(input("Temperatura [C]? ")) Temperatura [C]? 18 >>> temp_K = temp_C + 273.15 >>> temp_F = temp_C * 5/9 + 32 >>> print(temp_C, "C je enako", temp_K, "K ali", temp_F, "F") 18.0 C je enako 291.15 K ali 42.0 F

Vse, kar smo počeli doslej, vključno s tem zgoraj, je kramljanje z računalnikom, To ni pravi program. "Pravi program" je nekaj, kar poženeš in te vpraša, kar te ima vprašati ter izpiše, kar ima izpisati.

Doslej torej nismo bili pravi programerji, temveč le čveke. Zdaj pa končno postanimo pravi programerji.

Kako to naredimo, je odvisno od tega, kakšna okolja za Python smo si namestili. Če imamo PythonWin, PyScripter, PyCharm ali kaj podobnega, je v okviru okolja tudi preprost urejevalnik, v katerega vpišemo besedilo. Če ga nimamo, vzamemo kar (bognedaj) Notepad ali (bogdaj) Notepad++, na Linuxu pa, kar pač imamo (vi, nano, gedit,,,), neprimeren pa je, recimo Word ali Open Office. Vanj vtipkamo vse, kar smo prej ukazovali v ukazni vrstici.

Besedilo (ki je v resnici program) shranimo pod imenom temperatura.py (v nekaterih okoljih, recimo PyCharmu, moramo ime datoteke povedati že prej, v drugih, recimo PythonWinu, preden jo shranimo). Zdaj program poženimo. V PythonWinu pritisnemo Ctrl-R, v PyCharmu na Windowsih Ctrl-Shift-F10, drugod pa, kar je pač treba. Ko program "poženemo", računalnik lepo po vrsti izvede vse zapisane ukaze: vpraša nas po temperaturi, izračuna temperaturo v Kelvinih, izračuna temperaturo v Fahrenheitih in potem vse skupaj izpiše.

Kje ali kaj je program

[[Uporabniki Linuxa naj čisto na začetek, pred prvo vrstico dodajo #!/usr/bin/env python. (Če slučajno ne vedo, zakaj, naj pogledajo, kaj je shebang. Če ne vedo in jih tudi ne zanima, ne vem, zakaj imajo Linux in jim priporočam, da si čimprej kupijo Maca ali prepišejo na FDV.) (Saj res, tudi na Macu bo potrebno dodati shebang. V tem primeru ena alternativa, Mac, odpade.)]]

Kar smo natipkali v razvojnem okolju ali, bognedaj, Notepadu, je besedilna datoteka, ki je shranjena nekje na disku. Kot se vidi na gornji sliki, je moja datoteka v c:\PycharmProjects\predpredavanja, ime pa ji je temperature.py. Če pogledamo v ta direktorij in poklikamo ime datoteke, kot da jo hočemo odpreti, se bo izvedla, tako kot prej; program nas bo vprašal po temperaturi, izračunal in izpisal, kar je treba in se potem končal in zaprl. Slednje naj nas ne moti, programov tako ali tako ne bomo poganjali na ta način - vsaj ne, dokler tega ne bomo znali narediti tako, da se ne bodo prehitro končevali.

Последна промена: сабота, 22 септември 2012, 14:34