´ lica de Chile Pontificia Universidad Universidad Cat Catolica o Chile ´n Depar Depart tamento de Ciencias de la Computaci Computaci on o Escuela de Ingenier´ ıa
Introducci´ on a la Programaci´ on on on IIC1103
Segundo semestre 2013
´ Indice general 1. Pr´ Pro ´logo
3
2. Conceptos previos 2.1. Introducc Introducci´ i´on a los algoritmos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Creando un nuevo proyecto en Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 4 6
3. Tipos de datos, expresiones 3.1. Tipos de datos . . . . . . 3.2.. Comand 3.2 Comandos os B´ Ba´sicos . . . . 3.2.1. Operadores . . . . 3.3.. Progra 3.3 Programas mas b´ asicos . . . . 3.4. If, elif y else . . . . . . . . 3.5. Loops . . . . . . . . . . . 3.5.1. While . . . . . . . 3.5.2. For . . . . . . . . . 3.5.3. Break y continue .
y control de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
8 8 9 10 11 12 15 15 16 17
4. Funcion unciones es y m´ odulos 19 4.1. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 4.2. 4.2. M´ odulos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 4.3. Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 5. Strings 23 5.1.. Declar 5.1 Declaraci aci´ o´n y manejo de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 5.2. Funciones de strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 5.3. El tipo chr y la tabla ASCII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 6. Listas 6.1. Listas Unidimensionales . . . . . . . . . . . . . . . 6.2 6.2. Util Utilid idad ades es y fun funccione ioness par para lis lista tass unid unidim imen ensi sion onaales les 6.3. For . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.4. Ordenamiento . . . . . . . . . . . . . . . . . . . . . 6.5. Listas bidimensionales . . . . . . . . . . . . . . . . 6.6. Valores por referencia . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
28 28 30 32 33 33 34
7. Clases 7.1. Programac Programaci´ i´on orientada a ob je jetos 7.2. Crear una clase . . . . . . . . . . 7.2.1. Declarar una clase . . . . 7.2.2. Atributos de la clase . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
36 36 36 36 36
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
1
. . . .
7.2.3. 7.2.4. 7.2.5. 7.2.6.
Constructor . . . . . . . . . . . . . . Instanciar un obje bjeto en el programa Self . . . . . . . . . . . . . . . . . . M´etodos . . . . . . . . . . . . . . . .
8. Archivos 8.1. ¿Por qu´e guardar datos? 8.2. Ruta de un archivo . . . 8.3. Leer un archivo de texto 8.4. Escribir un archivo .txt 8.4.1. Modo write . . . 8.4.2. Modo append . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . .
. 37 . 38 . 39 . 39
. . . . . .
42 42 42 42 43 43 44
. . . . . .
9. Recurs Recursi´ i´ on 45 9.1.. Definir 9.1 Definir una una funci funci´ o´n recursiva . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 9.2. Ejemplos de funciones recursivas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 9.2.1. Quicksort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2
Cap´ıtulo 1
Pr´ ologo ologo Este documento tiene como objetivo resumir los contenidos del curso IIC1103 Introducci´ on on a la Programaci´ on on dictado el segundo semestre del a˜no no 2013. Su objetivo no es de ninguna forma reemplazar la asistencia a clases o laboratorios. Tampoco tiene como fin ser la ´unica unica fuente de estudio para el alumno, puesto que los contenidos son lo suficientemente amplios como para requerir bastante tiempo para lograr dominarlos en profundidad. Se recomienda fuertemente al lector complementar los contenidos del documento con ejercitaci´on de su parte. Esta puede ser rehacer las tareas planteadas durante el semestre, los laboratorios o incluso ejercicios propuestos de internet. Tambi´ ambi´ en en es important importantee recordarle recordarle al alumno alumno que este texto fue realizado realizado por otro ser humano, humano, por lo que puede contener errores menores. Sin embargo, todo el c´odigo utilizado aqu´ı ha sido si do previamente testeado. Cualquier feedback o cr´ cr´ıtica puede ser enviada al mail
[email protected] mail
[email protected] . Para finalizar, es necesario recordarle al lector que la mejor forma de preparar una evaluaci´on en este curso es programar, ya que el lector debe ser capaz de resolver por sus propios medios los problemas que requieran de la modelaci´on on y posterior desarrollo de un algoritmo.
1
Desear´ Desear´ıa aprovechar este espacio para agradecer a Esteban Andr´es es Salgado por regalarme su p ortada =).
3
Cap´ıtulo 2
Conceptos previos 2.1. 2.1.
Intr Introdu oducc cci´ i´ on on a los algoritmos
Antes de comenzar a programar debemos comprender el concepto de algoritmo. Un algoritmo es un conjunto finito de pasos definidos y ordenados que nos permiten realizar una actividad de manera met´odica. Veamos un ejemplo b´ asico asico de algoritmo. Ejemplo 1.1 Dise˜ 1.1 Dise˜ ne ne un algoritmo que decida cargar un tel´ efono efono celular si le queda poca p oca bater´ bater´ıa.
Figura 2.1: algoritmo algoritmo para decidir decidir cuando cuando cargar cargar un telefono telefono celular. Es fundamental modelar la soluci´on on de un problema mediante un algoritmo antes de comenzar a programar, pues el algoritmo algoritmo es independien independiente te del lenguaje lenguaje de programac programaci´ i´on. on. Una vez modelado el problema, s´olo olo debemos adaptarlo al lenguaje en el que deseamos escribir la respuesta para poder realizar lo pedido. Cabe destacar que este documento no tiene por fin ense˜nar nar algoritmos ya que es un tema perteneciente a otros cursos. Se propone al lector que averigue un poco acerca de ellos para facilitar la modelaci´on de los problemas planteados. Veamos a continuaci´on on otros dos ejemplos ilustrativos. Ejemplo 1.2 Dise˜ ne un algoritmo que filtre el ingreso de personas a un casino. Una persona puede entrar a un ne casino si tiene m´as as de 18 a˜ nos y si paga su entrada. nos 4
Figura 2.2: algoritmo para filtrar el ingreso de personas a un casino. Antes de continuar es necesario conocer el concepto de variable. variable. En computaci´on on una variable es un espacio en memoria reservado para almacenar informaci´on on que puede o no ser conocida. En general a las variables les daremos un nombre y le asignaremos valores seg´un un corresponda. Ejemplo Ejemplo 1.3 Dise˜ ne un algoritmo que dado un n´umero ne umero natural n positivo, retorne la suma de los n primeros n´ umeros umeros naturales.
Figura 2.3: algoritmo para retornar la suma de los primeros n naturales.
5
Para finalizar la secci´on, on, cabe destacar que la modelaci´on on de los problemas ser´a repasada antes de dar soluci´on on a los ejemplos y ejercicios planteados en este texto, con el fin de mostrar la importancia de programar en base a un modelo previo.
2.2. 2.2.
Crean Creando do un nue nuev vo proy proyecto ecto en Pytho Python n
A continuaci´ on on detallaremos c´omo omo iniciar un nuevo proyecto en Python 3.3.2 usando el IDLE, el entorno de programaci´ on disponible en http://www.python.org/download. on Para esto abrimos IDLE. Luego, para crear un nuevo proyecto debemos presionar ctrl+n o ir a la pesta˜na File y abrir una ventana nueva:
Figura 2.4: creando un nuevo proyecto en el IDLE. Se nos abrir´a una nueva ventana en la que debemos escribir el c´odigo de nuestros programas. Luego al guardar alg´ un archivo escrito en esta ventana generaremos un archivo de extensi´on .py. un Nuestro primer proyecto en Python ser´a el famoso “Hello world!” 1 , que consiste en un programa que imprime en pantalla “Hello world!”. Para esto escribimos: print ( " H e l l o w o r l d ! " )
Y luego para ejecutarlo presionamos f5 o Run Module en la pesta˜na Run na Run..
1
En general, este programa es el primero que se escribe al aprender un nuevo lenguaje
6
Figura 2.5: primer primer programa programa en Python. Python.
7
Cap´ıtulo 3
Tipos de datos, expresiones y control de flujo 3.1. 3.1.
Tipo Tiposs de dato datoss
En Python, todo elemento tiene un tipo. Este tipo determina las acciones que podemos realizar sobre el elemento o bien el dominio de los valores posibles que puede tomar. Para declarar y asignarle un valor a una variable en Python debemos usar el simbolo =. Entre los tipos de valores posibles destacan varios. int : una variable de tipo int representa un n´umero umero entero o en ingl´es es “integer ”. integer ”. Puede tomar valores enteros 1 y es posible posi ble realizar realiz ar operacion op eraciones es aritm´ a ritm´eticas eticas sobre ´el. el. Por ejemplo eje mplo : # R ec e c or o r da da r a =2 b =5 c = a + b # La d=5/2 # L a e= b %a %a # L a
q ue ue a l u sa sa r e l s im i m bo b o lo l o # e s u na na l in i n ea ea c om o m en e n ta t a da d a q ue ue n o i nf n f lu l u ye y e e n e l p ro r o gr g r am am a
v ar a r ia ia bl b l e c t ie ie ne ne e l v al al or or 7 v ar a r ia i a bl b l e d t ie i e ne n e e l v al a l or or 2 . .5 5 v ar a r ia ia bl bl e e t i ie e ne ne e l v al al or or 1 , q ue ue e s e l r es es to to d e 5 /2 /2
float : una variable de tipo float representa un n´umero umero racional. Su nombre proviene de “ floating “ floating point ” (punto flotante en espa˜nol) nol) y es posible posi ble realiza r ealizarr operacion op eraciones es aritm´ ari tm´eticas eticas sobre ´el. el. El E l siguiente si guiente c´odigo odigo muestra algunos procedimientos b´asicos: asicos: a=2.5 b=5.1 c = a + b # L a v ar a r ia i a bl b l e c t ie i e ne n e e l v al a l or o r 7 .6 .6 d=5/2 # L a v ar a r ia i a bl b l e d t ie i e ne n e e l v al a l or o r 2 .5 .5 e=5//2 # L a v ar a r ia i a bl b l e e t ie i e ne n e e l v al a l or o r 2 , c or o r r es es po p o n di di en e n t e a l a d iv i v is i s io i o n e nt n t er e r a e nt n t re re 5 y 2 f=2**4 # L a v ar ar ia i a bl b l e f t ie ie ne ne e l v al al or or 1 6 , q ue ue e s 2 e le le va v a do do a 4 .
str : str : los objetos de tipo str son los tipos llamados strings. Los strings strings sirven sirven para represen representar tar texto mediante mediante una “cadena de caracteres”. Es importante notar que la concatenaci´on de dos strings se hace con el operador + y que todo texto entre comillas representar´a strings. Como por ejemplo: 1
El c´ odigo en Python no llevar´ odigo a tilde puesto que se cae en algunos sistemas operativos. La raz´on on de esto escapa a los conocimientos del curso. curso.
8
t e xt xt o 1 = " h o l a " t e xt xt o 2 = " c h a o " t e xt xt o 3 = t e xt xt o 1 + t e xt xt o 2 # E s ta ta v a ri r i a bl bl e t i en en e v a lo lo r " h o la l a c ha ha o "
bool : bool : los objetos de tipo bool son variables que pueden tomar s´olo olo dos valores True o False. False. Son de mucha importancia, pues pueden representar condiciones de t´ ermino ermino o de fin de un programa o una parte de este. Es util u ´ til saber lo siguiente: Para saber si una variable a es igual a otra variable b debo escribir a==b. Esto es v´alido alido tanto para tipos int tipos int , float y str entre str entre otros. Para saber si una variable a es mayor o igual a otra variable b debo escribir a >= b. Para saber si una variable a es menor o igual a otra variable b debo escribir a < = b. Para saber si una variable a es mayor a otra variable b debo escribir a >b. Para saber una variable a es menor a otra variable b debo escribir a
5 # E st s t a v a ri r i a bl b l e t i en en e v a lo lo r F a ls ls e v a ri r i a bl b l e 2 = 3 < 5 # E st s t a v a ri r i a bl b l e t i en en e v a lo lo r T ru ru e v a r i a bl bl e 3 = True # E s ta ta v a ri r i a bl bl e t i en en e v a lo lo r T ru ru e v a ri r i a bl b l e 4 = 5 == = = 5 # E st s t a v ar a r ia i a bl b l e t ie i e ne n e v al a l or o r T ru ru e y a q u e 5 e s i gu gu al al a 5 t ex ex t = " h o l a " v ar a r 5 = t ex ex t = = " h o l a " # E st s t a v ar a r ia i a bl b l e e s T ru ru e v ar a r 6 = 5 == == " 5 " # E st s t a v ar a r ia i a bl b l e e s F al a l se s e p ue ue s e l e nt n t er e r o 5 e s d is i s ti t i nt n t o a l s tr t r in i n g ( o c ar a r ac a c te te r ) 5 v ar ar 7 = 5 > = 4 # E st st a v ar ar ia i a bl b l e e s T ru ru e p ue ue s 5 e s m ay ay or or o i gu gu al al a 4 d is i s t = 5 != != 4 # E st s t a v ar a r ia i a bl b l e e s T r ue u e p ue ue s 5 e s d is i s ti t i nt nt o d e 4 n o di di s t = no t (5!=4) # E st st a v ar a r ia i a bl b l e e s F al a l se s e p ue ue s n eg e g am a m os o s e l v al a l or o r d e 5 != != 4 h ol o l a = 5 >4 > 4 an d 5 <4 # E st st a v ar a r ia i a bl b l e e s F al a l se s e p ue ue s a nd nd e xi x i ge g e q ue ue t od o d as a s l as as c la l a us u s ul u l as a s s ea e a n T ru ru e c ha h a o = 5 >4 > 4 or 5 <4 # E st st a v ar a r ia i a bl b l e e s T ru ru e p ue ue s o r e xi x i ge g e q ue ue u na na d e l as as c la l a us u s ul u l as a s s ea ea T ru ru e
Cabe destacar la existencia del tipo None que es el tipo nulo, es decir, es una variable a´un no inicializad inici alizada. a. Tambi´ Tambi´en en recordemo recordemoss que existen varios otros tipos. Se propone al lector lector buscarlos. buscarlos.
3.2.
Comandos B´ asicos asicos
Python incluye algunos comandos b´asicos asicos que debemos conocer antes de comenzar a programar. Estos son funciones que vienen implementadas en Python. Cabe destacar que el concepto de funci´on es bastante amplio y se detallar´ a con profundidad en los siguientes cap´ cap´ıtulos del texto. Por ahora, nos bastar´a con saber que una funci´on on es una entidad que recibe ciertos par´ametros, ametros, y en base a eso, ejecuta ciertas acciones que pueden terminar con el retorno de un valor. Las funciones m´as as b´asicas asicas (y que necesitamos necesitamos hasta ahora) son las siguiente siguientes: s:
9
print : print es una funci´on on que recibe como par´ametro ametro un string y lo imprime i mprime en la consola. Tambi´ en en recibe recib e par´ ametros que no sean strings y los imprime, como int y float ametros float pero es importante saber que si queremos escribir texto y concatenarle una variable que no es string, esta variable debe ser tratada como string mediante str (). str (). Veamos esto en un ejemplo: print print a = 3 print print print
( " h o l a ") " ) # E s t o i m pr pr i me me e n c o ns ns o la la h o la la ( " Mi M i n om o m br b r e e s: s : " + " M i g u e l ") " ) # E st st o i m mp p ri r i me m e e n c on o n so s o la l a M i n om o m br b r e e s : M ig i g ue ue l ( a ) # E st st o i mp m p ri r i me m e e n c on o n so s o la la 3 ( " El E l n um u m er e r o e s: s : " + a ) # E st st o g en e n er e r a e rr r r or o r d e t ip i p os os ( " El E l n um u m er e r o e s: s : " + st r (a)) # E st st o i mp m p ri r i me me e n c o on n so s o la l a E l n um u m er e r o e s: s: 3
input : input es una funci´on on que recibe como par´ametro ametro un string y pide otro string en consola. Este puede ser asignado a una variable. Si quisieramos pedir n´umeros, umeros, debemos transformar el string ingresado en n´umero umero mediante int mediante int () () o float o float (). (). Se debe realizar lo mismo al recibir un bool (). bool (). Ejemplos de esto escritos en Python son: a = input ( " Di D i ga ga u n n om o m br br e : " ) b = in t ( input ( " Di D i ga ga u n n um u m er er o : " )) c = in t ( input ( " D ig ig a o tr t r o n um u m er e r o : " )) print ( " La L a s um u m a d e l os os n um u m er e r os o s d e " + a + " e s : " + st r (b+c))
Figura 3.1: resultado del ejemplo de intput .
3.2. 3.2.1. 1.
Operad Operador ores es
Para los tipos float tipos float e int existen int existen operadores entre dos n´umeros umeros a y b: +: entrega la suma de los n´umeros umeros a y b. −: ∗:
entrega la resta de los n´umeros umeros a y b. entrega la multiplicaci´on on los n´ umeros umeros a y b.
/: entrega la divisi´on on de los n´ umeros umeros a y b. //: entrega la divisi´on on entera de los n´umeros umeros a y b. 10
%: entrega el resto de la divisi´on on de los dos n´ umeros umeros a y b. ∗∗:
3.3.
entrega el resultado de elevar a por p or b.
Programas b´ asicos asicos
Con los conocimientos adquiridos hasta el momento ya es posible hacer programas b´asicos que interact´ uen uen con el usuario pedir un input y devolver algo en consola. Los dos ejemplos presentados a continuaci´on ilustran de buena forma lo que somos capaces de hacer: Ejemplo 2.1 Escriba 2.1 Escriba un programa que pida al usuario el lado de un cuadrado y entregue el ´area, el per´ımetro ımetro y el valor de su diagonal. En este problema debemos hacernos cargo de tres cosas: Recibir el valor del input y guardarlo como un float . Hacer las l as operacion op eraciones es aritm´ ari tm´ eticas eticas respectivas. respe ctivas. Imprimir Imprimir en pantalla pantalla los resultados resultados pedido p edidos. s. Notamos que el primer requerimiento lo hacemos con la funci´on input on input . El segundo requerimiento se logra al hacer las operaciones op eraciones aritm´eticas eticas pertinentes p ertinentes y almacenarlas en variables. El tercer requerimiento hace uso de la funci´on print . La soluci´ on on propuesta es: l ad ad o = float ( input ( " I n gr g r e se s e e l l ad a d o d el e l c u ad ad r ad a d o : " )) p e ri ri m et e t r o = l a do do * 4 a re r e a = l a do do * * 2 d i a g o na na l = l a do do * ( 2 * * ( 1 / 2 ) ) print ( " El E l p er e r im i m et e t ro r o e s: s : " + st r ( p e ri ri m et et r o ) ) print ( " El E l a re re a e s : " + st r ( a re re a ) ) print ( " La L a d ia i a go g o na n a l e s : " + st r ( d i ag a g o na na l ) )
Ejemplo Ejemplo 2.2 Usted 2.2 Usted est´a en un curso curso en el que tiene 3 pruebas pruebas que ponderan ponderan un 20 % cada una, y un examen examen quepondera quepondera el 40 % restante. restante. El curso se aprueba si el promedio promedio no aproximado aproximado del curso es may mayor or o igual que 4.0. Escriba un programa que reciba las 4 notas e imprima True si True si usted aprueba el curso y False y False en en caso contrario. Para resolver el ejemplo debemos recibir las notas correspondientes y realizar las operaciones aritm´eticas eticas pertinenp ertinentes. Aquel valor se compara a 4.0 para ser asignada la respuesta a una variable booleana. Luego esta se imprime en consola. n1 = float ( input ( " I ng n g re r e se se n2 = float ( input ( " I ng n g re r e se se n3 = float ( input ( " I ng n g re r e se se ex = float ( input ( " I ng n g re r e se se p as a s as a s te t e = ( 0. 0 . 2* 2 * n 1 + 0. 0 . 2* 2* n 2 print ( p a s a s t e )
l a n ot o t a d e l a p ru r u eb e b a 1 : " )) l a n ot o t a d e l a p ru r u eb e b a 2 : " )) l a n ot o t a d e l a p ru r u eb e b a 3 : " )) l a n ot o t a d el el e xa x a me m e n : " )) + 0. 0 . 2* 2 * n 3 + 0. 0 . 4* 4 * e x ) > =4 =4 .0 .0
Notemos Notemos que el programa programa anterior anterior es equivalen equivalente te a escribir escribir el siguiente siguiente c´odigo: odigo: n1 = float ( input ( " I ng n g re r e se s e l a n ot o t a d e l a p ru r u eb e b a 1 : " )) n2 = float ( input ( " I ng n g re r e se s e l a n ot ot a d e l a p r ru u eb e b a 2 : " )) n3 = float ( input ( " I ng n g re r e se s e l a n ot o t a d e l a p ru ru e eb b a 3 : " ))
11
ex = float ( input ( " I ng n g re r e se s e l a n ot o t a d el el e xa x a me m e n : " )) print ( ( 0. 0 . 2* 2 * n 1 + 0 .2 . 2 * n2 n2 + 0 .2 . 2 * n3 n3 + 0 .4 .4 * ex e x ) > = 4 .0 .0 )
3.4 3.4.
If, If, el elif y els else
En el ejemplo 2.2, se obten´ıa ıa como resultado una impresi´on on en pantalla de una variable booleana, la que pod´ıa ıa ser True o False . En general, general, no se desea recibir una impresi´ on on en pantalla pantalla de la variable variable booleana, sino que se desea un mensaje distinto dependiendo del valor de la variable. En los lenguajes de programaci´on por lo general existe una manera de ejecutar cierto grupo de acciones dependiendo si una sentencia se cumple o no, es decir, si una variable booleana asociada a la sentencia es verdadera o falsa. En particular, en Python la sintaxis es la siguiente: if < v a r i a b l e y / o e x p r e si si o n b o o le le a na na > : # E j e cu cu t ar ar a q ui ui l a as s a c ci ci o ne n e s i n de d e n ta t a n d ol ol a s
Lo que hace el c´odigo odigo de arriba es ejecutar las acciones declaradas en el if si if si se cumple la condici´on on o si la variable booleana es True . Notemos que tras la variable y/o expresi´on on booleana hay dos puntos (:) y que las acciones a ejecutar deben estar indentadas, es decir, desplazada 4 espacios dentro respecto al if declarado (tambi´ (tambi´en en se puede hacer click en tab). El ejemplo 2.2 puede ser replanteado de la siguiente manera: n1 = float ( input ( " I ng n g re r e se s e l a n ot o t a d e l a p ru r u eb e b a 1 : " )) n2 = float ( input ( " I ng n g re r e se s e l a n ot o t a d e l a p ru r u eb e b a 2 : " )) n3 = float ( input ( " I ng n g re r e se s e l a n ot o t a d e l a p ru r u eb e b a 3 : " )) ex = float ( input ( " I ng n g re r e se s e l a n ot o t a d el el e xa x a me m e n : " )) p ro ro m = 0 .2 . 2 * n1 n1 + 0 .2 .2 * n2 n 2 + 0 .2 .2 * n3 n3 + 0 .4 . 4 * ex ex if p r om om > = 4. 4. 0 : print ( " F e l i c i ta ta c i o ne ne s , a p r o b as as t e e l c u r so so ! ") ") # E s to to i m pr pr i me me " F e l ic ic i ta t a c io io n es es , a p ro ro b as a s t e e l c u rs rs o ! " s i l a v a ri ri a bl b l e p r om om e s m a yo yo r o i g ua ua l a 4 .0 .0
Cabe destacar que se considera “dentro de un if” todo lo que est´e indentado. Puede haber un if if dentro de otro if , y las instrucciones de este deben estar indentadas seg´un corresponda. Ejemplo 2.3 Cree 2.3 Cree un programa que dado un n´umero, determine si es par e imprimir en consola si lo es. Adem´as si es par, el´evelo evelo al cuadrado. Al t´ ermino ermino del programa, desp´ desp´ıdase con un. “Adios mundo!” independiente indep endiente de si el n´ umero umero era par o impar. Es importante saber que en esta oportunidad, si se cumple la condici´on de ser par se deben ejecutar dos instrucciones: Imprimir en consola que es par. Elevarlo al cuadrado. Luego de esto, hay que escribir un “Adios mundo!” fuera del if , ya que esto debe ser independiente de la condici´on de paridad. a = in t ( input ( " I ng n g re r e se s e e l n um um : " )) v ar ar = a % 2 = = 0 if var: # Es E s p o si si b le le p o ne ne r u na n a v a ri r i a bl bl e t i po po b o ol ol print ( " E s p ar ar " ) print (a**2) # E st s t as a s l in i n ea e a s s e e je j e cu c u ta t a n s ol ol o s i a e s p a r print ( " A d i o s m u n d o ! " ) # N o te te m os o s q ue u e n o e st s t a i n de d e n ta ta d o # I nd n d e pe pe nd n d ie i e nt n t e d e l a p ar a r id i d ad a d d e a s e e je j e cu c u ta t a ra r a l a l in i n ea ea
Ahora bien, nos interesar´a tambi´ tambi´en en ejecutar acciones cuando no se cumpla la condici´on on pero si se cumpla otra. Para esto existe la entidad elif, la que viene despu´es es de un if. Si la condici´on on del if no se cumple, pero si se cumple 12
la condici´ on on del elif, se ejecutar´a el grupo de instrucciones que est´a indentadas en el elif. Despu´ es es de la condici´ on on deben ir los dos puntos (:) y adem´as as el elif no debe estar indentado respecto al if original. Es posible adem´as no poner uno, sino que varios elif. Tambi´ en en nos interesa tener la entidad else, que viene despu´ es es de un if o elif. Se ejecuta si ninguna de las condiciones anteriores fue ejecutada y no recibe una condici´on on (variable tipo bool tipo bool )) pero si debe ir acompa˜nada nada de dos puntos (:). Debemos tener en cuenta que: Un if Un if puede puede ir sin acompa˜narse narse de un elif un elif o un else un else . Un else Un else o un elif un elif debe debe estar precedido por un if o un elif un elif . Es posible anillar estas entidades, unas dentro de otras. Ejemplo 2.4 Dise˜ 2.4 Dise˜ nee nee un programa simple que decida cargar el celular si le queda poca bater´ bater´ıa. # Es E s l le l e va v a r a P yt y t ho h o n l a i de d e a d el el e je j e mp m p lo l o 1 .1 .1 b at at = input ( " B a t e r i a b a j a ? \ n 1 ) S i \ n 2 ) N o \ n ") ") # \n \ n e s u n s al a l to t o d e l in i n ea ea if b at at = = 1 : print ( " C a r g a r c e l u l a r " ) else : print ( " No N o c ar a r ga ga r " )
Ejemplo 2.5 Dise˜ 2.5 Dise˜ ne un programa que reciba dos n´umeros a ne umeros a y b y una operaci´on on aritm´ a ritm´etica etica (representada (represe ntada por p or un un n´umero) umero) entre las cuatro b´asicas. asicas. Si la operaci´on on no es correcta decir que no fue posible realizarla. Imprimir en consola los resultados. a = float ( input ( " I n gr g r e se s e e l p r im im e r n u me me r o : " )) b = float ( input ( " I n gr g r e se s e e l s e gu gu n do d o n u me me r o : " )) op = input ( " I ng n g re r e se s e l a o pe p e ra r a ci c i on o n : \ n 1) 1 ) S um um a \ n2 n 2 ) R es e s ta t a \ n3 n 3 ) M ul u l t \ n4 n 4 ) D iv iv \ n" n") if o p = = " 1 " : s = a+ b print ( " La L a s um um a e s : " + st r (s)) elif o p = = " 2 " : r = a -b print ( " La L a r es e s ta t a e s: s : " + st r (r)) elif o p = = " 3 " : m = a * b print ( " L a m u lt l t i p li li c a ci ci o n e s : " + st r (m)) elif o p = = " 4 " : d = a/ b print ( " La L a d iv i v is i s io i o n e s: s : " + st r (d)) else : print ( " N o f ue u e p o si s i b le le r e al al i za z a r o p er e r a ci c i o n ") ") print ( st r (a)+ " ? " + st r (b)) print ( " A d i o s ! ") ")
Antiejemplo 2.1 Pedir 2.1 Pedir 3 n´umeros umeros que representan cada uno lados de un tri´angulo. Ver si el tri´angulo angulo es equil´atero, atero, is´osceles osceles o escaleno. Un error muy frecuente es escribir el siguiente c´odigo: a = float ( input ( " I ng n g re r e se s e e l p ri r i me m e r l ad a d o : " )) b = float ( input ( " I n g re re s e e l s e gu gu n do do l a do do : " ))
13
Figura Figura 3.2: ejemplo 2.5, la calculador calculadora. a. c = float ( input ( " I ng n g re r e se s e e l t er e r ce c e r l ad a d o : " )) if a==b an d b = = c : print ( " E q u i l a t e r o ") ") if a==b or b = = c or a = = c : print ( " I s o s c e l e s ") ") else : print ( " E s c a l e n o ") ")
Lamentablemente este programa no es correcto, ya que si nuestro input es el de un tri´angulo equil´ atero, atero, como por ejemplo a ejemplo a =1, =1, b b =1 y c =1, c =1, el programa imprime en pantalla equil´atero atero e is´osceles, osceles, lo que no es correcto. Esto sucede porque si se cumple la primera condici´on, on, no se excluye de la ejecuci´on on al segundo if , ya que eso lo har´ har´ıa un elif (recordemos que el elif el elif se se ejecuta solamente si no se cumpli´o la condici´on on anterior, anteri or, en cambio un if lo har´ıa ıa siempre). si empre). Una soluci´ solucion o´n correcta corr ecta ser´ıa: ıa: a = float ( input ( " I ng n g re r e se s e e l p ri r i me m e r l ad a d o : " )) b = float ( input ( " I n g re re s e e l s e gu gu n do do l a do do : " )) c = float ( input ( " I ng n g re r e se s e e l t er e r ce c e r l ad a d o : " )) if a==b an d b = = c : print ( " E q u i l a t e r o ") ") elif a = = b or b = = c or a = = c : # En E n v ez ez d e i f p us u s im i m os o s e li li f print ( " I s o s c e l e s ") ") else : print ( " E s c a l e n o ") ")
14
Ejemplo 2.6 Pida 2.6 Pida al usuario 3 n´ umeros que representan los coeficientes de una ecuaci´on cuadr´atica umeros atica a , b , c . Imprima en pantalla: Que no es cuadr´atica atica si a = 0 Que tiene dos soluciones reales si b2 − 4ac ≥ 0. Que tiene una soluci´on on real si b2 − 4ac = 0. Que no tiene soluciones reales si b2 − 4ac ≤ 0. Al realizar este problema debemos comprobar si es o no es cuadr´atica. En el caso de que lo sea, debemos hacer un an´alisis alisis de sus posibles soluciones: a = float ( input ( " I ng n g re r e se s e e l a d e l a e cu c u ac a c io i o n : " )) b = float ( input ( " I ng n g re r e se s e e l b d e l a e cu c u ac a c io i o n : " )) c = float ( input ( " I ng n g re r e se s e e l c d e l a e cu c u ac a c io i o n : " )) if a ! =0 =0 : if b ** * * 2 - 4 *a * a *c *c >= 0 : print ( " T i en en e d os o s s o lu l u c io i o n es e s r e al al e s ") ") elif b * * 2 - 4 * a* a* c = = 0 : print ( " T i en en e u na n a s o lu l u c io io n r e al al ") ") elif b * * 2 - 4 * a* a* c <= 0 : print ( " T i e n e s o l u c i o n e s c o m p le le j a s ") ") else : print ( " N o e s c u ad a d r at a t i ca ca " )
3.5.
Loo oop ps
Al momento de resolver un problema, nos intereser´a ejecutar acciones mientras se cumpla una condici´on. on. En Python podemos realizar esto con la entidad while y for , las que ejecutar´an an las instrucciones que tengan indentadas una y otra vez mientras se sigan cumpliendo determinadas condiciones.
3.5. 3.5.1. 1.
Whil While e
La entidad while repite while repite las instrucciones indentadas mientras una expresi´on booleana sea True sea True . Es posible poner tambi´en en una variable de tipo bool bool dentro. while < C o n d i c i o n y / o v a r i ab ab l e b o ol ol e a na na > : # I n s t r u c c i on on e s i n d e n ta ta d a s q u e s e r a n e j e c u ta ta d a s
Es importante notar que podemos poner un while dentro de otro while respetando la indentaci´on, y tambi´en en es posible poner las entidades condicionales if , elif , else . Al momento de usar un while en while en un programa se debe ser cuidadoso, puesto que si la expresi´on on booleana nunca llega a ser falsa el programa puede quedar en un loop infinito y no terminar. Ejemplo 2.7 Hacer 2.7 Hacer un programa que imprima los n´umeros umeros del 1 al 10 en consola. Para realizar este programa, debemos tener un variable (que llamaremos contador) que diga el n´umero umero de iteraci´on on en la que est´a el loop y se imprima en pantalla seg´un un corresponda. Cuando el contador supere el 10, saldr´a del loop.
15
c ou ou nt nt = 1 while c o un un t < = 1 0 : print ( c o u n t ) c ou ou nt nt = c ou ou nt nt + 1 # c o un un t a u me m e n ta ta e n c ad a d a i t er er a ci ci o n # C ua u a nd n d o c ou o u nt n t s ea ea 1 1, 1 , n o v ol o l ve v e ra ra a e n nt t ra r a r e n e l l oo oo p y s e t er e r mi m i na n a e l p ro r o gr g r am am a
Obs: otra Obs: otra opci´on on v´alida alida para hacer esto es lo siguiente: c ou ou nt nt = 1 s e gu gu i r = True while seguir: print ( c o u n t ) c ou o u nt n t = c ou o u nt nt + 1 if c ou o u n t = = 1 1: 1: s e gu gu i r = False
Ejemplo 2.8 Pedir 2.8 Pedir al usuario un natural n e imprimir en pantalla el factorial de dicho n´umero. Para realizar este programa, adem´as as de llevar un contador de iteraci´on, debemos tener una variable que lleve el valor del factorial: n = in t ( input ( " I ng n g re r e se s e e l n um u m er e r o n : " )) c ou ou nt nt = 1 mu l t = 1 while c o un un t < = n : mu lt = m ul t * co un t c ou ou nt nt = c ou ou nt nt + 1 print ( m u l t )
3.5. 3.5.2. 2.
For
Un for Un for es es una entidad que recorre de manera determinada los elementos de una lista y ejecuta las instrucciones que tenga indentadas. Si indentadas. Si bien el cap´ cap´ıtulo de listas li stas es p osterior, y en ´ el el aprenderemos a usar bien la l a entidad for, for, es posible entender lo b´asico asico para usar for usar for como como un loop. Posee la siguiente sintaxis: fo r < v a r i a b l e l o ca ca l > i n < l i st st a > : # G r up up o d e i n s tr tr u cc c c i o ne ne s a e j ec e c u ta ta r # P ue u e de d e n u sa s a r o n o a l a v ar a r ia i a bl b l e l oc o c al al
Es necesario antes conocer antes la funci´on range on range . range representa range representa una secuencia de n´umeros umeros y es usada frecuente2 mente para inicar loops en donde se conoce el n´umero de iteraciones mediante un for . Se inicializa de la siguiente manera: a = range (,) b = range (,,< intervalo >)
Donde n´ umero umero inicial inicial es el n´ımero en que parte la secuencia, secuencia, n´umero umero final es el sucesor del ´ultimo ultimo n´ umero umero de la secuencia, y si se inicializa con intervalo con intervalo,, el intervalo entre n´umero umero y n´umero umero es ese (Si no est´a inicializado con intervalo, intervalo, avanza de 1 en 1). Por ejemplo: 2
Esta definici´ on on fue extra´ extra´ıda de la documentaci´ on on oficial de Python
16
range (1,10) (1,10) tiene los n´umeros umeros 1, 2, 3, 4, 5, 6, 7, 8, 9. range (1,10,2) (1,10,2) tiene los n´umeros umeros 1, 3, 5, 7, 9. range (1,10,3) (1,10,3) tiene los n´umeros umeros 1, 4, 7. As´ı, ı, el siguie sig uiente nte for for :: fo r i in range ( 1 , 10 1 0 ): ): # A c c i o n es es i n d e n ta ta d a s
hace nueve iteraciones, una para cada valor que toma i. Empezar´a en 1, luego valdr´a 2, e incrementar´a hasta llegar a 9. Ejemplo 2.9.1 Imprimir 2.9.1 Imprimir en pantalla los n´umeros umeros pares entre 1 y 10 excluy´ endolos. endolos. fo r i in range ( 2 , 10 10 , 2) 2) : print ( i )
Ejemplo 2.9.2 Imprimir 2.9.2 Imprimir en pantalla los n´umeros umeros impares entre 1 y 10 sin excluirlos. a = range ( 1 , 10 10 , 2 ) fo r i i n a : # N o te te mo m o s q ue ue i n ic ic ia i a li l i z am am os o s e l r an a n ge g e a nt n t es e s d e u sa s a rl r l o e n e l f or or print ( i )
Ejemplo 2.10 Pedir 2.10 Pedir un n´ umero umero natural n e imprimir en pantalla los numeros primos entre 1 y n. Recordemos que un n´umero umero es primo si solamente es divisible por 1 y por si mismo. Para determinar si un n´umero n es primo podemos dividirlo desde 2 hasta n − 1. Podemos llevar una variable booleana (ser´a True si True si el n´umero umero es primo) que por defecto sea True y True y que cuando el resto de la divisi´on entre n y alg´ un un n´ umero umero i entre 2 y n − 1 sea 0 (i.e. n es divisible en i) se haga False haga False . Podemos llevar un loop que seleccione de 1 en 1 el n´umero umero n a comprobar si es primo, y dentro de este loop, otro que vaya dividiendo por todos los x entre 2 y n − 1. Cuando salga del loop interior, si la variable booleana sigue siendo verdadera, imprimir´a el n´ umero. Luego debe continuar con el loop umero. extrerior para comprobar todos los n´umeros umeros restantes, luego de reseteada la variable bool a True . n = in t ( input ( " I ng n g re r e se s e e l n um u m er e r o n : " )) e s Pr P r i mo mo = True fo r i in range ( 2 , n + 1 ): ): fo r x in range (2,i): if i %x = =0 =0 : e s Pr Pr i mo m o = False # N o ta ta r q ue ue l a l i ne ne a a c o n ti ti n ua u a c io i o n e st s t a a f ue ue r a d el e l l oo o o p i n te t e r no no , p er e r o d e nt nt r o d el e l e x te te r io io r if e s P ri ri m o : print ( i ) e s Pr Pr i mo mo = True # D e be be m os os r e se se t ea e a r l a e s Pr P r i mo mo a n te te s d e v o lv lv e r a l l oo o o p e x te t e r io io r
3.5. 3.5.3. 3.
Break Break y cont contin inue ue
A veces no deseamos declarar variablas tipo bool adicionales para continuar o parar con un loop. Para esto existen dos entidades llamadas break llamadas break y continue . Al ejecutar un break un break dentro dentro del loop, este terminar´a, a, y no ejecuta ninguna de las instrucciones dentro del loop que estaban debajo del break. En cambio continue hace continue hace que el loop pase a la siguiente iteraci´on on saltandose todas las l as lineas dentro del loop l oop que estuviesen despu´es es del continue .
17
Ejemplo 2.11 Escriba 2.11 Escriba el programa que imprime los primeros 10 naturales en pantalla usando break y continue . c ou ou nt nt = 1 w h i le le T r ue ue : print ( c o u n t ) c ou o u nt n t + = 1 # E st st o e s l o m is i s mo m o q ue ue e sc s c ri r i bi b i r c ou o u nt n t = c ou o u nt nt + 1 if c o u nt nt < = 10 10 : continue else : break
Notemos que con buen manejo de variables de tipo bool es bool es posible realizar lo mismo que haria un break o un contiun continue . Queda a criterio del programador la v´ıaa que utilizar´a cuando necesite usar loops para resolver un problema. Ejemplo Ejemplo 2.12 Dise˜ 2.12 Dise˜ ne un programa que reciba dos n´umeros ne umeros a y b y una operaci´on on aritm´ etica etica entre las cuatro b´asicas asicas representada como un n´umero. umero. Si la operaci´on on no es correcta decir que no fue posible realizarla. Imprimir en consola los resultados. Luego de esto, preguntarle al usuario si desea realizar otra operaci´on. Si responde “si”, ejecutar nuevamente el programa. Nuevamente es un ejemplo conocido, pero esta vez debemos a˜nadir nadir un loop que nos mantenga en el programa hasta que deseemos salir. Hay varias formas de hacer esto, pero la propuesta es la siguiente: s="si" w h i le le T r ue ue : if s != " s i ": ": break a = float ( input ( " I ng n g re r e se s e e l p ri r i me m e r n um u m er e r o a : " )) b = float ( input ( " I ng n g re r e se s e e l s eg e g un u n do d o n um u m er e r o b : " )) op = input ( " I n gr g r e se se l a o p er e r a ci ci o n : \ n 1 ) S u ma ma \ n 2 ) R e st st a \ n 3 ) M u l \ n 4 ) D i v \ n ") ") if o p = = " 1 " : s = a+b print ( " La L a s um um a e s: s : " + st r (s)) elif o p = = " 2 " : r = a -b print ( " La L a r es e s ta t a e s: s : " + st r (r)) elif o p = = " 3 " : m = a * b print ( " La L a m ul ul t e s: s : " + st r (m)) elif o p = = " 4 " : d = a/b print ( " La L a d iv iv e s : " + st r (d)) else : print ( " I n g r e se se o p e r a ci ci o n v a l i da da " ) s = input ( " D e s e a s e g u i r ? " )
18
Cap´ıtulo 4
Funci un cion ones es y m´ odu odulos los 4.1. 4.1.
Funci uncion ones es
Ya hab´ hab´ıamos hablado anteriormente anteriormente de funciones como entidades que reciben par´ametros ametros y realizan un conjunto de acciones. Sin embargo debemos ahondar un poco m´as. as. Una funci´on on es una secci´on on apartada del codigo que ejecuta ciertas acciones en base a par´ametros ametros entregados. Luego puede retornar un valor o no retornar nada. Una funci´on por si sola no hace nada, y la idea es utilizarla en el programa al llamarla. Una ventaja muy importante que tienen las funciones es que si queremos reutilizar el c´odigo de una parte del programa, cambiando s´olo olo ciertos par´ametros, ametros, es posible crear una funci´on, on, y la llamamos las veces que necesitemos cambiando los par´ametros de entrada. La sintaxis es como se sigue: de f < n o m br b r e f un u n c io io n > ( p a r am am e tr t r o 1 , p a ra r a m et e t r o2 o 2 , . .. .. , p a ra ra m et e t r oN oN ) : # A q ui ui e l c o di di g o i n de d e n ta ta d o #... return < v a l or or d e s a li li d a > # P ue u e de d e o n o t en e n er e r r et e t ur ur n
Luego basta con llamar a la funci´on on con su nombre en el c´odigo. odigo. Cabe destacar que para usar una funci´on on debe ser declarada antes del c´odigo odigo en el que se va a utilizar, aunque si otra funci´on usa una funci´on, on, esto no necesariamente se debe cumplir. Repitamos un ejemplo hecho anteriormente, pero ahora aplicando funciones. Ejemplo 3.1 Pedir 3.1 Pedir un n´umero umero natural n e imprimir en pantalla los n´umeros umeros primos entre 1 y n. Se repite repite el concepto concepto hecho en el cap´ cap´ıtulo anterior, anterior, pero esta vez para determinar determinar si un n´umero umero es primo se aplicar´ a una funci´on: on: de f e s P r im im o ( n u m ) : # n um um e s e l p ar a r am a m et e t ro r o d e e nt n t ra r a da d a q ue ue r ep e p re r e se s e nt n t a e l n um u m er e r o q ue ue q ue u e re r e mo m o s s ab a b er e r s i e s p ri ri mo mo # Es E s u na na v ar a r ia i a bl b l e l oc o c al a l y n o i nf n f lu l u ye y e f ue u e ra r a d e l a f un u n ci c i on on p r im im o = True fo r i in range ( 2 , n um um ) : if n um um %i = =0 =0 : p r im im o = False return primo # R e to to rn r n a T ru ru e s i u n n um u m er e r o n um um e s p ri r i mo mo n = in t ( input ( " I n gr g r e se se u n n u me me r o : " )) fo r i in range (2,n): if esPrimo(i): # L la l a ma m a mo m o s a l a f un u n ci c i on o n e n c ad a d a i te t e ra r a ci c i on on print ( i )
19
Ejemplo 3.2 Cree 3.2 Cree dos funciones que dado el lado de un cuadrado, una retorne su p er´ er´ımetro, otra su ´area, area, y otra el valor de su diagonal. de f p e r i m e tr tr o ( l a d o ) : return 4*lado de f a r ea ea ( l a d o ) : return lado**2 de f d i a g on on a l ( l a d o ) : return l a d o * ( 2 * * 0. 0. 5 ) # A h or or a l as a s u s ar a r e mo m o s e n u n p r og og r am am a l = float ( input ( " I ng n g re r e se s e e l l ad a d o : " )) a = p er e r im i m et e t ro ro ( l ) b = a re re a ( l) l) print ( a ) print ( b ) print ( d i a g o na na l ( l ) ) # A qu qu i n o a s ig i g n am a m o s d i ag ag o na n a l ( l ) a u na n a v a ri ri a bl bl e
Cabe destacar que una funci´on on retorna un valor si y s´olo olo si tiene return. return. Si esta finaliza con un print y no posee return, esta funci´on on no se puede asignar a una variable: de f unaFunc(s): print ( s + " a l gu gu n s t ri ri n g ") ") de f otraFunc(s): a = s + " a l gu gu n s t ri ri n g " return a # v a lo lo r = u n aF aF u nc n c ( " h o la la " ) E st s t o t ir i r a e r ro ro r ! ! v a lo lo r = o t ra r a F un u n c (" ( " h o l a ") " ) E st st o e s p os o s ib i b le le
Es necesario recalcar que adem´as as al llegar al return no se sigue ejecutando ning´un un otro c´odigo odigo dentro de la funci´on on aunque este exista c´odigo odigo m´as as abajo.
4.2.
Modulos o ´dulos
Un m´odulo odulo en Python es una colecci´on on de funciones y constantes que pueden ser importadas desde cualquier otro programa. En general, cuando creamos un programa, y lo guardamos con extensi´on .py on .py , estamos creando un m´odulo. odulo. Python trae varios implementados. Entre los m´as destacados est´an an random y math. Para usar un m´odulo odulo implementado por Python se debe escribir lo siguiente: f r o m < N o m b re re de l m od o d ul u l o > i m po po r t < N o mb mb r e d e l o q ue u e d e se se a mo m o s i mp m p o rt rt a r >
Obs. Tambi´ Obs. Tambi´en en es posibl pos ible: e: i m p o rt rt < N o m b re re de l modulo > # L u eg eg o p a ra ra u s ar ar l a f u nc nc i on o n u s am am o s < N o mb mb r e d el e l m od o d ul u l o > . < N om om b re re d e l a f un u n ci ci o n >
Si el m´odulo odulo que queremos usar es uno de los que guardamos nosotros se debe hacer de la misma manera, pero el programa en el que convocamos al m´odulo debe estar guardado en la misma carpeta que el m´odulo que estamos importando. Podemos importar de ´el el las funciones definidas. Luego podemos usar la entidad importada. Queda a criterio del lector buscar los m´odulos odulos que necesite y averiguar las funciones pertinentes. Veamos un ejemplo:
20
Ejemplo 3.3 Usando 3.3 Usando el m´odulo odulo math, dado cierto radio, calcular el ´area area y el e l per´ımetro ımet ro de un c´ırculo ırc ulo.. Se realizar´a con funciones. funciones. Usaremos Usaremos la constant constantee Pi implementada Pi implementada en el m´odulo math odulo math : f ro r o m m at a t h i m po po r t p i de f perimetroCirc(radio): return 2*pi*radio de f areaCirc(radio): return pi*(radio**2) r = float ( input ( " I n gr g r e se s e e l r a di di o : " )) print ( p e r i m e t r o C i r c ( r ) ) print ( a r e a C i r c ( r ) )
4.3.
Main
Cuando nosotros tenemos un m´odulo odulo que aparte de funciones tiene c´odigo odigo que se ejecuta como en el ejemplo 3.3, si llegamos a importar ese m´odulo, odulo, aunque no lo queramos, en nuestro programa se ejecutar´a el c´odigo odigo que no fue declarado dentro de una funci´on. on. Supongamos que tenemos un m´odulo odulo con el c´odigo odigo del ejemplo 3.3 llamado Circ, y adem´as as tenemos otro programa en que importamos la funci´on on perimetroCirc. El resultado ser´ ser´ıa el siguiente: Antes de ejecutar el codigo de nuestro programa (un simple “hello world”) se ejecuta el c´odigo del m´odulo, odulo, en que ped´ıa ıa un radio e imprim´ıa ıa en consola el per´ımetro ımetro y el ´area area del c´ırculo aso ciado. Para esto, debemos deb emos agregar un condicional en el m´odulo odulo Circ que incluye todo el c´odigo odigo “ejecutable” (es decir, el c´odigo odigo no definido como funci´on). on). En general, cuando tengamos un m´odulo, odulo, y queramos mantener c´odigo odigo ejecutable, pero queremos que se ejecute s´ olo si lo estamos abriendo desde el mismo m´odulo, olo odulo, este debe ir indentado en el siguiente if: if _ _ n a me me _ _ = = " m a i n " : # C o d i g o e j e c u ta ta b l e
As´ı, ı, el m´odulo odu lo Circ C irc quedar´ que dar´ıa: ıa: f ro r o m m at a t h i m po po r t p i de f perimetroCirc(radio): return 2*pi*radio de f areaCirc(radio): return pi*(radio**2) if _ _ n a me me _ _ = = " m a i n " : r = float ( input ( " I ng n g re r e se s e e l r ad a d io i o : " )) print ( p e r i m e t r o C i r c ( r ) ) print ( a r e a C i r c ( r ) )
Y si importamos en alg´on on otro programa el m´odulo odulo Circ.py, no se ejecutar´a aquel c´odigo odigo (el programa de la figura 3.1 imprimir´ i mprimir´ıa ıa sencilla se ncillamente mente un “hello “ hello world”). Obs. Es Obs. Es una buena pr´actica actica de programaci´on on no escribir c´odigo odigo ejecutable en un m´odulo odulo si s´olo olo queremos definir en ´el el funciones. Si deseamos hacer un programa relativamente relativamente grande, el ejecutable debe ir i r en un m´odulo separado que importe todos los dem´as as m´odulos odulos en los que est´an an declaradas las funciones por usar.
21
Figura 4.1: problemas con m´odulos. odulos.
22
Cap´ıtulo 5
Strings 5.1. 5.1.
Decl Declar arac aci´ i´ o n y manejo de strings on
Hasta ahora hemos aplicado conceptos sobre todo aritm´ eticos eticos y matem´aticos aticos simples. Pero ¿Qu´e hay acerca del procesamiento de texto en Python?. Ya hemos introducido un tipo llamado string que correspone a la representaci´ on on de una cadena de caracteres. Este cap´ cap´ıtulo busca ilustrar parte de las funciones m´as as importante a la hora de trabajar con strings. strings. Una variable se declara de tipo string cuando se le asigna texto entre “ ” o bien se le asigna el retorno de una funci´ on de tipo string. Por ejemplo: on s = " Ho Ho la la , s oy o y u n s t ri ri n g " # D e c la la r ac a c i on o n d e u n s t ri ri n g s2 = input ( " I n gr g r e se se s u t e xt xt o ") " ) # R e c or or d em e m o s q ue ue i np n p u t g u ar ar d a c om om o # s t ri r i n g e l t e xt xt o i n gr g r e sa s a d o p or o r e l u s ua ua r io io .
Para el manejo de string es posible usar utilidades que ya vienen implementadas en python: Para saber la cantidad de caracteres de un string usamos la funci´on len: s = "mensaje" a = le n ( s ) # Es E s t a v a ri ri a bl b l e t i en en e e l v a lo lo r 7
Para acceder al i-´ esimo esimo caracter de un string es posible p osible hacer lo siguiente: s = " Ho H o la la , s oy o y u n s t ri ri n g " a = s [ 0 ] # E st st a v a ri r i a bl b l e t i en en e e l v a lo lo r " H " b = s [ 1 ] # E st st a v a r ri i a bl b l e t i en en e e l v a lo lo r " o "
Notemos que el carater en la primera posici´on o n es el 0 y que la ´ultima ultima posici´ on on es la len(s) −1. Para saber si un caracter o un string forma parte de un string: s = " Ho H o la la , s oy o y u n s t ri ri n g " v ar ar = " a " in s # V a ri ri a bl bl e b o ol ol e an a n a q ue u e t o ma ma e l v al a l o r T ru ru e # P ue u e s e l c ar a r ac a c te t e r a e st st a e n e l s tr t r in in g .
23
v ar a r 2 = " H o l a " in s # V ar a r i ab a b l e b o ol o l e an an a q ue u e t om o m a e l v a lo lo r T ru ru e v ar a r 3 = " C h a o " in s # V a ri r i a bl b l e b o ol o l e an an a d e v a lo lo r F a ls ls e
Para saber el orden seg´ un la tabla ascii de dos strings podemos usar < o > . Un string es “mayor que otro” si un un un la tabla ASCII1 es posterior. el orden orde n alfa a lfab´ b´etico etic o seg´ p osterior. Notar que si se desea el orden alfab´ etico etico se desea hacer normalmente se debe hacer convirtiendo todo a min´uscula uscula o may´uscula. uscula. s = "Alameda" s2 = " P r o v i d e n c i a " a = ss2 # a t om o m a e l v al al or o r T ru ru e # b t om o m a e l v al al or o r F al a l se se
variable ser´ ser´a True si True si s1 est´a alfab´eticamente eticamente antes que s2 de s2 de lo contrario ser´a False Para Para extraer extraer parte de un string y almacenarl almacenarloo (en otros lenguajes esto se hace con una funci´ funci´on llamada subsllamada substring) tring) debemos hacer string [x:y] [x:y] que toma el string desde la posici´on on x hasta la y-1. Por ejemplo: s = " S oy oy u n s t ri ri n g " a = s [ 0: 0 : 5] 5] # a t ie i e ne ne e l v a al l or o r " S oy oy u " b = s [ 3: 3 : 7] 7] # b t i en e n e e l v al al or or " u n " c = s [: [ : 7] 7] # c t ie ie ne ne e l v al al or or " So So y un " d = s [5 [ 5 :] :] # d t ie i e ne n e e l v al a l or o r " n s tr t r in in g " e = s [ 1: 1: - 2] 2] # e t ie i e ne n e e l v al a l or o r " oy o y u n s tr tr i "
Notamos que c, d son esp eciales. Las dos primeras porque carecen de un t´ermino. ermino. Python asume que el usuario intent´o decir que el termino faltante era 0 y len(s) respectivamente. En cuanto a e, que tiene un n´umero negativo, esto se toma como la posici´on on desde derecha derecha a izquierda. izquierda.
5.2. 5.2.
Funci uncione oness de strin strings gs
Existen en Python ciertas funciones que nos permiten realizar varias funciones con los datos de tipo string. Estas funciones requieren una instancia de un string para ser usadas de la forma: string.funcion(parametros)
Algunas de las funciones se presentan a continuaci´on. Se propone al lector que averigue en la documentaci´on on oficial de Python acerca de otras que logre necesitar: 1
Esta tabla se explica en secciones posteriores.
24
replace(stri replace(string1,st ng1,string2) ring2):: Reemplaza Reemplaza en un string el valor valor string1 si est´ a contenido por el valor de string2. s = " h ol ol a h ol o l a c ha h a o h ol ol a " s . r e p l a c e (" ( " c h a o ", " , " h o l a ") ") # A ho h o ra r a e l v al a l or o r d e s e s " h o la la h ol o l a h ol o l a h ol ol a "
isalpha(): isalpha(): Funci´on on que retorna True si el string contiene s´olo olo caracteres caractere s alfab´eticos: eticos: s = " h ol ol a " a = s . i s al al p ha ha ( ) # a p os o s ee e e e l v al a l or o r T ru ru e s="123" a = s . i s al al p ha ha ( ) # a p os o s ee e e e l v al a l or o r F al a l se se
count(string1): count(string1): Funci´on on que retorna un int que cuenta cuantas veces string1 aparece dentro del string. s a b c # # #
= = = = a b c
" h ol ol a h ol o l a c ha h a o h ol ol a " s . co c o un u n t (" (" a " ) s . co c o un u n t (" ( " h o l a ") ") s . co c o un u n t (" ( " c h a o ") ") es 4 es 4 es 0
find(string1): find(string1): Encuentra la primera aparici´on on en el string de string1. Si no existe retorna -1. s = "hola" a = s . fi f i nd n d (" (" a") s2 = " b a b a r o a " b = s 2. 2 . f in in d (" (" b " ) c = s 2. 2 . f in in d (" ( " r o ") ") # a es 3 # b es 0 # c es 4
upper(): upper(): Retorna un string con todos to dos los caracteres alfab´eticos eticos en may´uscula. uscula. s = "hola" a = s . up u p pe p e r () () # a e s " HO H O LA LA "
lower(): lower(): Retorna un string con todos los caracteres alfab´ eticos eticos en min´uscula. uscula. s = "Hola" a = s . lo l o we w e r () () # a e s " ho h o la la "
strip(): strip(): Elimina los espacios de los lados.
25
s = " H ol o l a t en en go g o e sp s p ac a c io io s " a = s . st s t ri r i p () () # a e s " H o la l a t en e n go g o e sp s p ac a c io io s " # Si Si , e s m en en ti t i ra ra , p or o r qu q u e a n o t ie i e ne n e e sp s p ac a c io i o s a l os os l ad a d os os : (
5.3. 5.3.
El tip tipo o chr chr y la la tabl tabla a ASCI ASCIII
En Python no existe el tipo chr tipo chr p por or si solo, sin embargo embargo es posible trabajar con strings strings de largo 1, es decir, podemos 2 representar caracteres. Un caracter es la representaci´on de 8-bits asociado a una tabla llamada ASCII. Esta tabla para cada n´ umero entre 0 y el 255 posee una representaci´on en forma de caracter. umero En Python para obtener el n´umero umero asociado a un caracter usamos la funci´on ord on ord(char). (char). En cambio, para obtener el caracter asociado a n´umero umero usamos la funci´on chr on chr(int). (int). Por ejemplo:
Figura 5.1: ejemplo de ord() ord () y chr(). chr (). Es necesario notar que en la tabla ASCII: Las letras en may´uscula uscula de la A la A a la Z la Z est´an an entre los n´ umeros umeros 65 y 90. Las letras en min´uscula uscula de la a la a a la z la z est´an an entre los n´ umeros umeros 97 y 122. Ejemplo 4.1 Reciba 4.1 Reciba un string por parte del usuario y compruebe si este posee s´olo caracteres caractere s alfab´ a lfab´eticos. eticos. Luego, si se cumple lo anterior, preguntele al usuario si desea pasar todo el texto a may´uscula uscula o min´ uscula. uscula. Para realizar el ejercicio utilizaremos las funciones que detallamos anteriormente: s = input ( " I ng n g re r e se s e s u t ex e x to to : " ) if s.isalpha(): s2 = input ( " Q u e d e s e a h a c er er ? \ n 1 ) M a y u s cu cu l a s \ n 2 ) M i n u s c u l a s \ n ") ") if s 2 = = " 1 " : s = s . up u p pe p e r () () print ( s ) elif s 2 = = " 2 " : 2
8 bits es un n´umero umero de 8 d´ıgitos ıgitos en binario, que forma la unidad byte
26
s = s . lo l o we w e r () () print ( s )
Es necesario notar que debemos asignarle a s el valor de la manera s = s.lower() o bien s bien s = s.upper() ya que estas funciones no cambian el valor de s sino que retornan un nuevo elemento con el valor correspondiente a cambiar todas a may´usculas usculas o min´ usculas. Para profundizar en el manejo de strings es necesario pasar al siguiente cap´ usculas. cap´ıtulo correspondiente a listas.
27
Cap´ıtulo 6
Listas 6.1. 6.1.
Lista Listass Unidi Unidime mens nsion ional ales es
Las listas corresponden a un tipo de estructura de datos que son capaces de almacenar variables instanciadas. Informalmente, podemos ver a los arreglos como casilleros en los que guardamos valores, y cada vez que agregamos un valor a la lista se agrega un casillero con una informaci´on correspondiente dentro. Su declaraci´on on m´as as b´asica asica es de la forma: mi m i L is t a = []
En donde miLista corresponde a una lista unidimensional capaz de almacenar datos. Su funci´on fundamental es append(valor), append(valor), que adhiere al final de la lista a valor . Por ejemplo: mi m i L is t a = [] mi m i L is t a . a p pe nd (1 ) mi m i L is t a . a p pe nd (2 ) mi m i L is t a . a p pe nd (3 ) mi m i L is t a . a p pe nd (4 ) mi m i L is t a . a p pe nd (5 )
Agregamos a una lista vac´ vac´ıa los n´ umeros enteros 1, 2, 3, 4, 5. Si ahora imprimimos la lista: umeros mi m i L is t a = [] mi m i L is t a . a p pe nd (1 ) mi m i L is t a . a p pe nd (2 ) mi m i L is t a . a p pe nd (3 ) mi m i L is t a . a p pe nd (4 ) mi m i L is t a . a p pe nd (5 ) print ( m i L i s t a )
El resultado se muestra en la figura 5.1: Para conocer el largo (n´umero umero de elementos que hay almacenados en la lista) al igual que en strings ocupamos la funci´ on on len(lista). mi m i L is t a = [] mi m i L is t a . a p pe nd (1 )
28
Figura 6.1: adherir elementos a una lista. mi m i L is t a . a p pe nd (2 ) mi m i L is t a . a p pe nd (3 ) mi m i L is t a . a p pe nd (4 ) mi m i L is t a . a p pe nd (5 ) a = le n ( l i s t a ) # El E l v al a l or or d e a e s 5 p ue u e s t ie i e ne n e 5 e le l e me m e nt n t os o s a lm l m ac a c en e n ad a d os os
Una vez inicializada la lista podemos acceder al i-´esimo esimo elemento de la l a misma manera que a un string, es decir lista[i]: lista[i]: mi m i L is t a = [] mi m i L is t a . a p pe nd (1 ) mi m i L is t a . a p pe nd (2 ) mi m i L is t a . a p pe nd (3 ) mi m i L is t a . a p pe nd (4 ) mi m i L is t a . a p pe nd (5 ) print (miLista[0]) print (miLista[3])
Donde cabe destacar que el primer elemento est´a en la posici´on o n 0 y el ´ultimo ultimo en la posici´on on len(lista) − 1. El resultado de lo anterior es el siguiente:
Figura 6.2: acceder al i-´ i -´ esimo esimo elemento.
29
A diferencia de otros lenguajes, es posible adjuntar a una lista valores de distintos tipos. Por ejemplo en una lista podemos guardar valores float, int, string entre los otros que conocemos. Cabe destacar que la lista es una estructura tu ra din´ di n´ amica ami ca ya que su largo no es fijo. Bajo este contexto no se debe confundir a la lista con otra estructura arreglo, la que tiene un comportamiento similiar, pero su largo (cantidad de “casilleros” para de datos llamada arreglo, almacenar informaci´on) on) es fijo despu´ es es de su creaci´on, on, sin embargo embargo,, es posible modificar lo que tenga el t´ ermino ermino i-´esimo esi mo del d el arreglo. arre glo. En Python existe adem´as as otro tipo llamado tupla llamado tupla,, el que consta de informaci´on on que no necesariamente es del mismo tipo, pero tiene un largo fijo. Adem´as as no es posible modificar los valores de la tupla luego de que esta fue creada. Queda a criterio del lector buscar informaci´on on sobre estas dos estructura estructurass de datos datos mencionad mencionadas. as. Ejemplo 5.1 Cree 5.1 Cree una bit´acora acora en Python en el que sea posible pedir al usuario la fecha de un suceso y un string que diga el suceso que desea guardar. Para esto haremos un men´u para ver si el usuario quiere agregar una nota o verlas todas. b i ta t a c or or a = [ ] op = 0 while o p ! = " 3 " : op = input ( " Q ue u e d e se se a h a ce ce r \ n1 n 1 ) A g re re g ar a r n o ta ta \ n 2 ) L e er er N o ta ta s \ n3 n 3 ) S a li li r \ n ") ") if o p = = " 1 " : # S e s u po po n e q u e e l u s ua ua r io io i n gr gr e sa sa b i en en e s to to s d a to to s y ea ea r = input ( " Y e ar ar ? : " ) mon m on t h = input ( " M o nt nt h ? : " ) d ay ay = input ( " D ay ay ? : " ) s u ce ce s o = input ( " I n g re re s e e l s u ce ce s o : " ) s = y ea ea r+ r + " / " + m o n t h +" + " / " + d a y +" + " : " +suceso bitacora.append(s) if o p = = " 2 " : fo r i in range (0 , le n (bitacora)): print ( b i t a c o r a [ i ] ) elif op!= " 3 " an d op!= " 2 " an d op!= " 1 " : print ( " I n g r e so so e q u iv iv o c ad ad o , \ i n t e n t e d e n u e vo vo " )
6.2.
Utilida Utilidades des y funci funcione oness para list listas as unidim unidimens ensiona ionales les
Aparte de len() de len() y y append() existen append() existen otras funciones y utilidades que hay que tener presentes sobre listas: Para obtener parte de una lista debemos usar lista[x:y] de la misma forma que en strings. Esto no modifica la lista original. l1=[1,2,3,4,5,6,7,8,9,10] l2=l1[5:] # l 2 t i en en e l os o s v a lo lo r es es : [ 6 , 7 ,8 ,8 , 9 , 10 10 ]
Para transformar un string a una lista de caracteres podemos usar list(): list(): s="hola" l i st st a = list ( s ) # l i st s t a t i en en e l os o s v a lo lo r es es : [ " h " ," ," o " , "l " l " , "a "a " ]
Esto ultimo u ´ ltimo tambi´en en funciona para pasar un valor de tipo range() a range() a una lista de n´umeros. umeros. Esto se muestra en 30
la figura 5.3.
Figura 6.3: range vs lista. lista.remove(elemento): Elimina la primera aparaci´on lista.remove(elemento): on de “elemento” en la lista. Si no existe se nos lanza un error. s="hola" l i st st a = list ( s ) lista.remove( " h " ) # l i st s t a a h or or a t i en en e l os o s v a lo l o r es es : [ " o " ," ," l " ," ," a " ]
Si queremos borrar el i-´ esimo esimo elemento de la lista l ista debemos deb emos usar del lista[i]: lista[i]: a = [ 1 ,1 , 1 , 2 , 3 ,4 , 4 , 5 , 2 ,1 ,1 0] 0] de l a [ le n (a)-2] # Ah A h o ra ra a e s [ 1 , 1 , 2 , 3 , 4 , 5 , 1 0] 0]
Si tenemos dos listas l1 y l2, unimos las listas con el operador +. Un ejemplo es: a = [ 1 ,2 ,2 , 3] 3] b = [ 4 ,5 ,5 , 6] 6] c = a+b #c es [1, 2, 3, 4, 5, 6]
lista.index(elemento):: retorna el entero en el que est´a la primera aparici´on lista.index(elemento) on de “elemento” en la lista. Si “element “elemento” o” no existe existe en la lista obtendremos obtendremos error. a = "holah" b = a . in i n de d e x (" (" h " ) #b es 0
lista.count(elemento):: retorna la cantidad de veces que “elemento” se encuentra en la lista. lista.count(elemento)
31
a b c d e #b #c #d #e
= = = = =
[ 1 ,1 , 1 , 2 , 2 ,2 ,2 , 3 , 4 ,5 ,5 , 5 , 5] 5] a . c ou o u n t ( 1) 1) a . c ou o u n t ( 3) 3) a . c ou o u n t ( 5) 5) a . c ou o u n t ( 6) 6) es es es es
2 1 3 0
string.split(string2): string.split(string2): retorna una lista de string en la que que cada se borr´o todas las apariciones de string2, y se hizo una lista con cada elemento que no fue eliminado. El string original no se ve modificado. s="Soy|un|string|con|rayas" b = s . sp s p li l i t (" (" | " ) # b e s [ ’ So S o y ’ , ’ un un ’ , ’ s tr tr in i n g ’ , ’ co c o n ’ , ’ r ay ay as as ’ ] s2 = " Yo Y o n o s e q ue ue s oy oy " b 2 = s 2 . sp s p l it it ( " n o ") ") # b e s [ ’ Yo Yo ’ , ’ s e q u e s oy oy ’ ]
6.3.
For
Ya hab´ıamos ıamos usado el for anteriormente anteriormente como una herramienta para realizar iteraciones usando “range”. Ahora que conocemos las listas, podemos decir que este es un tipo “iterable”, es decir, podemos realizar acciones para cada uno de los valores almacenados. Cuando hacemos: fo r < v a r i a b l e l o ca ca l > i n < l i st st a > : # G r up up o d e i n s tr tr u cc c c i o ne ne s a e j ec e c u ta ta r # P ue u e de d e n u sa s a r o n o a l a v ar a r ia i a bl b l e l oc o c al al
Lo que hacemos es tomar uno a uno los valores almacenados en lista, le damos el nombre de “variable local” mientras est´e en la iteraci´ iteraci ´on on y ejecutamos e jecutamos acciones. acciones . As´ As´ı: s =[ " p a l a b r a 1 ", " , " p a l a b r a 2 " ,..., " p a l a b r a n "] "] fo r p a la la b ra ra i n s : print ( p a l a b r a ) # E s te te p r og o g r am am a i m pr pr i me me d es e s d e p a la la b ra r a 1 a p a la la b ra ra n
Imprime todas las palabras de la lista s asign´andoles momentaneamente el nombre palabra mientras palabra mientras pasen por la iteraci´ on. on. Notemos que palabra palabra va tomando los valores desde “palabra1” hasta “palabran”. Esto ´ultimo es muy distinto a: s =[ " p a l a b r a 1 ", " , " p a l a b r a 2 " ,..., " p a l a b r a n "] "] fo r i in range (0 , le n (s)): print ( i ) # E s te te p r og o g r am am a i m pr pr i me me l os o s n u me m e r os os d e sd sd e 0 h a st st a n - 1 # N o ta t a m os o s q ue u e s on on n p a la l a b ra ra s
32
Ya que aqu´ aqu´ı la variable lo cal i toma los valores num´ericos ericos entre 0 y n − 1. Si quisieramos imprimir las palabras usando range en el for deber´ de ber´ıamos: ıamos: s =[ " p a l a b r a 1 ", " , " p a l a b r a 2 " ,..., " p a l a b r a n "] "] fo r i in range (0 , le n (s)): print (s[i]) # E s te te p r og o g r am am a v u el el v e a i m pr pr i mi m i r l as a s p a la la b ra ra s
6.4. 6.4.
Ordena Ordenamie mien nto
Python posee una funci´on on de ordenamiento llamada sort() que es capaz de ordenar alfab´ eticamente eticamente ( seg´ un u n la tabla ASCII) ASCII) una lista de strings y de menor a mayor un grupo de n´umeros. ¿Pero si queremos hacer otro tipo de ordenamiento?. Existen diversos algoritmos que sirven para ordenar. A continuaci´on se van a detallar dos de estos algoritmos esperando que el lector busque otros y mientras tanto descubra por si mismo como implementarlos en Python. Bubble Sort: Sort: Algoritmo de ordenamiento que se para en un t´ ermino ermino y ve el t´ ermino ermino siguiente. Si est´an an en orden incorrecto incorrecto los voltea. voltea. Es necesario necesario recorrer recorrer desde el principio principio hasta el final una lista muchas muchas veces para lograr una lista completamente ordenada. Insertion Insertion Sort: Sort: Se toma el primer elemento y se fija. Luego se escoje el menor de todos los dem´as dem´as y se ubica u ´bica antes o despu´ es es (dependiendo si es may mayor or o menor) del t´ ermino ermino original. Luego tenemos dos elementos ordenados. Ahora se vuelven a tomar los restantes, y se escoge el menor y se ordena respecto a los primeros dos (que ten´ ten´ıamos fijos y ya estaban ordenados). En general tenemos elementos ordenados y otros que faltan por ordenar. Se toma el menor de los que falta por ordenar y se ubica en su posici´on correspondiente en los elementos ya ordenados.Se hace esto hasta obtener una lista completamente ordenada.
6.5. 6.5.
Lista Listass bidim bidimen ensi sion onal ales es
Las listas bidimensiona bidimensionales les son listas de listas. Para inicializar inicializar una es posible crear una lista vac´ vac´ıa e ingresar ingresar a ella m´ as listas. Es posible hacer listas multidimensionales pero en este texto se detallaran hasta las listas bidimensionales: as s=[] a=[1,2] b=[3,4] s.append(a) s.append(b) # A h or or a s t i en en e l os o s v a lo l o r es es [ [1 [ 1 , 2 ] , [3 [3 , 4 ]] ]]
Sea listaBid listaBid una lista bidimensional. Supongamos que esta se compone de n listas. Si quiero acceder al i-´esimo esimo elemento de la l a j-´esima esima lista con 0 ≤ j < n debo hacer lo siguiente: listaBid[j][i]
Notamos que me muevo primero a la l a j-´esima esima lista, y en esta busco la i-´ esima esima variable. Esta es posible almacenarla en una variable. Notemos que es posible interpretar estos arreglos como matrices, ya que cada arreglo interior puede
33
corresponder a una fila, y si todos estos arreglos interiores tienen el mismo largo, este largo corresponde al n´umero umero de columna columna1 .
6.6. 6.6.
Valore aloress por por refe referen renci cia a
Supongamos Supongamos que tenemos tenemos el siguiente siguiente c´odigo: odigo: a = [ 1 ,2 ,2 , 3] 3] b = a
Luego si edito un valor en b, este tambi´ tamb i´ en en se edit ed itar´ ar´a en a, ya que al decir “ b = a” son ahora la misma lista. Esto sucede porque las listas son tipos por referencia, es decir, no nos importan los valores, sino que sus direcciones en memoria. Hasta ahora hab´ hab´ıamos trabajado s´olo olo con tipos por valor. Este concepto es muy amplio y se detalla en otros cursos, por ende, ahora s´olo olo debemos quedarnos con que el c´odigo odigo anterior es problem´atico. atico. Una soluci´on on es: a = [ 1 ,2 ,2 , 3] 3] b = [] fo r i i n a : b.append(i)
Esto tambi´en en pasa cuando creo una lista bidimensional a partir de la misma lista: a = [ x, x , x, x , x] x] b.append(a) b.append(a) b.append(a) # H a st st a a h or or a e l v a lo lo r d e a e s [ [ x, x , x , x ] ,[ ,[ x , x ,x ,x ] , [x [ x , x , x ]] ]]
Si edito uno de los tres arreglos interiores, se editar´an an los tres: a = [ x, x , x, x , x] x] b.append(a) b.append(a) b.append(a) b [ 0 ][ ][ 0 ] = " o " # H a st st a a h or or a e l v a lo lo r d e a e s [ [ o, o , x , x ] ,[ ,[ o , x ,x ,x ] , [o [ o , x , x ]] ]]
Para solucionar este problema: b=[] fo r i in range (0,3): a=[] fo r j in range (0,3): a . a p p e n d (" (" x " ) b.append(a)
Esto ultimo u ´ ltimo funciona ya que al inicializar en cada iteraci´on el valor de a otra vez como vac´ıo, ıo, no estoy e stoy agregando agr egando a b el mismo arreglo. 1
Es posible que el usuario los quiera leer al rev´ es, es, por lo que es instructivo instructivo mencionar mencionar que hay diversas diversas formas de interpreta interpretarr las listas bidimensionales y la que se muestra aqu´ı es s´olo olo una gu´ıa. ıa.
34
Ejemplo 5.2 Sea 5.2 Sea M una matriz de 2x2. Cree una funci´on que pida como par´ametro ametro un arreglo bidimensional que represente a M y retorne su determinante. Interpretamos la matriz bidimensional como [[a,b],[c,d]] donde el determinante es ad − bc. de f determinante(m): a 1 = ( m [ 0 ][ ] [ 0 ]) ] ) * ( m [ 1] 1 ] [ 1] 1] ) a 2 = ( m [ 0 ][ ] [ 1 ]) ] ) * ( m [ 1] 1 ] [ 0] 0] ) d et et = a 1 - a 2 return de t a = float ( input ( " I ng n g re r e se s e a : " )) b = float ( input ( " I ng n g re r e se s e b : " )) c = float ( input ( " I ng n g re r e se s e c : " )) d = float ( input ( " I ng n g re r e se s e d : " )) p r im i m e ra r a F il i l a = [ a , b] b] s e gu g u n da d a F il i l a = [ c , d] d] mi m i M a t r iz = [ pr im e ra Fi la , s e g u n d a F i l a ] print ( d e t e r m i n a n t e ( m i M a t r i z ) )
35
Cap´ıtulo 7
Clases 7.1. 7.1.
Prog Progra rama maci ci´ o on ´n orientada a objetos
La programaci´on on orientada a objetos es el paradigma de programaci´on que se basa en la interacci´on on de objetos de objetos.. Un ob jeto es una entidad dentro de un programa que posee un comportamiento caracter´ caracter´ıstico seg´ seg ´un un su clase. Cuando queremos modelar comportamientos del mundo real en un programa desearemos trabajar con objetos y no s´ olo olo con los tipos tip os implementados en Python. Desearemos tener nuestros propios tipos con funciones esp ec´ ec´ıficas para darles un cierto comportamiento deseado. Es necesario entonces poder instanciar objetos dentro de un programa de Python para modelar mejor los comportamientos de la realidad. Para esto necesitamos hacer uso de Clases. Clases. Las clases son la herramienta que la programaci´ on orientada a objetos (OOP) usa para trabajar. on
7.2. 7.2.
Crea Crear r una una clase lase
7.2. 7.2.1. 1.
Decl Declara arar r una una cla clase se
Crear una clase en Python es an´alogo alogo a crear una planilla en la que se describe el comportamiento que tendr´an an los objetos provenien provenientes tes de aquella aquella clase. clase. Para definir una clase debemos escribir lo siguiente siguiente:: class < N o m b r e d e l a c l as as e > : < A qu q u i v a e l c o nt n t e ni n i d o d e l a c l as as e i nd n d e nt nt a do do >
El contenido indentado corresponde a los atributos de la clase y las funciones funciones caracter´ caracter´ısticas ısticas de la clase, que llamaremos m´ llamaremos m´ eto dos do s, dentro de los cuales est´a el constructor el constructor,, que permite instanciar objetos de la clase creada.
7.2. 7.2.2. 2.
Atrib tribut utos os de de la cla clase se
Cada clase debe contener contener ciertas ciertas variables ariables que definen su comportamie comportamiento nto.. Por ejemplo ejemplo al crear una clase Persona clase Persona esta debe poseer una variable tipo string tipo string que que almacene su nombre, otra de tipo int que int que almacene su edad, una lista que almacene el banco y un n´umero umero de cuenta, entre varias otras variables. Estas variables pueden ser declaradas indentadas dentro de la clase. Siguiendo con el ejemplo de las personas: class Persona: r ut ut = " " e d ad ad = 0
36
d a t os os B an a n c a ri ri o s = [ ] < R e st st o d e l o s d at a t os os >
Notamos que los atributos tienen valores de base que no indican, puesto que cuando creemos una persona, estos atributos no deben tener un valor particular, por lo que debemos entregarlos cada vez que inicialicemos un nuevo objeto de cierta clase. Es necesario entonces conocer cono cer el m´ etodo etodo constructor. constructor.
7.2.3. 7.2.3.
Constr Construct uctor or
El constructor cons tructor es e s un m´etodo etodo que q ue recib e como par´ pa r´ametros ametros las variables con las que inicializaremos cada nuevo objeto. Estos par´ametros ametros se asignan a los atributos. Debe ser declarado de la siguiente forma: class < N o m b r e d e l a C l as as e > : de f _ _ i n it it _ _ ( s e lf lf , p a r a m et et r o I n gr gr e s a d o_ o_ 1 , . .. .. , p a r a m e t r oI oI n g r e s a do do _ n ) : s e l f . a t r i bu bu t o _ 1 = p a r a m e t ro ro I n g r e s ad ad o _ 1 s e l f . a t r i bu bu t o _ 2 = p a r a m e t ro ro I n g r e s ad ad o _ 2 #... s e l f . a t r i bu bu t o _ n = p a r a m e t ro ro I n g r e s ad ad o _ n < C o n t e n id id o a d i c i on on a l de l constructo r > < C o nt n t e ni n i d o d e l a c la la se se >
Es necesario notar que: Los atributos toman el valor de los parametros ingresados y no necesariamente deben tener el mismo nombre. Los par´ametros ametros no necesariamente tienen que ser asignados a atributos. Se puede trabajar dentro del constructor con ellos (como en una funci´on on normal) y asignar alg´ un otro valor a los atributos. un Los atributos de la clase que van a recibir una asignaci´on de alg´ un valor deben venir con un self. como se un mostr´ o anteriormente. Si a un atributo al que se le asigna un valor dentro del constructor no es definido en la clase, este se crear´a autom´aticamente, aticamente, por lo que los atributos asignados dentro del constructor no requieren ser declarados en la clase. clase. Si continuamos con el ejemplo de las personas: class Persona: de f _ _ i n it it _ _ ( s e lf lf , n o mb mb r e , e d a d In In g r e sa sa d a , b a nc nc o , n u m e r oC oC u e n t a ) : s e lf lf . n o m br br e = n o mb mb r e s e l f . e d ad ad = e d a d I n gr gr e s a d a l is i s ta ta = [ ] lista.append(banco) lista.append(numeroCuenta) s e l f . d a t o s Ba Ba n c a r i o s = l i s ta ta < C o nt n t e ni n i d o a d ic ic i on o n a l d e l a c la l a se se >
Es necesario destacar que un objeto de la clase persona posee como atributos (variables que lo caracterizan) a nombre , edad y datosBancarios . Los atributos definidos no requieren tener el mismo nombre de los par´ametros que recibe la funci´on. on. Se muestra en el ejemplo que el m´etodo etodo recibe un “nombre” que se asigna al atributo “nombre” atributo “nombre”.. Pero tambi´en en el m´etodo eto do recibe reci be una “edadIngresada” a pesar de que el atributo de la clase se llame “edad”. “edad”.
37
7.2.4. 7.2.4.
Instan Instancia ciar r un objeto objeto en el el progra programa ma
Para instanciar un objeto de cierta clase en el programa se hace de la siguiente manera: class miClase: < C o nt n t e ni n i d o d e l a c la la se se > # I n ic i c i o d el e l p r og o g r am am a mi m i O b j e to = m i C la s e ( p ar am et r o_ 1 , .. . , p a r a m e t r o _ n )
En donde miObjeto donde miObjeto es un objeto de la clase miClase . Es necesario destacar que el constructor recibe a self self y los par´ametros, ametros, sin embargo, para instanciar un objeto en el programa, debemos ingresar s´olo los par´ametros. ametros. Si queremos usar en el programa un atributo del objeto tenemos que escribir lo siguiente: class miClase: < C o nt n t e ni n i d o d e l a c la la se se >
# I n ic i c i o d el e l p r og o g r am am a mi m i O b j e to = m i C la s e ( p ar am et r o_ 1 , .. . , p a r a m e t r o _ n ) v a r = m i O b je je t o . a t r i b u t oX oX # A s i gn gn a mo m o s e l v a lo lo r d el e l " a t r ib ib u to t o X " a l a v a ri r i a bl bl e v ar ar #... mi m i O b j e to . a t r i b u t o X = v al or # E l a t ri r i b ut u t o X d e m i Ob O b j et et o t o ma ma u n n u ev ev o v a lo lo r
Para ejemplificar, continuaremos el ejemplo de las personas: class Persona: de f _ _ i n it it _ _ ( s e lf lf , n o mb mb r e , e d a d In In g r e sa sa d a , b a nc nc o , n u m e r oC oC u e n t a ) : s e lf lf . n o m br br e = n o mb mb r e s e l f . e d ad ad = e d a d I n gr gr e s a d a l is i s ta ta = [ ] lista.append(banco) lista.append(numeroCuenta) s e l f . d a t o s Ba Ba n c a r i o s = l i s ta ta # < C o nt n t e ni n i d o a d ic i c i on o n a l d e l a c la la se se > # I n ic i c i o d el e l p r og o g r am am a # E s ta ta l i ne ne a c r ea ea u n n u ev ev o o b je je t o t ip i p o p e rs rs o na na mi P e r s o n a = P er s o na ( " J u a n " , 3 0 , " B a nc nc o E s t ad ad o " , " 0 0 0 0 0 0 0 1 ") ") print ( m i P e r s o n a . n o m b r e ) print ( m i P e r s o n a . e d a d ) print ( m i P e r s o n a . d a t o s B a n c a r i o s )
El resultado de lo anterior es el siguiente:
38
Figura 7.1: imprimir los datos de “Juan”.
7.2. 7.2.5. 5.
Self Self
Cada m´etodo etodo definido en una clase debe recibir un primer par´ametro ametro que puede llevar cualquier nombre, pero es una buena pr´actica actica llamarlo self llamarlo self . Este par´ametro ametro nos sirve para cuando deseemos referenciar en alguno de los m´ etodos etodos definidos en la clase a los atributos que contiene el objeto, ob jeto, o al objeto mismo. En el constructor, cuando quer´ quer´ıamos asignar valores al atributo del objeto deb´ deb´ıamos utilizar el self. Si no hubiesemos usado el self, el programa crear´ crear´ıa una variable que no quedar´ıa ıa almacenada en el ob jeto. En el ejemplo anterior, la variable lista no no queda almacenada en el objeto persona, pero si se almacenar´a el atributo atributo datosBancarios .
7.2.6.
M´ etodos etod os
Los m´ etodos etodos son funciones funciones que se definen definen indentada indentadass en la declaraci´ declaraci´ on de la clase como las que ya conocemos, on pero la diferencia es que cuando queramos llamarlas en el programa, necesitamos de un objeto de su clase para ser utilizadas. Su definici´ on es de la siguiente manera: on class < N o m b r e d e l a C l as as e > : de f _ _ i n it it _ _ ( s e lf lf , p a r a m et et r o I n gr gr e s a d o_ o_ 1 , . .. .. , p a r a m e t r oI oI n g r e s a do do _ n ) : s e l f . a t r i bu bu t o _ 1 = p a r a m e t ro ro I n g r e s ad ad o _ 1 s e l f . a t r i bu bu t o _ 2 = p a r a m e t ro ro I n g r e s ad ad o _ 2 #... s e l f . a t r i bu bu t o _ n = p a r a m e t ro ro I n g r e s ad ad o _ n < C o n t e n id id o a d i c i on on a l de l constructo r > de f metodo_1(self , parametro_1 ,...,parametro_n ): de f metodo_2(self , parametro_1 ,...,parametro_n ): #...
Cuando Cuando se haga un llamado a un m´etodo etodo se debe haber antes antes instanciado instanciado un objeto ob jeto de aquella aquella clase. Luego hay que escribir escribir objeto obje to.m´ .m´etodo( et odo(par´ par´ ametros) como se muestra a continuaci´on: on:
39
class miClase: < C o nt n t e ni n i d o d e l a c la la se se > de f metodo_1(self , parametro_1 ,...,parametro_n ):
#... mi m i O b j e to = m i C la s e ( p ar am et r o_ 1 , .. . , p a r a m e t r o _ n ) mi m i o b j e to . m e t o do _ 1 ( p a r a m e t r o I n g r e s a d o _ 1 , .. . , p a r a m e t r o I n g r e s a d o _ 2 )
Continuaremos Continuaremos con el ejemplo de las personas. Definirimos un m´ etodo etodo que representa el cumplea˜nos de la persona, otro que cambie los datos bancarios, y por ´ultimo, ultimo, un m´ etodo etodo que imprime todos los datos en la consola: class Persona: de f _ _ i n it it _ _ ( s e lf lf , n o mb mb r e , e d a d In In g r e sa sa d a , b a nc nc o , n u m e r oC oC u e n t a ) : s e lf lf . n o m br br e = n o mb mb r e s e l f . e d ad ad = e d a d I n gr gr e s a d a l is i s ta ta = [ ] lista.append(banco) lista.append(numeroCuenta) s e l f . d a t o s Ba Ba n c a r i o s = l i s ta ta de f cumpleFeliz(self): # N o ta t a m os os q ue u e e st s t e m e to to d o n o r e ci ci b e p a ra r a m et et r o s el e l f . ed ed ad ad = s el el f . ed ed ad ad + 1 de f cambioDeBanco( self,bancoNuevo ,cuentaNueva ): s e l f . d a t o s Ba Ba n c a r i o s [ 0 ] = b a n c o Nu Nu e v o s e l f . d a t o s Ba Ba n c a r i o s [ 1 ] = c u e n t aN aN u e v a de f imprimirDatos(self): print ( " N o mb mb r e : " + s e l f . n o m b r e ) print ( " E da da d : " + st r (self.edad)) print ( " B a nc nc o : " + s e l f . d a t o s B a n c a r i o s [ 0 ] ) print ( " C u en en t a : " + s e l f . d a t o s B a n c a r i o s [ 1 ] ) mi P e r s o n a = P er s o na ( " J u a n " ,30, " B a n c o E s t a d o " , " 0 0 0 0 0 0 0 1 ") ") mi P e r s o n a . i m p r i m i r D a t o s () mi P e r s o n a . c u m p l e F e l i z () mi P e r s o n a . c a m b i o D e B a n c o ( " B a n c o S a n t a nd nd e r " , " 0 0 0 0 0 0 0 2 ") ") mi P e r s o n a . i m p r i m i r D a t o s ()
El resultado de lo anterior se puede apreciar en la figura 6.2. El contenido de clases es m´as extenso, por lo que es recomendado para el lector ahondar en esta materia. Ejercicio Ejercicio Propuesto Propuesto 6.1 Recientemente 6.1 Recientemente fueron lanzados al mercado nuevos videojuegos de la saga Pokemon. Como usted no quiere ser menos, se ha propuesto comenzar a programar su propio Pokemon. Para esto debe comenzar Pokemon. La primera debe contener como atributos la vida m´axima modelando las clases Pokemon y Ataque Pokemon. del Pokemon, su vida actual, su tipo y una lista de ataques (que contendr´a objetos de clase Ataque Pokemon). La clase Ataque Pokemon debe contener el tipo del ataque y el da˜no que realiza. Luego debe ser capaz de programar
40
Figura 7.2: utilizaci´ on on de m´etodos eto dos.. una batalla Pokemon1 . Todo lo dem´as as queda a criterio del programador. Se propone hacer el juego lo m´as fluido posible.
1
Se recomienda recomienda fuertemen fuertemente te que la batalla sea modelada con la materia de clases, ya sea como m´ etodo etodo o una clase propia. Si no se conoce el juego puede buscar en la web algunas referencias.
41
Cap´ıtulo 8
Archivos 8.1.
¿Por qu´ qu´ e guardar datos? datos?
Hasta ahora todo lo que hemos programado no es persistente en el tiempo. Es decir, una vez cerrado el programa, toda interacci´on on con el usuario no tendr´a efecto en las posteriores ejecuciones. Pero ¿Qu´e pasa si queremos guardar permanentemente los datos entregados por nuestro programa?. Para esto se hace necesario hacer uso de manejo de archivo archivos. s. En este texto nos enfocaremo enfocaremoss a leer archivos archivos de texto plano (archivos (archivos con extensi´ extensi´on on .txt).
8.2. 8.2.
Ruta Ruta de un arc archiv hivo
La ruta (o path) de un archivo es su ubicaci´on on en el computador. Esta puede ser una ruta relativa o absoluta. Una ruta absoluta indica una ruta independiente de la ubicaci´on del .py que estamos ejecutando, mientras que una ruta relativa depende de la ubicaci´on on del .py que ejecutamos. Para el manejo de rutas se hace necesario importar el m´ odulo os. Si el lector desea ahondar en este tema, puede buscar informaci´on acerca de esto en internet. Nosotros odulo s´ olo olo trabajaremos trabajaremos con archivo archivoss que se encuentr encuentren en en la misma carpeta que nuestro nuestro .py mediante mediante rutas relativas. relativas.
8.3. 8.3.
Leer Leer un un arc archiv hivo de tex texto to
Para leer un archivo de texto necesitamos hacer uso de la funci´on open on open en en modo lectura. Esta funci´on on open recibe como par´ametros ametros el path del archivo (ruta en donde se encuentra ubicado) y el modo (lectura o escritura). Esta funci´ on retorna un objeto tipo file que on file que debemos almacenar en una variable. Para abrir un archivo en modo lectura debemos escribir lo siguiente: mi A r c h i v o = o pe n ( < N o mb r e de l archivo >, " r " )
En donde Nombre donde Nombre del archivo es archivo es el nombre del archivo que queremos cargar que se encuentra en la misma carpeta que nuestro programa. Este debe incluir la extensi´on on .txt Ahora bien para leer el objeto tipo file que file que cargamos podemos usar la funci´on readline on readline o readlines readline: readline: Esta funci´on on siempre lee la primera l´ınea ınea del archivo ya cargado (Identifica una l´ınea segun los saltos de l´ınea) y la retorna como string(generalmente string(generalmente con el fin de almacenarlo en una variable). Esta l´ınea ınea se elimina del archivo cargado (No del archivo original) con el fin de seguir us´andola para cargar el archivo. readlines: readlines: Esta funci´on on lee todas l´ıneas, ıneas, las retorna como una lista de strings (generalmente para almacenarlas en otra variable) y las borra del archivo cargado. Los string retornados en la lista si tienen los salto de l´ınea. ınea. Para Para extraerlos extraerlos es posible cortarlos cortarlos como ya lo vimos en el cap´ cap´ıtulo de strings. strings. Es recomendad recomendadoo usar esta
42
funci´ on ya que deja todo almacenado en una sola lista, y es m´as sencillo trabajar sobre listas que sobre on objetos tipo file tipo file . Ejemplo 7.1 Dado 7.1 Dado el siguiente archivo de extensi´on on .txt llamado llamado archivo1.txt : archivo1.txt : Hola, so y un archivo.
Imprima Imprima en el shell de Python Python el contenid contenidoo del archivo archivo como un solo string sin saltos de l´ınea. Cabe destacar destacar que el archivo tiene un espacio al final de las tres primeras l´ l´ıneas, por lo que no hay que agregarlo. Seg´ un lo descrito anteriormennte, una soluci´on un on es la que se presenta a continuaci´on. on. El resultado del shell se puede ver en la figura 7.1: mi A r c h i v o = o pe n ( " a r c h i v o 1 . t x t ", ", " r " ) s="" l i n e a s De De l A r c h i vo vo = m i A r c hi hi v o . r e a d l i n es es ( ) print ( l i n e a s D e l A r c h i v o ) # E st s t o s ir i r ve v e p ar a r a v er er q ue ue v al a l or o r t om o m a l a v ar a r ia i a bl bl e fo r c a s i ll ll e r o i n l i n e a s D el el A r c h i v o : s = s + c as a s il i l le l e ro r o [ 0: 0 : le n ( c a s i l l e r o ) - 1 ] print ( s ) # El E l s al a l to to d e l in i n ea e a \ n e s u n c ar a r ac a c te te r
Figura 8.1: lectura de archivos.
8.4. 8.4.
Escri Escribi bir r un un arc archi hiv vo .txt .txt
8.4. 8.4.1. 1.
Modo Modo writ write e
Para escribir un archivo .txt en modo write debemos crear un objeto tipo file con la funci´on open con el par´ametro ametro de modo como “w”: mi A r c h i v o = o pe n ( < N o mb r e de l archivo >, " w " )
Si el archivo no existe, Python lo crear´a. a. Si el archivo ya existe se borrar´ a y se comenzar´ comenzar´ a a escribir escribir uno nuevo. nuevo. Ahora para comenzar la escritura debemos usar la funci´on write. En el siguiente ejemplo: mi A r c h i v o = o pe n ( " a r c h i v o . t x t ", "," w" ) mi A r c h i v o . w ri te ( s t ri ng )
43
Estamos escribiendo un archivo desde el principio que se ubica en la misma carpeta de nuestro programa y se llama archivo.txt . Estamos escribiendo el string que ingresamos como par´ametro a la funci´on write on write . Si queremos saltar de l´ınea debemos usar el caracter de salto de l´ınea. Cada vez que terminemos de escribir el archivo debemos usar la funci´on close() on close() para cerrar el objeto tipo file que instanciamos. mi A r c h i v o = o pe n ( " a r c h i v o . t x t ", "," w" ) mi A r c h i v o . w ri te ( s t ri ng ) mi A r c h i v o . c lo se ()
Ejemplo 7.2 Escriba 7.2 Escriba el archivo del ejemplo 7.1: Hola, so y un archivo.
Usando lo la funci´on on write. Recuerde que el archivo se llama “archivo1.txt” y debe estar contenido en la misma carpeta que nuestro programa. Una soluci´ solucion o´n propuesta es la siguiente: mi A r c h i v o = o pe n ( " a r c h i v o 8 0 0 0 . t x t ", ", " a " ) mi A r c h i v o . w ri te ( " H ol ol a , \ n ") ") mi A r c h i v o . w ri te ( " s oy o y \ n ") ") mi A r c h i v o . w ri te ( " un u n \ n ") ") mi A r c h i v o . w ri te ( " a r c h i v o . ") ") mi A r c h i v o . c lo se ()
8.4. 8.4.2. 2.
Modo Modo appen append d
Funciona de la misma manera que el modo write, pero la diferencia es que si el archivo ya existe no lo crea otra vez, y comienza a escribir sobre ´el. Para esto se debe usar la funci´on open on open con con el par´ametro ametro de modo como “a”: mi A r c h i v o = o pe n ( " a r c h i v o . t x t ", "," a" ) mi A r c h i v o . w ri te ( s t ri ng ) mi A r c h i v o . c lo se ()
44
Cap´ıtulo 9
Recursi´ on on 9.1. 9.1.
Defin Definir ir una una func funci´ i´ on on recursiva
En ciencias de la computaci´on, on, la recursi´on on es un m´ etodo etodo de resoluci´on on de problemas basado en la capacidad de una funci´on on de llamarse a si misma en su definici´on, con el objetivo de divir un problema grande, en problemas peque˜ nos. nos. Para su finalizaci´ finalizaci´ on on es necesario necesario establecer establecer una condici´ on on de t´ermino ermino de la recursi´ recursi ´on. on. En t´erminos erminos generales general es una un a recursi´ re cursi´on on se escribe como: de f factorial(n): if var_booleana: # C a s o b a se se else : # L l a m a d a r e c u r si si v a
Ejemplo 8.1 La 8.1 La funci´on on factorial de n ( n!) se defina para los naturales como 1 si n = 0 y n(n − 1)! en otro caso. Defina la funci´on on recursiva en Python que calcule el factorial de un n´umero: Usamos la llamada recursiva si n no es 0: de f factorial(n): if n = = 0 : return 1 else : return n * f a ct c t o ri ri a l ( n - 1 )
9.2.
Ejemplos Ejemplos de funcione funcioness recur recursiv sivas as
9.2. 9.2.1. 1.
Quic Quicks ksor ortt
Quicksort es un ordenamiento recursivo que divide una lista en sublistas y se ordenan de la siguiente forma: Elegir un elemento de la lista que se denominar´a pivote. Dejar todos los elementos menores que ´el el a un lado, y todos los mayores que el pivote al otro. Obtenemos dos sublistas. Una de todos los elementos de la izquierda, y otra de todos los elementos de la derecha. 45
Repetir recursivamente el proceso para cada sublista mientras tenga m´as de un elemento. Una forma propuesta propuesta de implemen implementar tar este algoritmo algoritmo en Python Python es la siguiente siguiente:: de f sort(lista): men m en o r es = [] i gu g u al a l es es = [ ] may m ay o r es = [] if le n ( l is i s ta ta ) > 1 : p i vo vo t = l i st st a [ 0] 0] fo r x i n l is i s ta ta : if x < p iv iv ot ot : me m e n or e s . a p pe nd ( x ) if x = = p iv i v ot ot : iguales.append(x) if x > p iv iv ot ot : ma m a y or e s . a p pe nd ( x ) return s o r t ( m e n or or e s ) + s o r t ( i g u a le le s ) + s o r t ( m a y o r es es ) # El E l o pe p e ra r a do d o r + u ne ne l as as t re r e s l is i s ta t a s . O cu c u pa p a mo m o s l a m is i s ma m a f un u n ci c i on o n e n c ad ad a s ub u b li l i st st a else : return lista
Notamos que sort que sort es es una funci´on on que recibe como par´ametro ametro una lista. En el inicio se generan tres listas auxiliares que almacenar´an an los menores, los mayores y los iguales al pivote, que siempre ser´a el primer elemento de cada una de las sublistas. Luego de llenar estas tres listas auxiliares auxiliares con los elementos elementos correspondie correspondiente ntes, s, debemos debemos volver volver a llamar a la funci´on on sort en cada una de ellas. En el ejemplo anterior, debemos notar que lista es el par´ametro par´ametro ingresado, por p or lo l o que la l´ınea ınea que dice “return dice “return lista”, lista”, esta retornando los valores de las sublistas menores, iguales o mayores, cuando posean s´olo olo un elemento. Es una buena idea mirar alg´un un video que muestre este ordenamiento de manera gr´afica afica para que quede m´as as claro.
46