Professional Documents
Culture Documents
por Moleman (AKA Hctor Monlen) Bienvenidos a este taller de Python. En unos cuantos artculos espero ensearos a programar en este lenguaje que personalmente me apasiona, y espero que dentro de poco a vosotros tambin. No me enrollo ms y vamos al grano!!!
Si no lo tenis, podis descargaros las fuentes para compi lar (para Unix & Linux en general y para Mac OS X) de: http://www.python.org/ftp/python/2.4/Python-2.4.tgz Para sistemas Windows hay un setup aqu: http://www.python.org/ftp/python/2.4/python-2.4.msi Y aqu un instalador para Mac OS X (si no queris compi larlo): http://ftp.cwi.nl/jack/python/mac/MacPython-OSX-2.3-1.dmg (recomendado leerse antes la documentacin del instalador en http://homepages.cwi.nl/~jack/macpython/download.html )
Bien, el primer paso es descargarse el intrprete de Python si es que no lo tenis ya. Por si no lo sabis Python es un lenguaje interpretado, es decir, lo que se programa es un script que luego se le pasa al intrprete que lo ejecutar. Esto permite hacer rpidas modificaciones del programa al no tener que compilar cada vez, como ocurre por ejemplo con el lenguaje C. (Los que sepis algo de C notareis que la sintaxis se pare ce bastante. No es una coincidencia ) Los Linux-Users deberais tener el intrprete instalado por defecto. Podris comprobar si lo tenis simplemente ejecutando en una consola: Shadowland:~$ python Python 2.3.2 (#2, Oct 6 2003, 08:02:06) [GCC 3.3.2 20030908 (Debian prerelease)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> El ">>>" es el prompt del intrprete esperando a que una orden sea introducida. Ms adelante veremos esto en ms detalle. Para salir simplemente pulsad Ctrl+D.
Existen en Python los siguientes operadores aritmticos (por orden de prioridad, de 1 a 4):
3/68
En Python, una variable se declara solamente cuando va a ser usada. No hay que declararlas al principio como en el tpico programa de C. As mismo, el tipo de dato que contendr la variable tam poco se declara y el intrprete lo toma dinmicamente segn el valor que se le pasa a la variable. La prioridad conjunta de todos ellos se define de mayor a menor, as: >>> a=5 >>> print a 5 >>> Como vemos, hemos asignado el valor entero 5 a la variable. Si hacemos: Hay que tener cuidado con las operaciones que aniden mu chos operadores de distintos tipos, ya que el orden de pre ferencia puede hacer que la operacin no salga como de biera. Para paliar el problema mientras cogis prctica, siempre podis usar los parntesis como separadores de operacin, verbi gratia: 2*3+(4-3)/((4-5)**3) Os pondr unos ejemplos de este tipo de operaciones: Shadowland:~$ python Python 2.3.4 (#2, Sep 24 2004, 08:39:09) [GCC 3.3.4 (Debian 1:3.3.4-12)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 2+3 5 >>> 4-2 2 >>> 5*2 10 >>> 2**3 8 >>> 4>5 False 4/68 >>> b=5.0 >>> print b 5.0 >>> Lo que estamos haciendo es asignar un valor flotante (de cimal) a la variable.(es importante notar que el decimal se representa con punto y no con coma) En ningn caso hemos declarado el tipo de dato que con tendr, aunque SI que hay que asignarle un valor antes de usar una variable o Python dar error. >>> print pruebaerror Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'pruebaerror' is not defined >>> Python es case sensitive por lo que diferencia entre maysculas y minsculas. Tambin hay que tener en cuen ta unas reglas para los nombres de las variables: 1. Slo se pueden usar dgitos, letras y el carcter de subrayado. El espacio no est permitido, as como ca racteres extraos.
1. 2. 3.
En Python existen los enteros y los flotantes, como ya he mos visto. As mismo se pueden usar los valores booleanos True y False como ya comentamos antes. Existe tambin el tipo de datos cadena . A diferencia del C, donde las cadenas son vectores de caracteres, en Python hasta un nico carcter se considera una cadena. (internamente son vectores, pero a nosotros nos da igual por el momento. Por algo el Python es de alto nivel ) Un ejemplo: >>> mi_cadena='hola mundo' >>> print mi_cadena hola mundo >>> Como podemos ver, las cadenas se delimitan con comillas, da igual si son simples o dobles, aunque si se quieren mostrar cadenas en el texto, es conveniente delimitar la cadena con dobles y mostrar las simples: >>> mi_cadena="'hola mundo'" >>> print mi_cadena 'hola mundo' >>> Las cadenas son muy sufridas (ya lo veremos ms adelan te) y permiten muchos tipos de operaciones con ellas. A modo de abreboca, dos operaciones bsicas con cadenas son la concatenacin (con el signo + ) >>> 'abcd'+'efgh' 'abcdefgh' >>> que sera como una suma entre cadenas, y la repeticin (con el signo * ) >>> 'a'*10 'aaaaaaaaaa' >>> que repite la cadena tantas veces como se le indique. Tambin se pueden hacer comparaciones entre cadenas. Python las analiza "alfabticamente" para compararlas: >>> 'hola'<'jajeji' True >>>
Bien, vamos a escribir nuestro primer programa en Python. Hasta ahora hemos estado trasteando con el intrprete, pero ya es hora de ponernos serios. Que no os asuste, ya que este tema lo explicaremos en base al programa, y a algunas modificaciones que le iremos introduciendo, al tiempo que veremos en la prctica muchos conceptos del tema anterior. Adems este mismo programa nos servir para explicar temas de los artculos siguientes, como tra tamiento de cadenas y listas, sockets,... Bueno, primero hay que explicar que hace el programa, y luego iremos desglosando lnea a lnea segn vayamos viendo como funciona. Este programa bsicamente se conecta a Google para rea lizar la bsqueda que le pongas y te pasa el resultado de bidamente formateado y slo mostrando el nmero de re sultados que se le indique. Complicado? Puede, pero slo debido a que an no sabis que hace cada cosa. Tranquilos y tiempo al tiempo. Adems es un programa que podis usar sin problemas y es un ejemplo tan bueno como cualquier otro, y desde lue go mucho mejor que el tpico "hola mundo" que se suele hacer, verdad?
Los programas se pueden ejecutar en cualquier sistema, tanto Windows, como Linux. En Windows bastar con hacer doble click sobre l (podis crear el programa con el notepad o con el entorno idle del intrprete, o con cualquier editor que no formatee el texto como por ejemplo el Word del Office. Debis guardar el programa como .py . Os recomiendo el notepad), con un inconveniente: no veris el resultado porque cuando el programa termine, la ventana de shell se cerrar.
5/68
Como podis ver, para ejecutarlo simplemente tenemos que teclear python y el nombre del programa. El programa nos pide que introduzcamos la bsqueda y luego el numero de resultados que queremos ver. Fcil, verdad? Y despus nos muestra los resultados de nuestra bsqueda. Enfermera! Guantes y bistur que vamos a proceder a la autopsia... paso por paso. Cdigo del programa: #!/usr/bin/env python import httplib URL= 'www.google.com' COD_BUSQUEDA= '/search?num=100&q=' 6/68
7/68
Python nos avisa que no puede usarse la concatenacin con enteros y cadenas. La forma correcta sera: >>> print 'probando otra vez',a,b*5 probando otra vez 12 hola que tal...hola que tal...hola que tal...hola que tal...hola que tal... >>>
Un ejemplo simple de formato: >>> a=134 >>> b=12.5 >>> c='hola caracola' >>> print 'El valor de a es %d, el de b %f y el de c %s' %(a,b,c) El valor de a es 134, el de b 12.500000 y el de c hola caracola >>> Aqu podemos ver los tres tipos ms comunes (hay otros) de indicadores de cadenas de formato: %d, %f y %s. El primero sirve para enteros, el segundo para flotantes y el tercero para cadenas. Tenemos tres variables, una con un entero, otra con un flotante y la tercera con una cadena. Se meten los carac teres de formato dentro de la cadena a imprimir y luego se hace uso del operador % para imprimir por orden los
8/68
if...elif...else
La estructura if permite introducir condiciones en la ejecucin del cdigo del programa. Su sintaxis es: if condicin: instruccin instruccin instruccin ... [continua el programa] Analicemos brevemente la teora. Como vemos la sintaxis es simple. Primero va el if con su condicin y finaliza con dos puntos (los dos puntos son importantes. Si no se po nen Python dar error). A continuacin vienen las instruc ciones que se ejecutaran SI la condicin es verdadera. En caso contrario no se ejecutaran. Y como sabemos que es lo que va dentro del if y lo que no? Fcil, es la otra "obligacin" del Python: las tabulaciones. Python reconoce las nuevas instrucciones mediante los in tros y adems usa las tabulaciones para diferenciar si es tas estn dentro o fuera de un bucle, una condicin, una funcin,....
Si intentamos dividir un numero entre cero da error. Bien, supongamos que tenemos este trozo de cdigo: a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:')) print a/b Sencillo, y si lo ejecutamos nos pide dos nmeros y divide el primero entre el segundo. Pero que pasara si el segun do numero fuera un cero. Que nos dara error como arriba. Como solucionarlo? Dicindole al python que si el segundo numero es un cero, que no ejecute la divisin, as: a=int(raw_input('Dame un numero a dividir:')) b=int(raw_input('Dame el divisor:')) if b!=0: print a/b As el programa slo ejecutara la divisin si el segundo nu mero es distinto (el operador != ) de cero. Fcil. Pasemos a la segunda parte del condicional: else El programa de divisin funciona pero no es muy eficaz y mucho menos elocuente. Si, evita la divisin entre cero pero no nos permite mostrar un mensaje diciendo que la divisin entre cero no esta permitida. Veamos por que:
9/68
10/68
while
Como podemos hacer que una parte de nuestro cdigo se ejecute continuamente hasta que nosotros queramos? Usando un bucle, y eso es lo que es el while. Su sintaxis es: while condicin: instruccin instruccin ...... [continua programa] Veamos un ejemplo en nuestro programa google.py: while n != 0 and i < MAX_RESULTADOS: try: a = aux[i].split(FIN,2)[0] if a != '': busqueda.append('http://'+a) n -= 1 except: pass i += 1 Vale es un poco complejo al principio pero no demasiado. Paso por paso. Cuando python llega al while evala la condicin y si es cierta ejecuta todo lo del bucle y vuelve al while para vol ver a evaluar y seguir haciendo hasta que la condicin sea falsa. En este caso la condicin es que la variable n sea distinta de cero (n!=0) Y (and) que la variable i sea m e n o r q u e l a va r i a b l e M A X _ R E S U LTA D O S (i<MAX_RESULTADOS). Mientras sea verdadero, el while se ejecutara una y otra vez. Un ejemplo ms simple: un contador. Si creamos este programa y lo ejecutamos:
NOTA
el i=i+1 se puede sustituir (y se hace de normal) por i+=1 (podis verlo en el trozo de google.py). Esta contraccin tambin funciona con multiplicaciones, divisiones, restas,.... siempre y cuando la variable origen y la destino sean la misma (en este caso si, porque la variable i se usa como parte de la suma y al mismo tiempo como lugar donde almacenar el nuevo resultado).
Por que metemos el incremento? Porque si no aumentamos el valor de i, al valer en un principio cero, el while siempre seria verdadero y tendramos un bucle infinito (es decir, la pantalla inundada de nmeros sin parar nunca ) As como esta el programa podemos ver como la variable i se va incrementando uno a uno gracias al print y ver que finaliza cuando llega a 9 (si recordis while i<10). Cuando i llega a valer 10 el while ya no es verdadero y finaliza, y como no hay nada ms despus, finaliza el programa. Sencillo? Espero que si, y que lo vayis comprendiendo to do, ya que al final del articulo os pondr un ejercicio y es pero que posteis en el foro todas vuestras dudas y si os animis, el resultado del ejercicio y que problemas os ha dado Bueno, bueno, que esto se acaba. Nos quedan dos estruc turas ms y un ultimo punto y finalizamos. Creo que no se ha hecho muy largo, no? Y sin ms prembulos, la estructura
11/68
Hace lo mismo pero podis ver que el programa ya no de clara i=0 antes ya que el for-in declara la i y le asigna si
articulo (tiempo al tiempo). Volvamos a nuestro programa de divisin (versin if-else sin elif). Tenamos:
12/68
Cuando debemos usar try-except? Cuando sepamos que python puede darnos un error y as ahorrarnos una condicin que puede ser difcil de escribir, adems de inne cesaria. En este caso, si sabemos que python da error cuando se divide por cero, porque usar un if para compro bar si el divisor es cero? Nosotros los intentamos igual con el try y si resulta que hemos introducido un cero como di visor y python se queja, entonces se ejecutara el except y en vez de fallar el programa, se ejecutara lo que haya den tro del except, en este caso el print avisndonos de que estamos dividiendo por cero. Copiado y archivado? Eso espero Y hemos llegado al ultimo punto de este Quick & Dirty Python Article n1
Python posee mltiples mdulos importables con funciones que nos facilitan la tarea de programar. Hemos visto algu nas que vienen por defecto como int(), str(), range(),... pero muchas otras tienen que ser importadas para ser usadas, como por ejemplo la funcin de raz cuadrada sqrt() Esta funcin esta presente en el modulo math que es una librera de funciones matemticas. Otras funciones que po see son por ejemplo: seno, coseno, tangente, etc... Hay tres formas de importar funciones en python: 1. from modulo import funcin 2. from modulo import * 3. import modulo La primera forma sirve para importar una funcin concreta de un modulo. Veamos un programa que hace raz cuadra da: from math import sqrt print sqrt(9)
13/68
ejercicio.py
#!/usr/bin/env python import math opcin=0 while opcin!=6: print 'Calculadora de prueba v1.0 (by Moleman)\n' print '1. Sumar' print '2. Restar' print '3. Multiplicar' print '4. Divisin entera' print '5. Raz cuadrada' print '6. Salir' opcin=int(raw_input('Escoge el numero de opcin: ')) if opcin==1: a=int(raw_input('\nPrimer numero: ')) b=int(raw_input('\nSegundo numero: ')) print '\nResultado:',a+b,'\n\n' elif opcin==2: a=int(raw_input('\nPrimer numero: ')) b=int(raw_input('\nSegundo numero: ')) print '\nResultado:',a-b,'\n\n' elif opcin==3: a=int(raw_input('\nPrimer numero: ')) b=int(raw_input('\nSegundo numero: ')) print '\nResultado:',a*b,'\n\n' elif opcin==4: a=int(raw_input('\nPrimer numero: ')) b=int(raw_input('\nSegundo numero: ')) print '\nResultado:',a/b,'\n\n' elif opcin==5: a=int(raw_input('\nNumero: ')) print '\nResultado:',math.sqrt(a),'\n\n' elif opcin==6: print '\nGracias por volar con aerolneas Moleman... estooo, por usar la Calculadora v1.0\n\n' else: print '\nOpcion incorrecta. Vuelve a probar...\n\n'
Bien, el ejercicio consiste en coger el programa que os voy a poner y modificarlo para evitar que falle de ninguna ma nera, ya sea por introducir datos invlidos o por cualquier otra razn. Y as adems practicareis todo lo visto. Mejoradlo todo lo que podis. El programa funciona perfec tamente pero se puede conseguir que falle muy fcilmen te. Para los ms observadores, si, lo reconozco. Es una calculadora! Pero bueno, tarde o temprano tenia que apa recer verdad? Adems slo es un ejercicio para practicar y si contis con el google.py creo que podrais disculpar me, no? Pues eso es todo. Espero que hayis disfrutado con el arti culo y que continuis. En la siguiente revista ms. PD: se me olvidaba. Los comentarios en el cdigo se po nen as #esto es un comentario con el smbolo almohadilla " # " delante. Saludos...
Agradecimientos a HpN, HxC y a mi mujer por soportarme continuamente (va por ti Marta)
14/68