Kratek ubenik Interaktivna lupina Osnovni tipi tevila nizi
Kratek učbenik Interaktivna “lupina" Osnovni tipi: števila, nizi Vsebovalniki: seznami, slovarji, tuples Spremenljivke Krmilne strukture Funkcije in procedure Razredi in primerki (instance) Moduli in paketi Izjeme Datoteke in standardna knjižnica
Interaktivna “lupina” Lahkotno učenje jezika Lahkotno preskušanje knjižnic Lahkotno preskušanje lastnih modulov Stavke tipkamo kot odgovor na “prompt”: >>> print “Pozdrav vsem" Pozdrav vsem >>> x = 12**2 >>> x/2 72 >>> # to je komentar
Števila Običajne stvari • 12, 3. 14, 0 x. FF, 0377, (-1+2)*3/4**5, abs(x), 0<x<=5 Pomikanje in maskiranje v stilu C • 1<<16, x&0 xff, x|1, ~x, x^y Celoštevilčno deljenje • 1/2 -> 0 # 1. /2. -> 0. 5, float(1)/2 -> 0. 5 Dolga cela števila, kompleksna števila • 2 L**100 -> 1267650600228229401496703205376 L • 1 j**2 -> (-1+0 j)
• • • Nizi "helloworld" "hello"+"world" # konkatenacija "hello"*3 "hellohello" # ponavljanje "hello"[0] "h" # indeksiranje "hello"[-1] "o" # (od konca) "hello"[1: 4] "ell" # del len("hello") 5 # velikost "hello" < "jello" 1 # primerjanje "e" in "hello" 1 # iskanje "escapes: n etc, 33 etc, if etc" 'single quotes' """triple quotes""" r"raw strings"
Seznami Fleksibilna polja, • a = [99, "bottles of beer", ["on", "the", "wall"]] Isti operatorji kot za nize • a+b, a*3, a[0], a[-1], a[1: ], len(a) Prirejanje enot in delov enot • a[0] = 98 • a[1: 2] = ["bottles", "of", "beer"] -> [98, "bottles", "of", "beer", ["on", "the", "wall"]] • del a[-1] # -> [98, "bottles", "of", "beer"]
Še več operacij s seznami >>> a = range(5) >>> a. append(5) >>> a. pop() 5 >>> a. insert(0, 42) >>> a. pop(0) 5. 5 >>> a. reverse() >>> a. sort() # [0, 1, 2, 3, 4] # [0, 1, 2, 3, 4, 5] # [0, 1, 2, 3, 4] # [42, 0, 1, 2, 3, 4] # [4, 3, 2, 1, 0] # [0, 1, 2, 3, 4]
Slovarji Hash tabele, "asociativna polja" d = {"duck": "eend", "water": "water"} Lookup: d["duck"] -> "eend" d["back"] # sprozi Key. Error exception Delete, insert, overwrite: del d["water"] # {"duck": "eend", "back": "rug"} d["back"] = "rug" # {"duck": "eend", "back": "rug"} d["duck"] = "duik" # {"duck": "duik", "back": "rug"}
Še več operacij s slovarji Ključi, vrednosti, elementi: d. keys() -> ["duck", "back"] d. values() -> ["duik", "rug"] d. items() -> [("duck", "duik"), ("back", "rug")] Preverjanje prisotnosti: d. has_key("duck") -> 1; d. has_key("spam") -> 0 • Values of any type; keys almost any {"name": "Guido", "age": 43, ("hello", "world"): 1, 42: "yes", "flag": ["red", "white", "blue"]}
Podrobnosti o seznamih Ključev ne smemo spreminjati: – števila, nizi, tuples konstant • Po tvorbi jih ne smemo več spreminjati – Razlog je hashing (tehnika hitrega iskanja) – ne seznami ali drugi slovarji • Te tipe objektov lahko spreminjamo “na mestu" – Ni omejitev pri vrednostih Ključe lahko navajamo v poljubnem zaporedju – Spet zaradi hashing
Tuples ključ = (priimek, ime) tocka = x, y, z # lahko tudi z oklepaji x, y, z = tocka # razpakiranje lastname = key[0] singleton = (1, ) # vejica na koncu!!! empty = () # oklepaji! V primerjavi tuples s seznami tuples niso spremenljivi
Spremenljivke Ni potrebna deklaracija Potreba po prirejanju (inicializacija) • Uporaba neinicializiranih spremenljivk povzroči izjemo Ni tipov if prijateljsko: pozdrav = “Dober dan" else: pozdrav = 12**2 print pozdrav Vse so “spremenljivke": • Tudi funkcije, razredi, moduli
Pomen referenc Prirejanje dela z referencami • x = y #ne naredi kopije y • x = y # x naslavlja objekt, ki ga naslavlja y Zelo uporabno; toda previdnost! Primer: >>> a = [1, 2, 3] >>> b = a >>> a. append(4) >>> print b [1, 2, 3, 4]
Spreminjanje souporabljenega seznama a = [1, 2, 3] a 1 2 3 a b=a b a a. append(4) b 4
Spreminjanje celoštevilčnega podatka a=1 a b=a 1 b a new int object created by add operator (1+1) 2 a = a+1 b 1 old reference deleted by assignment (a=. . . )
Krmilne strukture if pogoj: stavki [elif pogoj: stavki]. . . else: stavki while pogoj: stavki for var in zaporedje: stavki break continue
Zamik skupin V jeziku Python: V jeziku C: for i in range(20): if i%3 == 0: print i if i%5 == 0: print “Zadetek!" print "---" for (i = 0; i < 20; i++) { if (i%3 == 0) { printf("%dn", i); if (i%5 == 0) { printf(“Zadetek!n"); } } printf("---n"); } 0 Zadetek! ------3 ------6 ------9 ------12 ------15 Zadetek! ------18 -----
Funkcije, Procedure def ime(arg 1, arg 2, . . . ): """dokumentacija""" # opcijski opis stavki return izraz # iz procedure # iz funkcije
Primer funkcije def gcd(a, b): "greatest common divisor" while a != 0: a, b = b%a, a # paralelno prirejanje return b >>> gcd. __doc__ 'greatest common divisor' >>> gcd(12, 20) 4
Razredi class ime: "dokumentacija" stavki -aliclass ime(osnova 1, osnova 2, . . . ): . . . Stavki so večinoma definicije metod: def ime(self, arg 1, arg 2, . . . ): . . . Lahko pa so tudi prireditve rezrednih spremenljivk
Primer razreda class Sklad: “zelo znana podatkovna struktura…" def __init__(self): self. items = [] def push(self, x): self. items. append(x) def pop(self): x = self. items[-1] del self. items[-1] return x # konstructor # ni omejitve # kaj se zgodi, ce je prazen? def empty(self): return len(self. items) == 0 # Boolov rezultat
Uporaba razredov Primerek tvorimo preprosto s klicem konstruktorja: x = Sklad() # Ni operatorja 'new'! Klicanje metod primerka z uporabo notacije s piko: x. empty() # -> 1 x. push(1) # [1] x. empty() # -> 0 x. push("hello") # [1, "hello"] x. pop() # -> "hello" # [1] Uporaba spremenljivk primerka s pomočjo notacije s piko: x. items # -> [1]
Dedovanje class Poseben. Sklad (Sklad): “sklad z dodano možnostjo vpoglrda v spodnje elemente" def peek(self, n): "peek(0) vrne zgornji element; peek(-1) vrne element pod njim itd. " velikost = len(self. items) assert 0 <= n < velikost # test predpogoj return self. items[velikost 1 -n]
Dedovanje (2) class Omejen. Sklad(Poseben. Sklad): “Poseben. Sklad z omejitvijo velikosti sklada" def __init__(self, limit): self. limit = limit Poseben. Sklad. __init__(self) # Konstruktor dedovanega razreda def push(self, x): assert len(self. items) < self. limit Poseben. Sklad. push(self, x) # klic metode dedovanega razreda
Spremenljivke primerkov in razredov class Connection: verbose = 0 # spremenljivka razreda def __init__(self, host): self. host = host # spremenljivka primerka def debug(self, v): self. verbose = v # tvorba spremenljivke primerka! def connect(self): if self. verbose: # spremenljivka razreda ali primerka? print "connecting to", self. host
Pravila za spremenljivke primerka Pri uporabi primerka (self. x) je vrstni red iskanja: – (1) primerek, (2) razred, (3) dedovani razredi – Tako je tudi pri iskanju metod Pri prirejanju preko primerka (self. x =. . . ): – Vedno tvorimo spremenljivko primerka Razredne spremenljivke lahko uporabljamo v primerkih Toda. . . ! – Razredna spremenljivka: ena kopija, ki jo uporabljajo vsi – Spremenljivka primerka: vsak primerek ima svojo
Moduli Zbirka stvari v datoteki blabla. py file – funkcije, razredi, spremenljivke Uvoz modulov: – import re; print re. match("[a-z]+", s) – from re import match; print match("[a-z]+", s) Uvoz s preimenovanjem: – import re as regex – from re import match as m
Paketi Zbirka modulov v direktoriju Imeti moramo datoteko __init__. py Lahko imamo podpakete Sintaksa za uvoz: – – from P. Q. M import foo; print foo() from P. Q import M; print M. foo() import P. Q. M; print P. Q. M. foo() import P. Q. M as M; print M. foo() # new
Lovljenje izjem def deljenje(x): return 1/x def bar(x): try: print deljenje(x) except Zero. Division. Error, message: print “Ne morem deliti z 0: ", message bar(0)
Try-finally: Čiščenje f = open(file) try: process_file(f) finally: f. close() # se vedno izvede print "OK" # se izvede le ob uspehu
Proženje izjem • • raise Index. Error("k out of range") raise Index. Error, "k out of range" try: nekaj naredi except: # lovimo karkoli print "Oops" raise # reraise
Objekti File f = open(filename[, mode[, buffersize]) – mode je lahko "r", "w", "a" (kot pri C); privzeto "r" – append "b" za text translation mode – append "+" za read/write open – buffersize: 0=unbuffered; 1=line-buffered; buffered metode: – read([nbytes]), readline(), readlines() – write(string), writelines(list) – seek(pos[, how]), tell() – flush(), close() – fileno()
Jedro: Standardna knjižnica – os, sys, string, getopt, String. IO, struct, pickle, . . . Regularni izrazi: – re module; pravila ujemanja v stilu Perl-5 Internet: – socket, rfc 822, httplib, htmllib, ftplib, smtplib, . . . Razno: – pdb (debugger), profile+pstats – Tkinter (Tcl/Tk vmesnik), audio, *dbm, . . .
- Slides: 33