Estil: Programacio Autor: kozko Titol: Jornades intensives (Python) Introduccio: Abans de res donar les gracies a tots aquells que els dies 20 i 21 van estar buscant informacio , mostran-la al canal etc... Per si algu encara no ho sap, explicare en que consisteix les jornades intens ives, entre la gent k hi ha al kanal o ki volgui participar es tria un dia o di es per estarnos donant-nos cops de cap amb el ordinador sobre un tema en concret , en aquest cas ens vem passar tot el kap de setmana amb python Que es Python?: Mmmmm bona pregunta xD donks es un llenguatge interpret at orientat a objec tes, molt portable , kom en tots els llenguatges interpretats nomes cal tin dre el interpret per fer funcionar un programa, mmmm s el que esteu pensant ("Osti... = que el perl!") a part de que perl es un pel mes depresa que el python.. Coses basiques: -els arxius de python solen tindre la extensio *.py -posar al principi del arxiu #!/usr/bin/env python si volem k despres donan- li permisos dexekucio carregui el python directament -hi han dos modes... - mode "calculadora" : es la k s posa si karguem el python normal i ns sur t el >>> pk posem koses - mode "llegir d arxiu" : simplement fa l k li posem en un arxiu i mostra la sortida - aixo d moment no sabeu de k va pero si fer un import de socket no guardeu el scrip kom a socket.py pk us dona error pk intentara auto obrirse kom a modul.... Tipus de variables: les variables son mol semblants a les de perl ( faig molta komparacio pk aix i la gent k te perl dominat li kostara mol menys de apendre a fer servir Pyt hon) variables normals ( escalars del perl ): Aquestes son les variables normals i korrents per posari una frase , uns n umeros i objectes son mol facils de definir: >>> kozko = 10 >>> print kozko 10 llistes: son els arrays d tota la vida, pero python t molta potencia per escullir q uin "objecte" agafar de la llista, us poso uns exemple i despres ja explic are >>> lletres = [ "a" , "b" , "c" ] >>> print lletres[0] ## escriu la posicio 0 a >>> print lletres[-1] ## escriu la ultima posicio c >>> print lletres[1:] ## escriu de la pos 1 fins al final ['b', 'c'] >>> print lletres[:-1] ## escriu del principi fins al final menys 1 ['a', 'b'] >>> abecedari = [ lletres , "d" , "e" ] ## kreem una llista k a dins te una altra llista >>> print abecedari[0] ## escriu el abecedari[0] k es = a lletres ['a', 'b', 'c'] >>> print abecedari[0][1] ## escriu del abecedari[0] la posicio 1 b diccionaris (hash) : son els hashes del perl, o sigui variables asosiatives del estil nom->clau >>> politics = { "Aznar" : "PP" , "Pujol" : "CIU" , "Otegui" : "batasuna"} >>> print politics["Aznar"] PP >>> print "El Otegui es de " + politics["Otegui"] El Otegui es de batasuna tublas: Uo! algo nou!! xDDD les tubles no son mes que llistes constants, es a dir no les poden kambiar en tot el programa >>> salutacio = ("ola" , "bon dia") >>> print salutcio[0] ola >>> salutacio[0] = "adeu" Traceback (most recent call last): ## osti no es pot kambiar... xD File "", line 1, in ? TypeError: object doesn't support item assignment Funcions basiques: >>> print "El Otegui es de " + politics["Otegui"] El Otegui es de batasuna tublas: Uo! algo nou!! xDDD les tubles no son mes que llistes constants, es a dir no les poden kambiar en tot el programa >>> salutacio = ("ola" , "bon dia") >>> print salutcio[0] ola >>> salutacio[0] = "adeu" Traceback (most recent call last): ## osti no es pot kambiar... xD File "", line 1, in ? TypeError: object doesn't support item assignment Funcions de Fluxe: if: es la instruccio de fluxe que ens permet fer unes ordres depenen de variables exemple en llenguatge natural: si(2 == 2) escriu el 2 es un 2 sino escriu el valor de dos no val 2 *** substituir si i sino per if i else respectivament sintaxi: >>> lletra = "c" >>> if lletra == "c": ... print "la lletra es c" ... la lletra es c ### un altra :P >>> if lletra == "a": ### si es a ... ... print "la lletra es a" ... elif lletra == "b": ### alomillor es b... ki sap... ... print "la lletra es b" ... else: ### si no es ni a ni b ... ... print "la lletra es " + lletra ... la lletra es c while: significa mentres la condicio sigui certa fes les ordres >>> i = 0 >>> while i < 10: ... print "la i val" , i ... i+=1 ... la i val 0 la i val 1 la i val 2 la i val 3 la i val 4 la i val 5 la i val 6 la i val 7 la i val 8 la i val 9 Doncs no hi ha mol a dir sobre aixo... xD For: Mmm aquest si que li han kambiat un xik el seu significat... en pytho n for = a foreach de perl, es a dir recorre una llista o tubla i li posa un nom per cada cop... mmm no m se explikar els exemples son mes llegibles >>> llista = [ "python" , "C" ,"java" , "perl" ] >>> for llenguatge in llista: ... print llenguatge ... python C java perl a vere una explicacio en llenguatge huma pels ki no han treballat mai amb foreach... seria algo aixi agafa el primer objecte d la llista i li dius llenguatge, imprimeixes llenguatge i torna a agafar el seguant objecte d la llista i li dius llenguatge en l cas de que no hi hagi kap mes donks surt del for i continua cap abaix si hi ha algo mes Range: mm no es lo que jo konsiderari una funcio basica pero kombinada amb el for poden fer els tipics fors de tota la vida es una funcio que retorna numeros seguint uns patrons >>> kozko = range(0,10) ## retorna els numeros entre 0 i 10 ## amb el 10 no inclos >>> print kozko [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> kozko = range(0,100,10) ## retorna els numeros entre 0 i 100 ## pero de 10 en 10 xD >>> print kozko [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] utilitzacio de FOR + Range per conseguir el un for estil C, buenu im aginu que ja veieu on vull anar >>> i = range(0,9) >>> for i in i: ... print "la i val", i ... la i val 0 la i val 1 la i val 2 la i val 3 la i val 4 la i val 5 la i val 6 la i val 7 la i val 8 que seria equivalent a for(i=0; i<9; i++) {printf ("la i val %d",i); Funcions: una funcio serveix per posar unes ordres que utilitzem molt i donar-li un nom i aixi les cridem i no cal copiar tot el codic un altra cop son molt utils , molts cops retornen un valor def funcio(a,b): print un,dos; funcio("aixo es a" , " i jo soc b") funcio("jejej" , "bu") i el prog us hauria de escriure: aixo es a i jo soc b jejej bu Import: ve es logic un llenguatge de per si sol ser bastant pobre, i neces item agafar(importar) llibreries k ja stiguin fetes o k nosaltres haguem fet, dins del import vull posar una altra sentencia que m'h a semblat mol "xula" es la dir dir(llibreria) -> retorna tots els metodes i variables de la llibr eria >>> import sys >>> print dir(sys) ['__displayhook__', '__doc__', '__excepthook__', '__name__', '__st derr__', '__stdin__', '__stdout__', '_getframe', 'argv', 'builtin_module_names' , 'byteorder','copyright', 'displayhook', 'exc_info', 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getdefaultencoding', 'getdlopenflags', 'ge trecursionlimit', 'getrefcount', 'hexversion', 'maxint', 'maxunicode', 'modules' , 'path', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setdlopenflag s', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'version', 'version_info', 'warnoptions'] aixo no es basic... pero es algo que m va encantar una altra cosa mol interesant es que els moduls de python solen nar auto documentats en la variable __doc__ :) ara, formes de importar... n'hi han 3 ( en veritat 2 :P ) 1- import sys ## importem el sys kom a un objecte >>> import sys >>> print sys.version 2.2.1 (#2, Sep 7 2002, 15:35:22) [GCC 2.95.4 20011002 (Debian prerelease)] es a dir tenim un ojecte que es sys i que te els seus metodes 2- from sys import version ## de sys nomes importem el version ## i akest keda kom una variable mes ## i no kom un objecte >>> from sys import version >>> print version 2.2.1 (#2, Sep 7 2002, 15:35:22) [GCC 2.95.4 20011002 (Debian prerelease)] en aquesta tenim nomes el metode sys i no tot l'objecte sys 3- from sys import * ## = k el anterior pero ho importem tot >>> from sys import * >>> print version 2.2.1 (#2, Sep 7 2002, 15:35:22) [GCC 2.95.4 20011002 (Debian prerelease)] >>> print path ['', '/usr/lib/python2.2', '/usr/lib/python2.2/plat-linux2', '/ usr/lib/python2.2/lib-tk', '/usr/lib/python2.2/lib-dynload', '/usr/local/lib/pyt hon2.2/site-packages', '/usr/lib/python2.2/site-packages', '/usr/lib/python2.2/s ite-packages/gtk-1.2', '/usr/lib/site-python'] ** Vigilar al importar-ho tot perque si importeu un metode i en feu un que es diu igual us fareu un lio per trobar el error ho diu un que ho ha experimentat :) *** ## he treballat amb la sys pero funciona = per totes les altres llibre ries Pass: aixo tambe es nou pero es una sentencia mol pero que mol xorra, en python es un error de syntaxi fer aixo >>> while 1: ... print "a" File "", line 2 print "a" ^ IndentationError: expected an indented block la rao es simple el python pensa que si hi ha una instruccio de repe ticio o de fluxe es perque hi ha d'haver algo despres pero pot donar -se el cas de que no llavors per posar algo alla fem servir la sente ncia pass #### a la consola de python me li ha agafat algo raru i aquest exemple #### nomes m'ha funcionat si el faig amb un arxiu while 1: pass print "a" ## simplement el programa es keda parat aqui fins que 1 != de 1 xD :fi de les ordres basikes :D :D :D Fitxers: Buenu com tot bon llenguatge de programacio es capas de obrir fitxers, es criure , llegir etc... la forma de obrir es simple f=open("arxiu" , "r") ## on r pot ser ("r","r+","a","a+","w","w+") amb aixo guardem un OBJECTE que es el fitxer, si fem un print f obtindrie m algo semblant a... Escriure en un fitxer: es tan facil com: f.write("aixo es un arxiu escrit amb PyThOn\n"); Llegir en un fitxer: f.read() <--- retorna tot el fixer f.read(5) <-- retorna tot el fixer comenzant per el 5 byte f.readlines() <--- retorna una llista amb les linies Mouren per el fixer: f.tell() <--- retorna la posicio dins del fitxer f.seek(n,[0,1,2]) <--- ens posem n la posicio n del fixer respecte a 0 <--- al inici 1 <--- a la posicio inicial 2 <--- respecte al final del final Tancant els fixers: f.close() <--tanca el fixer ### exemple de fitxers en python f=open('text', 'r+') f.write("Exemple\nde\nkom\nescriure\nun\nfitxer"); ### Escribim f.seek(0) ### ens posem a la posicio 0 despres d haver escrit print f.read() ### llegim tot el fixer amb el read() print f.tell() ### escribim en la posicio del text en k estem f.seek(0) ### ens posem al inici del fitxer text_arr = f.readlines() ### tornem a llegir tot el fitxer ### i el posem dins d'un array for x in text_arr: ### recorem el array i imprimim el k hi ha print x, f.close() Mes sobre llistes: ja hem vist com es creaba una llista i com es recorria per veure el k hi havia.. ara apendrem a afegir treure i moure coses de elles primer d tot farem veure k tenim ja una llista feta que seria >>> llista = [ "jo" , "soc" , "una" , "llista" ] append(push): afageix el nou element al final de la llista ex: llista.append("de") llista.append("python") >>> print llista ['jo', 'soc', 'una', 'llista', 'de', 'python'] insert: es igual que el push pero podem afagir a la posicio que volem ex: llista.insert(1,"no") >>> print llista ['jo', 'no', 'soc', 'una', 'llista', 'de', 'python'] remove: imagineuvos-ho xD, borra la primera ( no totes! ) que es igual ex: llista.remove("no") >>> print llista ['jo', 'soc', 'una', 'llista', 'de', 'python'] count: conta el nombre de cops que hi ha un objecte a la llista ex: llista.count("una") >>> 1 index: retorna en la posicio en que hi ha certa cosa en la llista, dona una excepcio si no troba cap ex: llista.index("una") 2 ex: llista.index("unes") Traceback (most recent call last): File "", line 1, in ? ValueError: list.index(x): x not in list sort: posa tot l'array ordenat de menor a major ex: llista.sort() print llista ['de', 'jo', 'llista', 'python', 'soc', 'una'] reverse: capgira tot el array ex: llista.reverse() print llista ['una', 'soc', 'python', 'llista', 'jo', 'de'] pop: es el pop de tota la vida treu el ultim element de la llista o el que nosaltres li diguem ex: llista.pop() ## treiem el de llista.pop(1) ## " " el soc print llista ['una', 'python', 'llista', 'jo'] Mes sobre diccionaris: Doncs mirarem una miqueta mes sobre els diccionaris, p.ex com recorre un diccionari ? >>> fruites = {"platan":"groc","pera":"verda","poma" : "vermella" } Afegir una paraula(fruita) i la seva clau(color) >>> fruites["kiwi"] = "verd" >>> print fruites {'platan': 'groc', 'kiwi': 'verd', 'pera': 'verda', 'poma': 'vermella'} Eliminar una fruita -> color >>> del fruites["kiwi"] >>> print fruites {'platan': 'groc', 'pera': 'verda', 'poma': 'vermella'} Recorre un diccionari, iep! aqui ve lo maku :D el metode keys() en retorna una llista de els noms es a dir, >>> print fruites.keys() ['platan', 'pera', 'poma'] tenin aixo es facil recorre un diccionari: >>> for n in fruites.keys(): ... print "la " + n + " es de color " + fruites[n] ... la platan es de color groc la pera es de color verda la poma es de color vermella /* Sembla Barrio sesamo xD ups... el article keda malament xD */ RegExp ( Expressions regulars ) per fer servir les regexp kal importar el modul re mes koses... em si per fer aixo cal primer crear una pattern que es el que cal qie coincideixi aixo es fa amb: pattern = re.compile(patt) on patt s'ha de posar una expressio regular un exemple mol senzill seria import re frase = "ola kom esteu?" pattern = re.compile("^ola") if pattern.search(frase): print "ola esta al principi de la frase" else: print "la frase no comenza per ola :(" ola esta al principi de la frase ara abans d continuar algunes de les koses k podem posar en un regexp ^ <--- vol dir k ha d anar al davant $ <--- que ha d'anar al darrera , s'ha d posar al darrere ? <--- pot ser cualsevol caracter pero nomes un [a-z] <-- de "a" a "z" o podeu fer amb nums i amb majuscules | <--- serveis per posar 2 regexp en forma de or: si patt or patt2 una ultima cosa si la regexp la fem servir nomes un cop podem fer-ho en una sola linia: if re.compile("^o").search(frase): print "comenza per o" /* molta gent pensa k les regexp son inecesaries... pero a mi un llenguat ge sense regexp.. no magrada molt exeptuant al C xD <-- rectificacio C te regexp no com java ( <= 1.3.1 ) */ Split: Vol dir trosejar i es una paraula i encaixa totalment amb el que fa un split el que fa es agafar un array o una tubla i trosejar-la seg ons nosaltres li hem dit >>> frase = "aixo es un putu exemple :D" >>> llista = split.frase(" ") >>> print llista ['aixo', 'es', 'un', 'putu', 'exemple'] Socket's: Uoooo coses wapes ja! xD, buenu de moment nomes farem els sockets de client es a dir, que els de obrir un port i tal no ho farem en kara... tot i que si alguesta mol interesat fent un dir(socket) i savent com funciona en C es pot fer :) buenu kom sempre s'ha d'im portar un modul... xD import socket per crear un socket es algo tan senzill kom: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ok on poso socket.AF_INET podriem posar AF_UNIX depenen de si vole m fer un socket per internet o per unix :P i on SOCK_STREAM podriem posar SOCK_DGRAM per fer un socket UDP , o SOCK_RAW per fer ne un desde 0 ( molt experts ) ok.. ara necesitem un ordinador on conectarnos... k tal el famos i unic www.google.com ? s.connect( ( "www.google.com" , 80 ) ) s'han de posar 2 parentesis pk es una tubla, amb dos camps el prim e que es el servidor on conectar i el segon que es el port ara hauriem de saber enviar la ordre al servidor del google perque ens envii la pagina no ? s.send("GET / \n\n") ok ... ara enviem aixo pero... no sabem kom rebre les koses per rebre tenim la sentencia s.recv(x) on x es el numero de carac ters que volem que ens arribi per el socket s.recv(1024) el problema d'aixo es que nomes tindrem els 1024 primers caracters :( com ho podriem fer per pillar tota la web ? la solucio es senzi lla while s.recv(1024) != "": print s.recv(1024) que en llenguatge natural seria " mentres el que rebem contingui algo volem continuar rebent koses" ok ara nomes falta saber tancar el socket.. aixo no te gens de tr uc s.close() :P ok ara ho posem tot juntet per mirar una pagina en el google import socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect( ( "www.google.com" , 80 ) ) s.send("GET / \n\n") while s.recv(1024) != "": print recv(1024) Threads(fils): Com en tots els llenguatges python es capas de fer processos parralels es a dir, el comportament normal de un programa es Inici | Ejecucio de les sentencies | Fi pero mols cops necesitem tenir processos parralels es a dir Inici | Sentencies -> Fil | | Fi<---------' un exemple mol klar es el d kualsevol servidor http, si un servidor http no fes servir fils, seria un programa se cuencial i aniria atenent a les connexion de 1 en 1 us imagineu anar al google i tenir que demanar tanda ? xD llavors el que es fa es kuan es rep una conexio directame nt s'el envia al fil perque akest envii la pagina al cli ent, mentres que el proces principal nomes s'encarrega de desviar les connexions als fils i aixi es poden enviar 3 pagines el moment :D el modul es threading el threading pot fer semafors fils... nosaltres nomes ens centrarem en els fils, per fer un fil es var = threading.Thread(target=funcio,args=(),name="",kwargs={}) ok expliko una mika :P var esta klar no ? sera el objecte fil target hem de posar la funcio que haura d'executar el fil quan l'engeguem args son els arguments de la funcio *** han d estar en tu bla name="" nom del fil ( totalment presindible ) kwargs={} per passar parrametres de un diccionari def escriu(a,b): print a,b fil1 = threading.Thread(target=escriu,args=("sok un", "fil")) print fil1 ok tenim un fil fet... pero i si lengeguem ? aixo es fa amb start() fil1.start() ## resultat : ## ## sok un fil ara nem a komprovar que realment els processos son paral els, per probaro farem 2 fils i si no funcionen els 2 a la vegada voldra dir que funciona de manera secuencial, si no voldra dir que son fils :D import threading import time def num(a): for x in range(0,10): print "akest es el fil"+a time.sleep(0.01) fil1 = threading.Thread(target=num,args=("1") ) fil2 = threading.Thread(target=num,args=("2") ) fil1.start() fil2.start() ## Resultat akest es el fil1 akest es el fil2 akest es el fil1 akest es el fil2 akest es el fil1 akest es el fil2 akest es el fil1 akest es el fil2 akest es el fil1 akest es el fil2 akest es el fil1 akest es el fil2 akest es el fil1 akest es el fil2 akest es el fil1 akest es el fil2 akest es el fil1 akest es el fil2 akest es el fil1 akest es el fil2 ## he fet servir el time.sleep(0.1) pk si no com que l'ordeninador es ta ## n rapid mels feia tots els fil1 en un plis i despres el fil2 xD Mes informacio a : http://pyspanishdoc.sourceforge.net/lib/thread-objects.html Doncs aixo a sigut tot amics! ara us deixo una tonterias de codic , es un bot del irc , aquest casi be no te res de especial pero sempre li podeu afegir coses :D import socket ## importem les llibreries dels sockets server = "libres.irc-hispano.org" ## var amb el server port = 6667 ## var amb el port nickbot = "catb0t" ## var amb el nick del bot s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ## constructor del socket s.connect( ( server , port) ) ## conectem al servidor s.send("NICK " + nickbot + "\n") ## enviem el nikc k tindrem s.send("USER PyTh0n l l l\n") ## enviem el user, realname etc... while s != None: ## mentres el s sigui algo data = s.recv(1024) ## data = 1024 bits del packet print data ## imprimim el packet linies_data = data.split("\r\n")## fem un split i aixi obtenim una llist ## a amb totes les linies for linies in linies_data: ## recorrem la llista de les linies paraules = linies.split(" ") #fem una altra llista per tenir #les paraules i=0 ## contador for paraula in paraules: ## recorrem les paraules i+=1 ## aumentem el kontador if paraula == "PING": ## si la paraula es Ping s.send("PONG " + paraules[1] + "\n") ## responem amb ## el pong if paraula == "MODE" and paraules[3] == ":+x": ## si tenim pass ## estem konectat ja al irc... ## x fer automatismes mes endevant if paraula == "PRIVMSG" and paraules[3] == ":-raw" and i == 2: # si la paraula es PRIVMSG i en la posicio 3 de la llista de paraules # hi ha un :-raw i la paraula es del kontador 2 ... ordre = linies[linies.index("-raw")+5:] # la ordre es tot el missatge komenzant per -raw .. pero kom k # raw no ens interesa li sumo 5 k son 4 del -raw i 1 del espai s.send(ordre+"\n") ## enviem la ordre raw /**********************************************************/ | # // kozko2001@jazzfree.com | | #// o z k o kozko2001@hotmail.com | | # \\ web: kozko.dnsalias.org | | # \\ irc: kozko_ (records mount) | \**********************************************************/