TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució...

37
TREBALL EN LLENGUATGE Python UNA INTRODUCCIÓ ROBERT JOAN ARINYO BARCELONA, Setembre 2012

Transcript of TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució...

Page 1: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

TREBALL

EN LLENGUATGE Python

UNA INTRODUCCIÓ

ROBERT JOAN ARINYO

BARCELONA, Setembre 2012

Page 2: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix
Page 3: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

Aquest document es distribueix

sota una llicència Creative Commons 3.0 de:

Reconeixement

No comercial

Compartir sota la mateixa llicència

Page 4: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix
Page 5: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

Durant el desenvolupament, un programa de computador

es llegeix moltes més vegades que no s’executa.

Geek Sublime: The Beauty of Code, the Code of BeautyVikram Chandra

Page 6: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix
Page 7: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

Índex

1 Introducció 1

1.1 El hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

1.2 El software . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

1.2.1 Una classificació del software . . . . . . . . . . . . . . 3

1.2.2 Un exemple de nivells de llenguatge . . . . . . . . . . 4

1.3 Enginyeria del software . . . . . . . . . . . . . . . . . . . . . . 6

1.4 Tòpics de la informàtica . . . . . . . . . . . . . . . . . . . . . 7

2 Processament de programes 9

2.1 Processament amb compilació . . . . . . . . . . . . . . . . . . 9

2.2 Processament amb interpretació . . . . . . . . . . . . . . . . . 11

2.3 Treball bàsic en Pyhton . . . . . . . . . . . . . . . . . . . . . 11

2.3.1 Treball en mode comanda . . . . . . . . . . . . . . . . 11

2.3.2 Treball en mode intèrpret . . . . . . . . . . . . . . . . 13

2.4 Tria del mode de treball . . . . . . . . . . . . . . . . . . . . . 14

2.5 Treball avançat en Pyhton . . . . . . . . . . . . . . . . . . . 15

2.5.1 Treball en mode comanda . . . . . . . . . . . . . . . . 16

2.5.2 Treball en mode intèrpret . . . . . . . . . . . . . . . . 17

3 El doctest 23

3.1 Inclusió total . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Page 8: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

ii ÍNDEX

3.2 Inclusió dels tests . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.3 Fitxer auxiliar . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

3.4 Banc de proves . . . . . . . . . . . . . . . . . . . . . . . . . . 27

Bibliografia 29

Page 9: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

Capítol 1

Introducció

La Informàtica és una ciència que estudia les tècniques d’emmagatzemamenti tractament automàtic de la informació. Els dos grans components de lainformàtica són: el hardware (les màquines) i el software (els programes).

1.1 El hardware

El hardware és el conjunt de dispositius físics (materials). L’element cen-tral és el computador al qual es connecten els elements auxiliars anomenatsperifèrics tals com les unitats d’emmgatzemament (discos de diverses clas-ses), unitats de comunicació home-màquina (teclats, pantalles), unitats decomunicació màquina-màquina (mòdems), etc.

Un computador és una màquina electrònica capaç d’efectuar un conjuntpetit d’operacions simples de càlcul a elevada velocitat i sense intervencióhumana.

Avuí dia, la immensa majoria dels computadors existents representen lainformació mitjançant valors quantificats en una notació numèrica de base fi-xada (usualment 2), la informació pren valors en un conjunt finit numerable inomés es pot modificar de forma discreta. Aquests computadors s’anomenencomputadors digitals.

Depenent de la forma en la que efectuen els càlculs, els computadorsdigitals poden ser seqüencials, vectorials o paral.lels. Els seqüencials efectuena cada instant una única operació; els vectorials també efectuen una únicaoperació però de caràcter vectorial (per exemple, producte escalar de dos

Page 10: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

2 Introducció

CPU

UAL

BUS

UC

MC

CANAL

PERIFERICS

Figura 1.1: Arquitectura de Von Neumann.

vectors en una sola operació); els computadors paral.lels executen diversesoperacions simultàniament.

L’organització genèrica dels computadors digitals, també dita arquitec-tura, és la coneguda amb el nom d’arquitectura de Von Neumann, el ma-temàtic que la va inventar. Les unitats principals d’aquesta arquitectura,il.lustrada a la Figura 1.1, són: la unitat central de procès (CPU, Central

Process Unit), la memòria central (MC, tambè dita RAM, Random Access

Memory), i els perifèrics. La CPU consta de dos elements: la unitat de con-trol, (UC, Control Unit), que és l’encarregada del control del funcionamentdel computador, i la unitat aritmètica i lògica, (ALU, Arithmetic and Logic

Unit) que és l’encarregada d’efectuar els càlculs.

La idea bàsica de l’arquitectura Von Neumann és que la CPU interpretai tracta només la informació emmagatzemada en la memòria central. La co-municació entre aquests dos elements es fa a través del bus (pot pensar-se queun bus és simplement un cable elèctric compost de molts fils). En els com-putadors moderns, els perifèrics es comuniquen amb el bus del computadorsota el control d’una unitat anomenada canal.

Page 11: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

1.2 El software 3

En aquest curs, no tornarem a tractar més aspectes relacionats amb elhardware.

1.2 El software

Un programa de computador és una descripció d’una seqüència d’instruccionso pasos de càlcul que defineixen una tasca que realitzarà un computador.

El software és el conjunt de programes de computador, es a dir, conjuntsd’instruccions que, d’alguna manera, el computador sabrà interpretar.

1.2.1 Una classificació del software

En general, els elements software es poden classificar dins d’una de les tresfamilies següents: sistemes operatius, programes d’utilitat i programes d’a-plicació. La frontera que separa aquestes tipologies és cada dia més difusa.

El sistema operatiu està compost per un conjunt de programes que con-trolen la gestió dels recursos del sistema de manera segura i eficaç i, alhora,proporcionen la connexió funcional (la interfase) entre el hardware i l’usuaridel computador.

Les utilitats són programes que permeten el desenvolupament d’altresprogrames. Entre les més importants estan els editors de fitxers i els compi-ladors. Els editors permeten usar un computador com una mena de màquinad’escriure. Els compiladors permeten traduir allò que les persones codifiquenen una representació més adient pels computadors digitals.

Les aplicacions són els programes desenvolupats per resoldre algun pro-blema concret amb l’ajut del computador.

L’eina amb la qual es representen els programes de computador són elsllenguatges de programació. Un llenguatge de programació no és res més queuna definició rigorosa d’una sintaxi i una semàntica associada a la sintàxi.La sintaxi defineix la manera en la que cal codificar les instruccions quedescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V).La semàntica defineix el significat de la sintaxi (7 * 8 significa el productedel valor set pel valor vuit).

De les classificacions que es poden fer dels llenguatges de programació, lamés útil per a nosaltres és la que els classifica com: llenguatges de màquina,llenguatges simbòlics de baix nivell i llenguatges simbòlics d’alt nivell. Els

Page 12: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

4 Introducció

llenguatges de màquina són propis de cada computador i, antigament, no-més es podien codificar mitjançant representacions binàries de zeros i uns.Podem dir que aquests són els llenguatges que realment poden interpretarels computadors digitals.

Els llenguatges de baix nivell simbòlics, també coneguts com ensambla-dors (assembly en anglès) són distints per a cada computador o familia decomputadors, ara bé, tenen representació simbòlica. Usen símbols mnemò-nics per representar conceptes.

Els llenguatges d’alt nivell són simbòlics i, en principi, cadascun d’ellsté una sintaxi i una semàntica universals (estàndar); és a dir, són iguals pera qualsevol computador. La codificació és molt propera a la manera usualque tenim els humans de representar els processos de càlcul. Exemples benconeguts d’aquests llenguatges són el Python, FORTRAN, Pascal, C, C++ iJava.

1.2.2 Un exemple de nivells de llenguatge

La Figura 1.2 il.lustra una unitat aritmètica i lògica de tres registres d’unhipotètic computador de Von Neumann. Els registres REG1 i REG2 són uni-tats electròniques que emmagatzemen les dades sobre les quals cal efectuaralguna operació. El regsitre ACUM, anomenat acumulador, és el registre onresta emmagatzemat el resultat de la darrera operació efectuada sobre lesinformacions emmagatzemades en els registres.

Com que suposem que el computador és de Von Neumann, abans d’efec-tuar una operació cal copiar als registres la informació de les dades a operarque estan a la memòria central. Un cop efectuada l’operació, cal copiar lainformació de l’acumulador a la memòria central.

Suposem el programa codificat en llenguatge Pyhton

x = y + z

la semntica del qual és: suma les informacions representades per les variablesy i z i fes que el resultat sigui representat per la variable x. Aleshores, en unhipotètic llenguatge ensamblador simbòlic de baix nivell, aquest segment deprograma podria representar-se com

X OCT*4

Y OCT*4

Page 13: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

1.2 El software 5

REG 1 REG 2

ACUM

UAL

Figura 1.2: Unitat aritmètica i lògica.

Z OCT*4

LOAD R1, @Y

LOAD R2, @Z

ADD

STORE @X

On les tres primeres línies defineixen la quantitat de memòria central quecal reservar per emmagatzemar la informació de les variables. La liniaLOAD R1, @Y indica que cal copiar al registre R1 la informació representadaper la variable Y a la memòria central. El significat de la línia LOAD R2, @Z

és anàleg. La línia ADD dona l’ordre de que s’efectui l’addició de les infor-macions carregades als registres. La línia STORE @X copía a la posició dememòria indicada per X el resultat de l’operació el qual està emmagatzemata l’acumulador.

Finalment, suposem que l’operació LOAD es representa pel conjunt de bits0101, ADD es representa per 1000 i STORE es representa per 1100. Suposemtambè que el registre R1 es representa per 001 i que 010 representa el registreR2. Finalment, suposem que la variable X està a la posició 1000 de la memòriacentral, la variable Y està a la 1010 i la variable Z està a la 1100. Aleshores,en aquest hipotètic llenguatge màquina, el mateix segment de programa demés amunt es podria representar en binari sobre instruccions de setze bits,com

Page 14: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

6 Introducció

0101 001 0000010100101 010 0000011001000 000 0000000001100 000 000001000

Notis que la representació de les variables ha desaparegut. Les variablesara no juguen cap funció, atès que la informació està a la memòria centraldel computador.

Recomanem l’estudiant que, usant el llenguatge ensamblador simbòlic debaix nivell i el llenguatge màquina indicats, intenti escriure els programescorresponents als segments de programa en llenguatge Python següents

x = x + y x = x + y + z

S’ha trobat cap aspecte en la interpretació segons Pyhton de la sintaxi deslprogrames que xoca amb la interpretació usual de l’àlgebra?

1.3 Enginyeria del software

El procés de dissenyar, implementar i mantenir solucions software eficaces perproblemes complexos s’anomena enginyeria de la programació o enginyeria

del software. El procés de construcció d’una solució software completa repel nom de cicle de vida del software i, en general, es considera compost pelssegüents passos:

• Anàlisi de requeriments: determina el conjunt de requeriments quecal que satisfaci el software, és a dir, defineix l’aplicació o problema aresoldre.

• Especificació: es descriuen formalment les entrades (dades), les sorti-des (resultats) i els processos que generen les sortides a partir de lesentrades.

• Disseny: s’identifiquen els principals tipus de dades i operacions quecal aplicar-los-hi així com els mòduls funcionals (solucions dels subpro-blemes) que componen l’aplicació.

Page 15: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

1.4 Tòpics de la informàtica 7

• Implementació: també anomenat programació, en el que es codifiquenels algorismes usant un llenguatge de programació de computadors.

• Instal.lació i prova: s’instal.la el programa resultant en el computadorcorresponent i es verifiquen la correctesa i adequació a les especificaci-ons.

• Manteniment: un cop en explotació, el manteniment avalua el ren-diment del programa, detecta i corregeix possibles errors existents idiagnostica la necessitat de possibles actualitzacions.

1.4 Tòpics de la informàtica

La informàtica

• No és únicament programar. La programació (objectiu d’aquest curs)només és el mitjà d’expressió bàsic de la informàtica.

• No consisteix en la simple utilització d’un computador en un ambientqualsevol, per exemple, usar un full de càlcul o un processador detextos, navegar pel World Wide Web a Internet o rebre i trametremissatges per correu electrònic.

• No és una subdisciplina de l’enginyeria electrònica ni de les matemàti-ques, malgrat estar fortament relacionada amb totes dues.

La informàtica és

• L’estudi dels algorismes i els computadors: les teories, models abstrac-tes de dades, realització mecànica, fiabilitat, verificació i mesura de laseva eficàcia.

• Una disciplina matemàtica perquè les teories i estil de recerca i comu-nicació son necessariament rigorosos i segueixen pautes matemàtiques.

• Una disciplina científica perquè les teories i abstraccions s’avaluen i esproven en el laboratori de manera experimental.

• Una disciplina d’enginyeria perquè aplica el disseny i l’anàlisi per aobtenir sistemes eficaços, fiables i econòmicament factibles que resolenproblemes tècnics d’interès per a la societat.

Page 16: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

8 Introducció

Page 17: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

Capítol 2

Processament de programes

Al Capítol 1 hem vist que, per una banda, un llenguatge d’alt nivell és elmateix per a tots els computadors i que, per altra banda, cada computadorrealment només pot interpretar el seu propi llenguatge màquina. Aleshores,serà possible construir programes que siguin executats per qualsevol compu-tador? La resposta és, en principi, afirmativa i la solució rau en aplicar unamena de procés de traducció.

La traducció d’un programa expressat en un llenguatge d’alt nivell aun expressat en llenguatge màquina es fa actualment segons dues tècniquesdiferents. Una s’anomena compilació i l’altra s’anomena interpretació.

2.1 Processament amb compilació

La tècnica de compilació aplica un procés que pot ser descompost en tresfases:

1. Fase de compilació: el codi del programa escrit segons la sintaxi d’unllenguatge d’alt nivell es tradueix al llenguatge màquina corresponenta un computador concret. El resultat s’anomena programa objecte i elprocés de traducció l’efectua un programa d’utilitat anomenat compi-

lador.

2. Fase de muntatge: el codi màquina resultant de la fase de compilació escompleta amb codi addicional previament desenvolupat i emmagatze-mat en les anomenades llibreries del llenguatge. El procés l’efectua un

Page 18: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

10 Processament de programes

programa d’utilitat anomenat muntador i el resultat és un programaque es diu carregable.

3. Fase de càrrega i execució: el programa carregable es transforma demanera que pugui ser posicionat en un lloc concret de la memòria cen-tral del computador. El resultat és el programa executable. Finalment,el programa executable es disposa de manera efectiva en la memòriacentral i s’inicia l’execució.

Val a dir que, avuí dia, els sistemes operatius disponibles fan que no necessà-riament calgui passar de manera explícita per totes i cadascuna de les fasesindicades. En general, el sistemes operatius moderns executen les fases 1 i 2automàticament sempre que no apareixen errors.

Una altra qüestió important és la relacionada amb els errors. En efecte,cadascuna de les fases pot acabar de dues maneres diferents, llevat de l’e-xecució que pot acabar de tres maneres. En general, si una fase no contéerrors, es passa a la fase següent. La fase de compilació pot donar lloc aerrors de sintaxi, és a dir, errors que signifiquen que hi ha alguna part queno ha estat representada segons el que especifica la sintaxi del llenguatge deprogramació emprat. Corregir aquests errors es usualment senzill perquè elcompilador genera els missatges i indicacions oportunes.

La fase de muntatge dona lloc a errors que normalment responen al fetque el programa executable no ha estat convenientment completat, per exem-ple perquè alguna part del codi que calia incorporar no ha estat trobada ales llibreries. Generalment és un problema que es solventa fàcilment perquèel muntador també genera els missatges que cal.

La fase de càrrega no la considerem perquè, si el muntatge ha estatcorrecte, ací no han d’haver gaire problemes. Per contra, la fase d’execució ésla més problemàtica. Poden apareixer errors d’execució, típicament intentarefectuar una divisió per zero o que el programa intenta accedir a una part dela memòria central a la que no li està permés accedir-hi. Aquests problemeses detecten de manera fàcil perquè el sistema genera els missatges d’erroradients.

L’execució es pot acabar generant resultats correctes, la qual cosa ensomplirà de satisfacció. Ara bé, l’execució també pot acabar generant resul-tats incorrectes, cosa que no sempre resulta fàcil de detectar. En aquestcas l’aplicació del programa desenvolupat pot generar una catàstrofe. Cer-queu a la web que va passar amb la nau espacial nordamericana "Mars PathFinder"el 26 de juny de 2003.

Page 19: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

2.2 Processament amb interpretació 11

2.2 Processament amb interpretació

Quan un programa escrit en un llenguatge d’alt nivell es processa seguint latècnica d’interpretació, la traducció a llenguatge màquina la fa un programaanomenat intèrpret. La manera de treballar d’un intèrpret es pot descriure,de manera simplificada, dient que considera a cada instant una única instruc-ció o pas de càlcul del programa d’alt nivell, la tradueix a la representacióde baix nivell i, tot seguit, l’executa. Notis la diferència respecte del casde treball en compilación on no es desencadenava l’execució fins que no escompletaven els pasos previs.

Malgrat la diferència indicada, els errors que poden aparèixer ara són,essencialment, els mateixos que apareixien en el cas del procés amb compila-ció. Quan l’intèrpret decodifica una instrucció, detecta i indica els possibleserrors de tipus sintàctic que hi pugui haver. Un cop corregits els erros de sin-taxi, l’intèrpret pot detectar que hi ha elements software externs que caldriaque fossin definits i no ho estan. Naturalment l’intèrpret genera el missatged’error corresponent. Finalment també es poden produir errors d’execuciódels quals l’intèrpret donarà la informació oportuna.

2.3 Treball bàsic en Pyhton

El llenguatge de programació Pyhton pertany a la familia de llenguatgessimbòlics d’alt nivell interpretats. Això no obstant, permet treballar enmode intèrpret (shell mode) i en mode comanda (script mode). En tot elque segueix, el símbol > representa el símbol que el sistema operatiu mostraen el terminal quan es troba en espera que l’usuari entri una comanda pelteclat. S’acostuma a usar la paraula anglesa prompt per a designar-lo.

2.3.1 Treball en mode comanda

En el treball en mode comnda, els programes Pyhton es processen de manerasemblant a com es faria si el llenguatge fos compilat. El procediment constade dos pasos

1. Definició del programa Pyhton en un fitxer mitjançant un editor detextos. Per convenció, els fitxers que contenen programes codificats enPyhton sempre tindran l’extensió .py. El nom primerPrograma.py

n’és un exemple.

Page 20: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

12 Processament de programes

2. Desencadenament de la interpretació del contingut del fitxer mitjan-çant l’execució de l’intèrpret Pyhton com una comanda del sistemaoperatiu. El nom de l’intèrpret és Python. Per exemple

> python primerPrograma.py

Suposa que mitjançant un editor de textos has definit dins del fitxer denom primerPrograma.py el següent programa Pyhton :

nom = raw_input(’Dona el teu nom : ’)

print ’El teu nom es : ’, nom

L’execució produiria un diàleg semblant a

> python primerPrograma.py

Dona el teu nom : Robert

El teu nom es : Robert

>

Suposa ara que, en definir el programa Pyhton dins del fitxer de nomprimerPrograma.py has comés una errada per haver-te descuidat d’escriurel’obertura del parèntesi a la primera linea o instrucció i has escrit

nom = raw_input’Dona el teu nom : ’)

print ’El teu nom es : ’, nom

El diàleg de l’execució seria ara

> python primerPrograma.py

File "primerPrograma.py", line 1

nom = raw_input’Dona el teu nom : ’)

^

SyntaxError: invalid syntax

>

On el missatge d’error indica que la informació continguda entre les cometesestà fora de lloc. Ara cal modificar el programa per a corregir l’error i tormara executar.

En aquesta forma de treballar, en principi, caldrà que el programa quecontè el fitxer inclogui un programa principal.

Page 21: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

2.3 Treball bàsic en Pyhton 13

2.3.2 Treball en mode intèrpret

Quan es treballa en Pyhton en mode intèrpret, en principi, el procedimentconsta de dos pasos

1. Inicialització de l’intèrpret Pyhton per execució de la comanda corres-ponent del sistema operatiu.

2. Entrada de les instruccions o pasos de càlcul que hom vulgui executar.

El primer pas és ben simple, només cal executar la comanda

> python

La resposta del computador és alguna cosa semblant a

> python

Python 2.7.3 (default, Apr 20 2012, 22:44:07)

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>>

El símbol >>> és el prompt de l’intèrpret i, com ha estat dit més amunt,indica que l’intèrpret està a l’espera de rebre ordres de càlcul pel teclat.

Pel que fa al segon pas, suposem que volem executar les mateixes ins-truccions que definien el programa del fitxer primerPrograma.py. El diàlegseria

> python

Python 2.7.3 (default, Apr 20 2012, 22:44:07)

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> nom = raw_input(’Dona el teu nom : ’)

Dona el teu nom : Robert

>>> print ’El teu nom es : ’, nom

El teu nom es : Robert

>>>

Page 22: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

14 Processament de programes

Cas que haguerem comés la mateixa errada feta en el treball en comanda,tindriem

> python

Python 2.7.3 (default, Apr 20 2012, 22:44:07)

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> nom = raw_input(Dona el teu nom : ’)

Dona el teu nom : Robert

>>> print ’El teu nom es : ’, nom

El teu nom es : Robert

>>> nom = raw_input(Dona el teu nom : ’)

File "<stdin>", line 1

nom = raw_input(Dona el teu nom : ’)

^

SyntaxError: invalid syntax

>>>

Caldria ara reescriure correctament la línia de l’error i l’intèrpret la tornariaa traduir i executar.

La sessió de treball en mode intèrpret s’acaba tancant l’intèrpret Pyhtontot entrant al computador una de les dues comandes següents

1. CTRL-D

2. exit()

2.4 Tria del mode de treball

Vistes les dues metodologies de treball, quina hem d’emprar? En principila resposta és que, en general, podem emprar la que més ens agradi. Arabé, després de fer uns quants experiments i haver analitzat les accions queha calgut fer i els resultats obtinguts seguint cadascuna de les formes detreball, el punt més destacat resulta ser que, si hom ha treballat en modeintèrpret i acaba la sessió, cada cop que vulgui tornar a executar les mateixesoperacions caldrà tornar a entrar-les.

Tingut això en compte, a la pràctica podem aplicar les següents reglessimples:

Page 23: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

2.5 Treball avançat en Pyhton 15

1. Si hom vol fer un programa, en general serà més convenient treballaren mode comanda escrivint-lo en un fitxer. Això estalviarà haver de re-petir l’entrada. Addicionalment, com que el treball en un fitxer permetvisualitzar i analitzar el programa com una unitat i modificar-lo segonshom cregui convenient, el procés de disseny del programa resulta mésconvenient.

2. Si l’objectiu és fer una simple prova d’un concepte bé del llenguatgePyhton bé conceptual de càlcul, en general serà més convenient exe-cutar en mode intèrpret.

Per exemple, suposem que no n’estem segurs de com actua l’aritmèticade Pyhton pel que fa a la divisió de valors. Per esbrinar-ho, no cal ferun programa en un fitxer, es suficient fer el següent experiment:

> python

Python 2.7.3 (default, Apr 20 2012, 22:44:07)

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> print 7/8

0

>>> print 8/7

1

>>> print 8.0/7

1.14285714286

>>>

Hom pot veure de seguida que l’aritmètica entre enters és entera.

2.5 Treball avançat en Pyhton

Quan la complexitat del programa que cal desenvolupar augmenta, una de lesmetodologies bàsiques emprades per abordar la resolució de la programacióes coneix com anàlisi descendent. En aquesta metodologia, el problemadonat es descompon en dos o més problemes que, un cop resolts de maneraindependent, les seves solucions adientment combinades donen la solució alproblema inicial.

De manera natural, l’anàlisi descendent porta a la utilització de funcionsde manera que, normalment, cada subproblema correspon precissament a

Page 24: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

16 Processament de programes

una funció. Aquestes funcions poden haver de ser desenvolupades pel propiprogramador però tot sovint representen solucions a problemes més o menyscomuns i que han estat desenvolupades per altres programadors. És el cas deles anomenades funcions de llibreria o també funcions de mòdul. Tant si lesfuncions les desenvolupa el propi programador com si són de llibreria, es pottreballar tant en mode comanda com en mode intèrpret. Ara la tria depenbàsicament de quina és la manera de treballar en la qual el programador essent més a gust. Tot seguit descrivim dues possibles formes de treball.

2.5.1 Treball en mode comanda

Una característica molt important del Pyhton és que, quan hom treballa enmode comanda, l’execució d’una funció només es pot fer o bé des d’una altrafunció o bé des d’un programa principal. Hom diu que la funció és cridada

per un pograma principal o per una altra funció. Vegis que això porta aque, necessàriament, sempre cal que hi hagi un programa principal que iniciïl’execució del programa Pyhton

Considerem un exemple senzill en el que cal desenvolupar un programaper a calcular el volum d’una corona esfèrica delimitada per dues esferesamb radis respectius r1 i r2. Una solució podria ser la següent. Com quel’operació bàsica clarament resulta ser el càlcul del volum d’una esfera, enun fitxer de nom corona_esferica.py editem el següent codi Pyhton

# imports

import math

# Funcio que calcula el volum d’una esfera de radi donat

def volum_esfera(r) :

v = 4 * math.pi * r * r * r / 3.0

return v

# Funcio que calcula el volum d’una corona esferica

def volum_corona_esferica(r1, r2) :

v = abs(volum_esfera(r1) - volum_esfera(r2))

return v

Page 25: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

2.5 Treball avançat en Pyhton 17

# Programa principal

r1 = input(’Dona un valor pel radi r1 : ’)

r2 = input(’Dona un valor pel radi r2 : ’)

volum_corona = volum_corona_esferica(r1, r2)

print

print ’volum de la corona = ’, volum_corona_esferica(r1, r2)

Notis que les instruccions (línies) del programa principal estan codificades apartir de la primera columna. Si ara s’executa el programa en mode coman-da, el diàleg podria ser alguna cosa com

> python corona_esferica.py

Dona un valor pel radi r1 : 10

Dona un valor pel radi r2 : 100

volum de la corona = 4184601.41458

2.5.2 Treball en mode intèrpret

Quan el programa en desenvoluapment inclou un programa principal, l’exe-cució es desencadena de manera automàtica en el moment de fer l’importdel fitxer de Pyhton . Així doncs, quan hi ha programa principal no resultaconvenient executar-lo en mode intèrpret.

Tot sovint, la solució del problema només requereix d’un conjut de funci-ons de manera que unes en criden d’altres sense que hi hagi necessitat d’unprograma principal. Considerem un altre cop el cas del càlcul del volum de lacorona esfèrica. Ara, però, demanen que es dissenyi una funció que resolguiel problema. Si modifiquem el programa anterior tot eliminant el programaprincipal, quedaria

# imports

import math

# Funcio que calcula el volum d’una esfera de radi donat

Page 26: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

18 Processament de programes

def volum_esfera(r) :

v = 4 * math.pi * r * r * r / 3.0

return v

# Funcio que calcula el volum d’una corona esferica

def volum_corona_esferica(r1, r2) :

v = abs(volum_esfera(r1) - volum_esfera(r2))

return v

Si ara s’executa el programa en mode comanda tal com hem vist més amunt,la interacció resultant amb el computador és

> python corona_esferica.py

>

És a dir, no s’executa res.

El treball en mode intèrpret dóna les eines que calen per poder executarun programa Pyhton sense que hi hagi programa principal. El primer pasés editar el fitxer que contingui el conjunt de funcions que, suposadament,resolen el problema. Assumim que sigui el fitxer corona_esferica.py queacabem de definir.

Un cop s’ha comprovat que el directori de treball és aquell en el qual haestat editat el programa, s’executa l’intèrpret Pyhton

> python

Python 2.7.3 (default, Apr 20 2012, 22:44:07)

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more

information.

>>>

Tot seguit s’efectua la càrrega del codi Pyhton que hom vol executar.En el nostre exemple seria

Page 27: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

2.5 Treball avançat en Pyhton 19

> python

Python 2.7.3 (default, Apr 20 2012, 22:44:07)

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import corona_esferica

>>>

Ara, les funcions que hi ha dins del fitxer carregat es poden desencadenarde manera individual. Aleshores s’executarà la funció que es desencadeniexplícitament, les funcions que siguin cridades per ella i totes les que siguincridades successivament. Per exemple, l’execució

> python

Python 2.7.3 (default, Apr 20 2012, 22:44:07)

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import corona_esferica

>>> corona_esferica.volum_corona_esferica(100,10)

4184601.4145816043

>>>

desencadena l’execució de la funció volum_corona_esferica definida dinsdel fitxer o mòdul carregat de nom corona_esferica.py. Aquesta funciódesencadena (crida) dos cops la funció volum_esfera, la qula calcula el vo-lum d’una esfera, un cop s’aplica al radi de valor 100 i un altre al radi devalor 10. Per contra, la crida

>>> corona_esferica.volum_esfera(10)

4188.790204786391

>>>

Només executa la funció volum_esfera la qual calcula el volum d’una esfera,en aquest cas, de radi 10.

Fins ací hem fet una presentació en la que no hem considerat la pos-sibilitat que el programador cometi errades. Veiem com es treballa quanel programa conté errors de sintaxi. Suposa que en editar l’exemple de lacorona esfèrica hem escrit al fitxer el següent codi

Page 28: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

20 Processament de programes

# Funcio que calcula el volum d’una esfera de radi donat

def volum_esfera(r) :

v = 4 * pi * r * r * r / 3.0

return v

# Funcio que calcula el volum d’una corona esferica

def volum_corona_esferica(r1, r2) :

v = abs(volum_esfera(r1) - volum_esfera(r2))

return v

La resposta del computador a l’execució seria

> python

Python 2.7.3 (default, Apr 20 2012, 22:44:07)

[GCC 4.6.3] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import corona_esferica

>>> corona_esferica.volum_corona_esferica(10,100)

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "corona_esferica.py", line 10, in volum_corona_esferica

v = abs(volum_esfera(r1) - volum_esfera(r2))

File "corona_esferica.py", line 4, in volum_esfera

v = 4 * pi * r * r * r / 3.0

NameError: global name ’pi’ is not defined

>>>

La darrera línia del missatge del Pyhton diu que el nom de la variable pi

usada a la línia 4 del fitxer corona_esferica.py no ha estat definit.

Ara caldria seguir els següents passos: 1) acabar l’execució de l’intèr-pret prement simultàniament les tecles CTRL D, 2) editar el fitxer afegint alprincipi les línies

# imports

import math

Page 29: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

2.5 Treball avançat en Pyhton 21

i canviant la línia

v = 4 * pi * r * r * r / 3.0

per

v = 4 * math.pi * r * r * r / 3.0

3) executar l’intèrpret, 4) carregar el fitxer i 5) tornar a executar la funciódesitjada. Totes aquestes operacions es poden simplificar si, a la pràctica,hom treballa de la següent manera:

1. S’obre un terminal a través del qual es farà tota la interacció amb elcomputador.

2. Usant la comanda cd es defineix el directori de treball on es farà laprogramació.

3. En el mateix terminal i directori de treball, s’obre l’editor de fitxersemacs en background. Per exemple

>emacs corona_esferica.py &

i s’escriu el codi que calgui. Deixeu l’editor obert sobre el fitxer ques’està editant.

4. Com que l’editor ha estat executat en background, el terminal restaalliberat per les posteriors interaccions.

En el terminal s’executa l’intèrpret Pyhton i s’importa el codi editatamb la comada

>>>import corona_esferica.py

5. Si no hi ha errors, tot seguit s’executa la funció desitjada. Per exemple:

>>>corona_esferica.volum_corona_esferica(100,10)

Page 30: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

22 Processament de programes

6. Si hi ha errors de sintaxi o d’execució, sense tancar el terminal, espasa a treballar en la finestra de l’editor on es fan les modificacionsque calgui. Un cop acabada l’edició, i sense tancar l’editor, es tornaal terminal on s’està executant l’intèrpret i es carrega i executa el codimodificat

>>>reload (corona_esferica)

>>>corona_esferica.volum_corona_esferica(100,10)

Notis que aquesta forma de treballar proporciona una gran flexibilitatper a desenvolupar programes Python.

Page 31: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

Capítol 3

El doctest

Doctest és una eina o aplicació que proporciona el llenguatge Python pertal de poder comprovar de manera automàtica si determinats programes,especialment funcions, generen els resultats que s’esperen. Malgrat que lespossibilitats de doctest són limitades, resulten suficients per un curs intro-ductori. Es recomana estudiar la secció Unit testing with doctest delllibre How to think like a computer scientist.

El doctest es pot executar de diverses maneres i, en principi, resultaespecialment adient quan no hi ha programa principal, és a dir, quan disse-nyem un conjunt de funcions dins d’un únic fitxer o mòdul de codi Python.Si hi ha programa principal, aquest es transformarà en comentaris tot afeginta la primera columna de cada línia el caràcter ’#’.

Il.lustrarem com es defineix i s’utilitza el doctest mitjaçant exemples.En el que segueix, considera l’exemple de la funció que calcula i retorna l’àread’un triangle donats la base i l’altura

#coding: utf-8

def area_triangle(base, altura) :

# calcula l’area d’un triangle

return base * altura / 2.0

la qual emprarem per veure tres maneres diferents d’aplicar el doctest.

Page 32: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

24 El doctest

3.1 Inclusió total

En la modalitat d’inclusió total, en el fitxer de les funcions Pyhton s’inclouentant els tests que s’executaran com el codi que desencadena el doctest. Perexemple, si els test són

"""

>>> area_triangle(3, 4)

6.0

>>> area_triangle(12, 5)

30.0

>>> area_triangle(0.4, 10)

2.0

>>> area_triangle(2.6, 3.4) == area_triangle(3.4, 2.6)

True

"""

i el codi que desencadena l’execució del test és

if __name__ == ’__main__’ :

import doctest

doctest.testmod()

Resultaria un fitxer final com el següent

#coding: utf-8

def area_triangle(base, altura):

# calcula l’area d’un triangle

"""

>>> area_triangle(3, 4)

6.0

>>> area_triangle(12, 5)

30.0

>>> area_triangle(0.4, 10)

2.0

>>> area_triangle(2.6, 3.4) == area_triangle(3.4, 2.6)

True

Page 33: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

3.2 Inclusió dels tests 25

"""

return base * altura / 2.0

if __name__ == ’__main__’ :

import doctest

doctest.testmod()

Notis que el codi que desencadena el doctest està escrit a partir de la primeracolumna!

En aquests condicions, si el fitxer triangles.py contè el codi, el tests’executa amb la comanda

> python triangles.py -v

La marca -v (verbose) indica a Python que escrigui pel CES tots els mis-satges que genera.

3.2 Inclusió dels tests

En aquest mètode el fitxer del programa contidrà el codi Pyhton de lesfuncions i els codis que defineix els tests que s’executaran però no s’inclouràel codi que desencadena el doctest. Si suposem que els tests són els definitsa la secció precedent, el contingut del fitxer triangles.py seria:

#coding: utf-8

def area_triangle(base, altura):

# calcula l’àrea d’un triangle

"""

>>> area_triangle(3, 4)

6.0

>>> area_triangle(12, 5)

30.0

>>> area_triangle(0.4, 10)

2.0

>>> area_triangle(2.6, 3.4) == area_triangle(3.4, 2.6)

Page 34: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

26 El doctest

True

"""

return base * altura / 2.0

I el test s’executa amb la comanda

> python -m doctest triangles.py -v

3.3 Fitxer auxiliar

Ara s’usen dos fixers. Un fitxer contindrà únicament el codi de les funcionsque s’han programat. Per exemple, com abans, el fitxer triangles.py contèel codi Python

#coding: utf-8

def area_triangle(base, altura):

# calcula l’àrea d’un triangle

return base * altura / 2.0

L’altre fitxer, considerat com auxiliar, per exemple, triangles.txt, primerimporta el fitxer de codi, triangles.py i tot seguit inclou el codi dels testsque cal aplicar. En el cas dels triangles seria:

docfile de triangle.py

>>> import triangle

>>> triangle.area_triangle(3, 4)

6.0

>>> triangle.area_triangle(12, 5)

30.0

>>> triangle.area_triangle(0.4, 10)

2.0

>>> triangle.area_triangle(2.6, 3.4) == triangle.area_triangle(3.4, 2.6)

True

>>> print"%3.2f"%(triangle.area_triangle(2.6, 3.4))

Page 35: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

3.4 Banc de proves 27

4.42

Ara, el test s’executa amb la comanda

> python -m doctest triangles.txt -v

3.4 Banc de proves

Un asserció fonamental en programació de computadors diu:

Que un programa generi resultats correctes per un nombre deter-

minat de casos NO demostra que el programa és correcte. Un cas

per al qual un programa determina resultats incorrectes demostra

que el programa és incorrecte.

Aquesta asserció es pot considerar com una manera different de formularla idea de demostració per contradicció què, segurament, ja has estudiat enMatemàtiques.

Per tant, el fet que el teu programa doni resultats correctes per un conjuntde casos definits en un doctest no és, en general, suficient per a poder afirmarque el programa és correcte.

Aquesta situació es pot considerar com un dels talons d’Aquiles de laProgramació de Computadors. Per tal de mitigar-lo, cal definir amb cura elbanc de proves dels nostres programes tot intentant que els casos concretsestudiats incloguin les situacions més significatives. Resulta molt difícil do-nar regles a seguir a l’hora d’haver de triar els casos de prova. En general calresoldre el nombre màxim possible d’exercicis per tal d’agafar experiència.

Només a tall de petit example, consideris el cas en el que demanen quees dissenyi un programa per a determinar si un conjunt de valors enters nonecessàriament ordenats contè un determinat valor donat. Un bon banc deproves inclouria els següents casos:

1. Un conjunt on el valor a cercar és el primer del conjunt.

2. Un conjunt on el valor a cercar és el darrer del conjunt.

Page 36: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

28 El doctest

3. Un conjunt on el valor a cercar no és ni el primer ni el darrer delconjunt.

4. Un conjunt on el valor a cercar no existeix.

5. El conjunt buit.

Notis que, conceptualment, han estat considerades totes les situacionspossibles que es poden presentar a l’hora de donar valors concrets del probl-mea a tractar. Això implica que, quan el programa dóna resultats correctesper tots els casos considerats, pràcticament s’ha fet una demostració perexhaustivitat de la correctesa del programa.

Page 37: TREBALL EN LLENGUATGE Python - cs.upc.edurobert/teaching/EEBE/treballPython.pdfdescriuen la solució d’un problema (Barcelona s’escriu amb B i no amb V). La semàntica defineix

Bibliografia

• Jeffrey Elkner, Allen B. Downey and Chris Meyers. How to think like

a computer scientist: Learning with Python,

http://www.openbookproject.net/thinkcs/python/english2e/

• Andrés Marzal, Isabel Gracia. Introducción a la Programación con

Python, Publicacions de la Universitat Jaume I. Servei de Comunicaciói Publicacions. Campus del Riu Sec. Castelló.

http://www.uji.es/bin/publ/edicions/ippython.pdf

• Python Programming Language – Official Website.

http://www.python.org