From 15871f8f3982fc7c5de03a68229235ea616c6419 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Mo=C5=BEina?= Date: Tue, 4 Oct 2016 16:30:01 +0200 Subject: Introductory text for the first section. --- python/problems/introduction/intro_sl.html | 587 +++++++++++++++++++++++++++++ python/problems/introduction/sl.py | 4 +- python/sl.py | 6 +- 3 files changed, 591 insertions(+), 6 deletions(-) create mode 100644 python/problems/introduction/intro_sl.html (limited to 'python') 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 @@ + + + + + + + + + + +

Uvod v Python

+ +

Moj računalnik je lahko tudi kalkulator

+ +

Sledi kratek povzetek zapiskov predavanj prof. Demšarja. + Celotne zapiske najdete na + spletni + učilnici.

+ +

V konzoli lahko Python uporabljamo kot kalkulator.

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

Temu, kar smo vpisovali, pravimo izraz. 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 + operator (š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 + 1+2*3+1 +ali + 1 + 2*3 + 1 +ali + 1 + 2 * 3 + 1 + +

Zaenkrat pišite, kako vam je ljubše, dokler se ne dogovorimo za zadnje.

+ +

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. Kadar je treba, + pa 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 >>> pokaže tri pike in + dovoli, da nadaljujemo izraz.

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

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

+ +

Pri množenju je nujno uporabiti zvezdico. Se pravi, pisati moramo + 7 * (2 + 3) in ne 7(2 + 3).

+ +

Za deljenje imamo poleg operatorja / 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.

+ +

Naslednja pomembna reč 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 v Pythonu pa + 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.

+ +

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.

+ +

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 2 + + 3, včasih bo kaj veliko + bolj zapletenega, včasih bo na desni strani samo številka, kot, recimo, v + prirejanju x = 42. Python bo, tako kot v našem dosedanjem + igranju z njim, izračunal tisto na desni in dobil 5 ali + 42 ali karkoli že.

+ +

Na levi strani enačaja je neko ime. Temu pravimo spremenljivka (ang. variable) + Python bo temu imenu (recimo + x) priredil tisto, kar je izračunal.

+ +

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 + 7
+12
+>>> x ** 2
+25
+>>> 13 % x
+3
+>>> x
+5
+ +

Kadar rečem x, Python poišče, tisto, kar je priredil + x-u. Če smo x-u priredili 5 in rečemo +x + 7, je to isto, kot če bi rekli 5 + 7.

+ +
>>> 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
+ +

Poglavje polno napak

+ +

Pri programiranju boste delali precej napak. To je neizogibno. Poglejmo + si nekaj primerov.

+ +

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

>>> a = 7
+>>> a + b
+Traceback (most recent call last):
+  File "", line 1, in 
+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 "", 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 hočemo sedmici prirediti + a, kar seveda ne gre. 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 "", 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 (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 "", line 1
+    if = 7
+       ^
+SyntaxError: invalid syntax
+>>> in = 7
+  File "", 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 je dokončno obupal nad nami.

+ +

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.

+ + +

Moj kalkulator ima tudi funkcije

+ +

Tako kot spremenljivke, ki v programiranju ne pomenijo čisto istega kot v + matematiki, tudi beseda + funkcija (function) 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
+ +

Nizi

+ +

Niz (string) 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.

+ +
>>> "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 (ki so v resnici nizi), " 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
+ +

V zadnji vrstici sta x in y spremenljivki (ki + sta v resnici številki), 2 pa je številka kar tako.

+ +

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

+ +
>>> napoved_zac + mat +  pa  + dez
+Traceback (most recent call last):
+  File "", line 1, in 
+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 "", line 1, in 
+NameError: name 'Benjamin' is not defined
+ +

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

+ +
>>> Benjamin = "otrok solza"
+>>> 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, +pa niz.

+ +
>>> napoved = Jutri bosta matametika pa dež
+Traceback (  File "", line 1
+    napoved = Jutri bosta matemetika 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 "", 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.

+ +

Zakaj pa smo prejle rekli, da uporabimo tiste narekovaje, 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 "", line 1
+    "Cesar vpraša nekoliko nevoljen: "Kaj neki?""
+                                        ^
+SyntaxError: invalid syntax
+ +

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.

+ +
>>> '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 recimo 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 kaj stokal?

+ +

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. "1 + 1" je niz, kot vsak drugi, čeprav je + slučajno podoben računu.

+ +

Najbolj zanimivo je tretje. Preden razrešimo vprašanje, se vprašajmo nekaj + drugega. Recimo + +

>>> ana = "Ana"
+>>> benjamin = "Benjamin"
+>>> r = ana + benjamin
+ +

Kaj dobimo, če seštejemo Ano in Benjamina. (Tončka? Brez duhovičenja, to so + resne reči.) Spremenljivka r bo imela vrednost + "AnaBenjamin". Glede tega smo si menda enotni, ne? + (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.)

+ +

No, potem pa vemom: 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 "", line 1, in 
+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 operator + ne podpira + operandov tipov int in str (str 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:

+ +
>>> "1" + 1
+Traceback (most recent call last):
+  File "", line 1, in 
+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. Toliko, da boste vedeli, če +naletite na to.

+ +

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.

+ +
>>> 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

+ +

Spoznali bomo funkcijo za izpisovanje: č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, namreč + poljubno š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
+ +

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.

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

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 "", line 1, in 
+TypeError: cannot concatenate 'str' and 'float' objects
+ +

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. Kot smo videli, lahko storimo troje: + naredimo novo spremenljivko, na primer, + temp_Cf = float(temp_C), povozimo staro s + 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
+ +

Zdaj to napišite v okolju, kjer program lahko tudi poženete; npr. Pycharm ali +pa v CodeQ :)

+ + + 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 = ''' +Prvi koraki v Pythonu: +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 -uvodni tečaj -pythona. -''' +description = ''' ''' general_msg = { 'error_head' : '''\ -- cgit v1.2.1