summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--python/problems/introduction/intro_sl.html587
-rw-r--r--python/problems/introduction/sl.py4
-rw-r--r--python/sl.py6
3 files changed, 591 insertions, 6 deletions
diff --git a/python/problems/introduction/intro_sl.html b/python/problems/introduction/intro_sl.html
new file mode 100644
index 0000000..345b94c
--- /dev/null
+++ b/python/problems/introduction/intro_sl.html
@@ -0,0 +1,587 @@
+<!DOCTYPE html>
+<html lang="sl">
+<head>
+ <meta charset="utf-8" />
+ <title></title>
+ <link rel="stylesheet" type="text/css" href="/css/codeq.css" />
+ <link rel="stylesheet" type="text/css" href="../../style.css" />
+</head>
+<body>
+
+<h1>Uvod v Python</h1>
+
+<h2>Moj računalnik je lahko tudi kalkulator</h2>
+
+<p> Sledi kratek povzetek zapiskov predavanj prof. Demšarja.
+ Celotne zapiske najdete na
+ <a href="https://ucilnica.fri.uni-lj.si/course/view.php?id=166">spletni
+ učilnici</a>.</p>
+
+<p>V konzoli lahko Python uporabljamo kot kalkulator.</p>
+
+<pre>
+>>> 1 + 1
+2
+>>> 2 * 3
+6
+>>> 1+2 * 3+1
+8</pre>
+
+<p>Temu, kar smo vpisovali, pravimo <i>izraz</i>. Izraz je nekaj, kar se da
+izračunati. In Python to tudi izračuna, 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, zato je zapis zavajajoč. Python je dovolj pameten, da ve, da ima
+ <em>operator</em> (še ena beseda, ki si jo zapomnimo!) množenja prednost
+ pred operatorjem seštevanja. Kar smo napisali, se računa enako, kot če bi
+ rekli
+ <code> 1+2*3+1</code>
+ali
+<code> 1 + 2*3 + 1</code>
+ali
+<code> 1 + 2 * 3 + 1</code>
+
+<p>Zaenkrat pišite, kako vam je ljubše, dokler se ne dogovorimo za zadnje.</p>
+
+<p>Kakšni operatorji so nam še na voljo? Očitna sta še <code>/</code> za
+ deljenje in <code>-</code> za odštevanje. Dvojna zvezdica, <code>**</code>,
+ pomeni potenciranje (mednju ne smemo napisati presledka, <code>**</code> je
+ kot, recimo, ena <em>beseda</em>). Operator <code>%</code> izračuna ostanek
+ po deljenju.</p>
+
+<pre>
+>>> 5 ** 2
+25
+>>> 3 ** 4
+81
+>>> 13 % 5
+3</pre>
+
+<p>Potenciranje ima prednost pred vsem, kar poznamo doslej. Kadar je treba,
+ pa lahko uporabimo oklepaje.</p>
+
+<pre>>>> (4 + 5) * 4
+36</pre>
+
+<p>Če ostane kak oklepaj odprt, Python ne izračuna izraza, saj ve, da ga še
+ nismo dokončali. Namesto <code>&gt;&gt;&gt;</code> pokaže tri pike in
+ dovoli, da nadaljujemo izraz.</p>
+
+<pre>>>> (4 + 2 * (3
+... + 8)-
+... 2)
+24</pre>
+
+<p>Ni lepo, a prišlo nam bo še zelo prav, boste videli.</p>
+
+<p>Pri množenju je nujno uporabiti zvezdico. Se pravi, pisati moramo
+ <code>7 * (2 + 3)</code> in ne <code>7(2 + 3)</code>.</p>
+
+<p>Za deljenje imamo poleg operatorja <code>/</code> tudi <code>//</code>, ki
+ deli celoštevilsko.</p>
+
+<pre>>>> 4.5 // 1.2
+3.0
+>>> 7 // 2
+3</pre>
+
+<p>1.2 gre v 4.5 trikrat ... in še malo ostane. A celoštevilskega deljenja
+ ostanek ne zanima.</p>
+
+<p>Naslednja pomembna reč so "podatkovni tipi".
+ Točneje, spoznali smo dva podatkovna tipa <em>cela števila</em> in
+ <em>števila s plavajočo vejico</em>. V angleščini se jima reče
+ <em>integer</em> in <em>floating point number</em> v Pythonu pa
+ <code>int</code> in <code>float</code>. Odkod ta čudna imena boste izvedeli
+ pri kakem drugem predmetu.</p>
+
+<p>Vsaka reč v Pythonu je reč nekega tipa, in če je ta reč število, je bodisi
+ tipa <code>int</code> bodisi <code>float</code>. </p>
+
+<h2>Moj računalnik je lahko tudi kalkulator - s spominom</h2>
+
+<p>Izračunali bomo, koliko je 2 + 3 in rekli računalniku, naj si to zapomni.</p>
+
+<code> x = 2 + 3</code>
+
+<p>Temu, kar smo napisali tu, pravimo <em>prireditveni stavek</em>, saj smo z
+ njim x-u priredili vrednost izraza 2+3.</p>
+
+<p>Da hočemo nekaj prirejati povemo z enačajem (očitno). Na njegovi desni je
+ nek izraz - torej nekaj, kar se da izračunati. Včasih bo to <code>2 +
+ 3</code>, včasih bo kaj veliko
+ bolj zapletenega, včasih bo na desni strani samo številka, kot, recimo, v
+ prirejanju <code>x = 42</code>. Python bo, tako kot v našem dosedanjem
+ igranju z njim, izračunal tisto na desni in dobil <code>5</code> ali
+ <code>42</code> ali karkoli že.</p>
+
+<p>Na levi strani enačaja je neko ime. Temu pravimo spremenljivka (ang. variable)
+ Python bo temu imenu (recimo
+ <code>x</code>) priredil tisto, kar je izračunal.</p>
+
+<p>Python tokrat ni izpisal ničesar v odgovor. Rezultat si je le zapomnil,
+ shranil ga je pod imenom <code>x</code>. Kaj lahko počnemo s tem
+ <code>x</code>? Lahko ga uporabljamo v drugih izrazih.</p>
+
+<pre>
+>>> x + 7
+12
+>>> x ** 2
+25
+>>> 13 % x
+3
+>>> x
+5</pre>
+
+<p>Kadar rečem <code>x</code>, Python poišče, tisto, kar je priredil
+ <code>x</code>-u. Če smo <code>x</code>-u priredili 5 in rečemo
+<code>x + 7</code>, je to isto, kot če bi rekli <code>5 + 7</code>.</p>
+
+<pre>>>> y = x + 2
+>>> y
+7</pre>
+
+<p>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 <em>x</em> ne more biti v eni vrstici 5, v
+ naslednji pa 8. Pri programiranju pa s tem ni težav.</p>
+
+<pre>>>> x = 5
+>>> x
+5
+>>> x = 8
+>>> x
+8</pre>
+
+<p>Še huje. Če matematiki ne bi znali programirati (pa navadno znajo in to
+ dobro), bi jih utegnilo povsem pretresti tole:
+<pre>>>> x = 5
+>>> x = x + 2
+>>> x
+7</pre>
+
+<h2>Poglavje polno napak</h2>
+
+<p>Pri programiranju boste delali precej napak. To je neizogibno. Poglejmo
+ si nekaj primerov.</p>
+
+<p>Postavimo, najprej, <code>a</code> na <code>7</code> in izračunajmo
+ <code>a + b</code>.
+
+<pre>>>> a = 7
+>>> a + b
+Traceback (most recent call last):
+ File "<console>", line 1, in <module>
+NameError: name 'b' is not defined</pre>
+
+ <p>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: <code>name 'b' is not defined</code>. Pozabili smo
+ <em>definirati</em> <code>b</code>, pozabili smo mu dati vrednost.</p>
+
+<p>Kaj pa tole?</p>
+
+<pre>>>> 7 = a
+ File "<console>", line 1
+SyntaxError: can't assign to literal</pre>
+
+<p>Človek, vajen matematike, bi si mislil, da je <code>a = 7</code> in
+ <code>7 = a</code> eno in isto. V matematiki da, pri programiranju (v
+ normalnih jezikih) pa ne, saj enačaj pomeni prirejanje; v prvem primeru
+ priredimo <code>a</code>-ju 7, v drugem primeru pa hočemo sedmici prirediti
+ <code>a</code>, kar seveda ne gre. To ima natanko toliko smisla, kot če bi
+ napisali <code>1 = 2</code>. (Še več, Python nas bo po prstih celo, če bomo
+ napisali <code>1 = 1</code>. 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.</p>
+
+<p>Pridelajmo še eno napako.</p>
+
+<pre>>>> True = 12
+ File "<console>", line 1
+SyntaxError: assignment to keyword</pre>
+
+<p>Beseda <code>True</code> ima poseben pomen in je ni mogoče uporabljati kot
+ spremenljivko. Takšnim besedam pravimo ključne besede (<em>keywords</em>).
+ 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, <code>if</code> in
+ <code>in</code>:
+
+<pre>>>> if = 7
+ File "<console>", line 1
+ if = 7
+ ^
+SyntaxError: invalid syntax
+>>> in = 7
+ File "<console>", line 1
+ in = 7
+ ^
+SyntaxError: invalid syntax</pre>
+
+<p>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 je dokončno obupal nad nami.</p>
+
+<p>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
+ <code>if</code> kot ime spremenljivke in še kak teden kasneje vam bo stavek
+ <code>if = 1</code> videti grotesken. </p>
+
+
+<h2>Moj kalkulator ima tudi funkcije</h2>
+
+<p>Tako kot spremenljivke, ki v programiranju ne pomenijo čisto istega kot v
+ matematiki, tudi beseda
+ <em>funkcija</em> (<em>function</em>) ne pomeni povsem istega.
+ Videti pa je zelo podobno. Imamo,
+ recimo, funkcijo <code>abs</code>, ki izračuna absolutno vrednost števila.
+</p>
+
+<pre>>>> abs(-2.8)
+2.8</pre>
+
+<p>Ali pa <code>pow</code>, ki naredi isto kot operator <code>**</code>.</p>
+
+<pre>>>> pow(2, 3)
+8</pre>
+
+<p>Za razliko od matematikov, ki na funkcijo gledajo kot da <em>ima določeno
+ vrednost pri določenih parametrih</em>, računalnik <em>izračuna vrednost
+ funkcije</em>, za kar moramo <em>poklicati funkcijo</em>. Se pravi, v
+ zadnji vrstici smo <em>poklicali</em> funkcijo <code>pow</code> in ji
+ <em>podali</em> dva <em>argumenta</em>, 2 in 3. Funkcija je izračunala
+ vrednost in jo <em>vrnila</em>.</p>
+
+<p>Tudi klic funkcije, <code>pow(2, 3)</code>, je izraz. Kot katerikoli drugi
+ izraz lahko tudi <code>pow</code> in <code>abs</code> nastopata kot del
+ izraza.</p>
+
+<pre>>>> (pow(2, 3) + 2) / 5
+2.0
+>>> pow(2, 3) + abs(-2)
+10</pre>
+
+<p>In argumenti funkcij so lahko prav tako izrazi.</p>
+
+<pre>>>> x = 1
+>>> yy = pow(abs(-2), x * 3)
+>>> yy
+8</pre>
+
+<h2>Nizi</h2>
+
+<p>Niz (<em>string</em>) je zaporedje znakov. 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.</p>
+
+<pre>>>> "Tole je primer niza."
+'Tole je primer niza.'
+>>> "Tole je pa še en primer niza."
+'Tole je pa še en primer niza.'</pre>
+
+<p>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 <em>res</em> vseeno.)</p>
+
+<p>Tudi nize lahko priredimo spremenljivkam.</p>
+
+<pre>>>> napoved = "Jutri bosta matematika pa dež"
+>>> napoved
+'Jutri bosta matematika pa dež'</pre>
+
+<p>Celo seštevamo jih lahko.</p>
+
+<pre>>>> "Jutri bosta " + "matematika" + " pa " + "dež"
+'Jutri bosta matematika pa dež'</pre>
+
+<p>Ali pa oboje
+<pre>>>> napoved_zac = "Jutri bosta "
+>>> mat = "matematika"
+>>> dez = "dez"
+>>> napoved_zac + mat + " pa " + dez
+'Jutri bosta matematika pa dez'</pre>
+
+<p>Kako zapleten račun! Predvsem ne spreglejte, da smo dali besedo "pa" pod
+ narekovaje, saj so <code>napoved_zac</code>, <code>mat</code>,
+ <code>dez</code> spremenljivke (ki so v resnici nizi), <code>" pa "</code>
+ pa je niz kar tako. To je nekako tako, kot če bi, ko smo se igrali s
+ številkami, pisali</p>
+
+<pre>>>> x = 1
+>>> y = 3
+>>> x + 2 + y
+6</pre>
+
+<p>V zadnji vrstici sta <code>x</code> in <code>y</code> spremenljivki (ki
+ sta v resnici številki), <code>2</code> pa je številka kar tako.</p>
+
+<p>Kaj pa, če bi slučajno pozabili narekovaje?</p>
+
+<pre>>>> napoved_zac + mat + pa + dez
+Traceback (most recent call last):
+ File "<console>", line 1, in <module>
+NameError: name 'pa' is not defined</pre>
+
+<p>Jasno? Brez narekovajev je <code>pa</code> ime spremenljivke - in to takšne,
+ ki še ni definirana. To je tako, kot če bi namesto</p>
+
+<code>ime = "Benjamin"</code>
+
+<p>kar je pravilno, rekli</p>
+
+<pre>>>> ime = Benjamin
+Traceback (most recent call last):
+ File "<console>", line 1, in <module>
+NameError: name 'Benjamin' is not defined</pre>
+
+<p>Seveda pa lahko (z malim prekrškom enega pravila - katerega že?):</p>
+
+<pre>>>> Benjamin = "otrok solza"
+>>> ime = Benjamin
+>>> ime
+'otrok solza'</pre>
+
+<p>a, istočasno</p>
+
+<pre>>>> ime = "Benjamin"
+>>> ime
+'Benjamin'</pre>
+
+Jasno? Prvič imamo spremenljivko <code>Benjamin</code>, drugič pa niz, v
+katerem je besedilo Benjamin. Ko ni narekovajev, imamo spremenljivko, ko so,
+pa niz.</p>
+
+<pre>>>> napoved = Jutri bosta matametika pa dež
+Traceback ( File "<interactive input>", line 1
+ napoved = Jutri bosta matemetika pa dež
+ ^
+SyntaxError: invalid syntax</pre>
+
+<p>Tule računalnik trpi še bolj. Ne le, da so <code>Jutri</code>,
+ <code>bosta</code>, <code>matematika</code>, <code>pa</code> in
+ <code>dež</code> 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.</p>
+
+<p>Gornje je tako, kot da bi rekli</p>
+
+<pre>>>> x = 1
+>>> y = 2
+>>> z = 3
+>>> x y z
+ File "<console>", line 1
+ x y z
+ ^
+SyntaxError: invalid syntax</pre>
+
+<p>Ubogemu računalniku pač ni jasno, kaj bi z <code>x</code>, <code>y</code> in
+ <code>z</code> ter zakaj mu jih naštevamo.</p>
+
+<p>Zakaj pa smo prejle rekli, da uporabimo tiste narekovaje, ki so bolj
+ <em>praktični</em>? Čemu bi bili kakšni narekovaji bolj praktični od
+ drugih?</p>
+
+<pre>>>> "Cesar vpraša nekoliko nevoljen: "Kaj neki?""
+Traceback ( File "<interactive input>", line 1
+ "Cesar vpraša nekoliko nevoljen: "Kaj neki?""
+ ^
+SyntaxError: invalid syntax</pre>
+
+<p>Ni potrebno biti posebno pameten, da vidimo, kaj ga je (namreč Pythona, ne
+ Cesarja) onesrečilo tokrat. Ko vidi prvi narekovaj, ve, da gre za niz. Ko
+ pride do naslednjega narekovaja, se niz, tako méni, niz konča. In potem se
+ seveda zmede, ker nizu sledi nekaj, kar ni podobno ničemur. Zdaj pa
+ poskusimo z enojnimi narekovaji.</p>
+
+<pre>>>> 'Cesar vpraša nekoliko nevoljen: "Kaj neki?"'
+'Cesar vpraša nekoliko nevoljen: "Kaj neki?"'</pre>
+
+<p>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 recimo dvopičje in vprašaj. O tej temi bi lahko napisali še marsikaj,
+ vendar se za zdaj ustavimo.</p>
+
+
+<h2>Iz nizov v števila</h2>
+
+<p>Da se reč usede, meditirajmo ob naslednjih vrsticah:</p>
+
+<pre>>>> up = 1 + 1
+>>> down = "1 + 1"
+>>> strange = "1" + "1"</pre>
+
+<p>Kakšne so po tem vrednosti spremenljivk <code>up</code>, <code>down</code>
+ in <code>strange</code>? Sploh pa, je vse troje legalno ali pa bo Python
+ spet kaj stokal?</p>
+
+<p>V prvo nimamo dvomov, vrednost <code>up</code> mora biti enaka 2 (in tudi
+ je). Drugo? <code>"1 + 1"</code> je niz; spremenljivki <code>down</code>
+ smo priredili niz <code>"1 +1"</code>, 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 <code>ime = "Benjamin"</code> ne poskuša izračunati,
+ "koliko" je Benjamin. <code>"1 + 1"</code> je niz, kot vsak drugi, čeprav je
+ slučajno podoben računu.</p>
+
+<p>Najbolj zanimivo je tretje. Preden razrešimo vprašanje, se vprašajmo nekaj
+ drugega. Recimo
+
+<pre>>>> ana = "Ana"
+>>> benjamin = "Benjamin"
+>>> r = ana + benjamin</pre>
+
+<p>Kaj dobimo, če seštejemo Ano in Benjamina. (Tončka? Brez duhovičenja, to so
+ resne reči.) Spremenljivka <code>r</code> bo imela vrednost
+ <code>"AnaBenjamin"</code>. Glede tega smo si menda enotni, ne?
+ (Ako kdo misli, da bomo dobili <code>"Benjamin Ana"</code>, saj smo tudi
+ poprej imeli presledke ob oni študijsko-vremenski napovedi, naj pozorno
+ pregleda, kaj smo pisali ondi: vse presledke smo napisali sami.)</p>
+
+<p>No, potem pa vemom: ko seštejemo <em>niza</em> "1" in "1" niz "11". "1" in
+ "1" torej ni "2", temveč "11".</p>
+
+<p>Nikar ne zamudimo priložnosti za še eno napako!</p>
+<pre>>>> 1 + "1"
+Traceback (most recent call last):
+ File "<interactive input>", line 1, in <module>
+TypeError: unsupported operand type(s) for +: 'int' and 'str'</pre>
+
+<p>Seštevanje je operacija, zato tistemu, kar je levo in desno od <code>+</code>
+ pravimo operanda. Sporočilo pravi, da operator <code>+</code> ne podpira
+ operandov tipov <code>int</code> in <code>str</code> (<code>str</code> je
+ podatkovni tip, ki predstavlja nize). Dve števili ali dva niza bi znal
+ sešteti, te kombinacije pa ne. Mimogrede, obratni vrstni red da nekoliko
+ drugačno sporočilo:</p>
+
+<pre>>>> "1" + 1
+Traceback (most recent call last):
+ File "<interactive input>", line 1, in <module>
+TypeError: cannot concatenate 'str' and 'int' objects</pre>
+
+Stikanje (<em>concatenation</em>) je le drugo ime za seštevanje nizov; sporočilo
+pravi, da ne moremo stakniti niza in števila. Toliko, da boste vedeli, če
+naletite na to.</p>
+
+<p>Ker nam bo prišlo vsak čas prav, povejmo, kako iz niza dobimo število.
+ Recimo, torej, da imamo <code>a = "1"</code> in <code>b = "2"</code>. 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" <code>int</code> ali <code>float</code>; obe
+ funkciji pričakujeta kot argument niz, ki vsebuje neko število in kot
+ rezultat vrneta celo (<code>int</code>) ali realno (<code>float</code>)
+ število. </p>
+
+<pre>>>> int("42")
+42
+>>> float("42")
+42.0</pre>
+
+<p>Kar želimo, storimo na tri načine, vsak je poučen po svoje. Prvi:
+<pre>>>> a = "1"
+>>> b = "2"
+>>>
+>>> aa = int(a)
+>>> bb = int(b)
+>>> aa + bb
+3</pre>
+
+<p>Naredili smo dve novi spremenljivki, <code>aa</code> in <code>bb</code>, ki
+ vsebujeta vrednosti <code>a</code> in <code>b</code> pretvorjene v števila.
+ Nato ju seštejemo.</p>
+
+<p>Drugi:
+<pre>>>> a = "1"
+>>> b = "2"
+>>>
+>>> a = int(a)
+>>> b = int(b)
+>>> a + b
+3</pre>
+
+<p>Tole je podobno kot prej, le da smo povozili stare vrednosti <code>a</code> in
+ <code>b</code> z novimi, številskimi, namesto da bi števila zapisovali v
+ druge spremenljivke.</p>
+
+<p>Tretji:
+<pre>>>> a = "1"
+>>> b = "2"
+>>>
+>>> int(a) + int(b)
+3</pre>
+
+<p>Ker je <code>int</code> funkcija, lahko nastopa v izrazu; potrebe, da bi
+ prepisovali številke v kake nove ali stare spremenljivke, niti ni.</p>
+
+
+<h2>Vpis in izpis</h2>
+
+<p>Spoznali bomo funkcijo za izpisovanje: če jo pokličemo,
+ izpiše tisto, kar smo ji dali kot argument. Imenuje se <code>print</code>.
+ Za razliko od, recimo, <code>abs</code>, ki zahteva en argument, namreč
+ poljubno število, in vrne njegovo absolutno vrednost, ali <code>pow</code>,
+ ki hoče natanko dva argumenta, lahko damo <code>print</code>u poljubno
+ število argumentov - številke, nize ali še kaj tretjega -, pa jih bo lepo
+ izpisala.
+
+<pre>>>> 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</pre>
+
+<p>Druga funkcija prosi uporabnika, da vpiše kako reč.
+ Kot argument pričakuje niz, vprašanje, ki ga želimo zastaviti uporabniku.
+ Kot rezultat vrne niz, ki ga je vpisal uporabnik.</p>
+
+<pre>>>> geslo = input("Geslo? ")
+Geslo? FR1.ru135
+>>> geslo
+'FR1.rul35'</pre>
+
+<h2>Prvi čisto pravi program</h2>
+
+<p>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
+ <a href="http://en.wikipedia.org/wiki/Conversion_of_units_of_temperature">
+ Wikipedijo</a>).</p>
+
+<pre>
+>>> 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</pre>
+
+<p> Funkcija <code>input</code> vrne <em>niz</em>, ki ga je vpisal
+ uporabnik. Četudi utegne ta izgledati kot številka, je še vedno niz in k
+ nizom ni mogoče prištevati števil. Kot smo videli, lahko storimo troje:
+ naredimo novo spremenljivko, na primer,
+ <code>temp_Cf = float(temp_C)</code>, povozimo staro s
+ <code>temp_Cf = float(temp_C)</code> ali pa pretvorbo opravimo kar sproti,
+ tako da računamo <code>temp_K = float(temp_C) + 273.15</code>. Izmed
+ naštetih možnosti se odločimo za četrto in niz pretvorimo, čim ga uporabnik
+ vpiše. Ponovimo torej vso vajo. </p>
+
+<pre>
+>>> 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</pre>
+
+<p>Zdaj to napišite v okolju, kjer program lahko tudi poženete; npr. Pycharm ali
+pa v <span class="codeq">CodeQ</span> :) </p>
+
+</body>
+</html>
diff --git a/python/problems/introduction/sl.py b/python/problems/introduction/sl.py
index 403c941..ae5cc3e 100644
--- a/python/problems/introduction/sl.py
+++ b/python/problems/introduction/sl.py
@@ -1,3 +1,5 @@
name = 'Uvod'
-description = 'Izrazi, spremenljivke, funkcije, prvi program.'
+description = '''
+<a target="_blank" href="[%@resource intro_sl.html%]">Prvi koraki v Pythonu:</a>
+izrazi, spremenljivke, funkcije, prvi program.'''
diff --git a/python/sl.py b/python/sl.py
index 6bd3a0d..37d8b91 100644
--- a/python/sl.py
+++ b/python/sl.py
@@ -1,9 +1,5 @@
name = 'Python'
-description = '''\
-Naloge za
-<a href="https://ucilnica.fri.uni-lj.si/vsak" target="_blank">uvodni tečaj
-pythona</a>.
-'''
+description = ''' '''
general_msg = {
'error_head' : '''\