330 likes | 618 Views
Python. Kratek učbenik. I ntera ktivna “ lupina " Osnovni tipi : števila , nizi Vsebovalniki : seznami , slovarji , tuples Spremenljivke Krmilne strukture F un kcije in procedure Razredi in primerki (instance) Moduli in paketi Izjeme Datoteke in standardna knjižnica.
E N D
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, 0xFF, 0377, (-1+2)*3/4**5, abs(x), 0<x<=5 • Pomikanje in maskiranje v stilu C • 1<<16, x&0xff, 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 • 2L**100 -> 1267650600228229401496703205376L • 1j**2 -> (-1+0j)
Nizi • "hello"+"world" "helloworld"# konkatenacija • "hello"*3 "hellohellohello"# 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, \033 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) # [0,1,2,3,4] >>> a.append(5) # [0,1,2,3,4,5] >>> a.pop() # [0,1,2,3,4] 5 >>> a.insert(0, 42) # [42,0,1,2,3,4] >>> a.pop(0) # [0,1,2,3,4] 5.5 >>> a.reverse() # [4,3,2,1,0] >>> a.sort() # [0,1,2,3,4]
Slovarji • Hash tabele, "asociativna polja" d = {"duck": "eend", "water": "water"} • Lookup: d["duck"] -> "eend" d["back"] # sprozi KeyError 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 jehashing (tehnika hitrega iskanja) • neseznami 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 sseznami tuples niso spremenljivi
Spremenljivke • Ni potrebna deklaracija • Potreba po prirejanju (inicializacija) • Uporaba neinicializiranih spremenljivk povzroči izjemo • Ni tipov ifprijateljsko: pozdrav = “Dober dan" else: pozdrav = 12**2 printpozdrav • Vse so “spremenljivke": • Tudi funkcije, razredi, moduli
Pomen referenc • Prirejanje dela z referencami • x = y #ne naredi kopije y • x = y # x naslavljaobjekt, ki ga naslavlja y • Zelo uporabno; toda previdnost! • Primer: >>> a = [1, 2, 3] >>> b = a >>> a.append(4) >>> print b [1, 2, 3, 4]
a 1 2 3 1 2 3 a b Spreminjanje souporabljenega seznama a = [1, 2, 3] b = a a 1 2 3 a.append(4) 4 b
1 a Spreminjanje celoštevilčnega podatka a = 1 a 1 b = a b new int object created by add operator (1+1) 2 a a = a+1 old reference deleted by assignment (a=...) 1 b
ifpogoj: stavki [elifpogoj: stavki] ... else: stavki whilepogoj: stavki forvarinzaporedje: stavki break continue Krmilne strukture
V jeziku Python: for i in range(20): if i%3 == 0: print i if i%5 == 0: print “Zadetek!" print "---" V jeziku C: for (i = 0; i < 20; i++) { if (i%3 == 0) { printf("%d\n", i); if (i%5 == 0) { printf(“Zadetek!\n"); } } printf("---\n"); } Zamik skupin 0 Zadetek! --- --- --- 3 --- --- --- 6 --- --- --- 9 --- --- --- 12 --- --- --- 15 Zadetek! --- --- --- 18 --- ---
Funkcije, Procedure def ime(arg1, arg2, ...): """dokumentacija""" # opcijski opis stavki return# iz procedure returnizraz# 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 classime: "dokumentacija" stavki -ali- classime(osnova1, osnova2, ...): ... Stavki so večinoma definicije metod: def ime(self, arg1, arg2, ...): ... Lahko pa so tudi prireditve rezrednih spremenljivk
Primer razreda classSklad: “zelo znana podatkovna struktura…" def __init__(self): # konstructor self.items = [] def push(self, x): self.items.append(x) # ni omejitve def pop(self): x = self.items[-1] # kaj se zgodi, ce je prazen? del self.items[-1] return x 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 PosebenSklad (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[velikost1-n]
Dedovanje (2) class OmejenSklad(PosebenSklad): “PosebenSklad z omejitvijo velikosti sklada" def __init__(self, limit): self.limit = limit PosebenSklad.__init__(self)# Konstruktor dedovanega razreda def push(self, x): assert len(self.items) < self.limit PosebenSklad.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 ZeroDivisionError, 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 IndexError • raise IndexError("k out of range") • raise IndexError, "k out of range" • try:nekaj narediexcept: # 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()
Standardna knjižnica • Jedro: • os, sys, string, getopt, StringIO, struct, pickle, ... • Regularni izrazi: • re module; pravila ujemanja v stilu Perl-5 • Internet: • socket, rfc822, httplib, htmllib, ftplib, smtplib, ... • Razno: • pdb (debugger), profile+pstats • Tkinter (Tcl/Tk vmesnik), audio, *dbm, ...