Ciencias e Ingenieria para Estudiantes D
Ciencias e Ingenieria para Estudiantes D
Ciencias e Ingenieria para Estudiantes D
para estudiantes de
Python
Miguel Ángel Suárez
Copyright © 2014 Miguel Ángel Suárez
ISBN: 978-980-12-9190-9
Primera Impresión, Septiembre 2014
Este libro se editó en LATEXmodificando una plantilla originalmente propuesta por
Mathias Legrand (legrand.mathias@gmail.com). License: CC BY-NC-SA 3.0 (http://
creativecommons.org/licenses/by-nc-sa), la cual se puede descargar libremente
de http://www.LaTeXTemplates.com.
Índice general
Prefacio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1 ¿Qué versión de la historia prefieres? 7
1.2 Interpretando Python 8
1.3 Lo primero es aprender a ser iteractivo 8
2 Primeros Tropiezos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1 Utilice su nueva calculadora 11
2.2 1 + 1 es igual a 10 13
2.3 Manteniéndose a flote 15
2.4 A Python le sale todo redondo 18
2.5 Aritmética del punto 20
2.6 Python no es tan complejo 21
2.7 Variables 22
2.7.1 En Python no hay tipos malos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.8 Incompletándolo todo 25
2.9 Ejemplos y (un) ejercicio. 25
A Palabras reservadas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Bibliography . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Articles 101
Books 101
Electronic 102
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Prefacio
de alta calidad, pero en los últimos años el C/C++ ha estado peleando duramente por la
supremacía y por supuesto el nuevo en el campo de batalla, Python.
Por lo tanto, ¿Cuál paquete de software debe aprender el estudiante de ciencias o
ingeniería? ¿Qué debe enseñarse? ¿Cálculo numérico? ¿Física computacional? ¿Herra-
mientas para el procesamiento da datos? ¿Álgebra simbólica?
Este pequeño tutorial de Python pretende responder en parte a estas preguntas
al menos en lo referente a la temática y al software que deben utilizarse a un nivel
introductorio en una facultad de ciencias o ingeniería.
En lo concerniente al software, pienso que en primer lugar la universidad debe de
mantenerse alejada de las patentes y del software privativo lo mas que se pueda, ya
que pagar licencias es muy oneroso para el escaso presupuesto que se maneja. En la
práctica las computadoras de los laboratorios, las de las oficinas de los profesores y las
de las secretarias, están repletas de software "pirateado", creo firmemente que esto es
inaceptable, sobretodo cuando existen a la disposición alternativas de software libre de
altísima calidad. Esta consideración reduce enormemente el abanico de posibilidades en
lo que a escogencia de software se refiere.
Otra característica importante es que el software utilizado en la enseñanza debe ser
amigable y de fácil aprendizaje. Si lograr el dominio de la herramienta computacional
es un reto en si mismo deja de ser una herramienta práctica, al menos a un nivel
introductorio. Esto saca de las opciones a lenguajes como C/C++ o Java.
El lenguaje de programación Python cumple con estas características, pero adicio-
nalmente es un lenguaje poderoso y altamente flexible. Con el se pueden hacer pequeños
guiones (script) para automatizar tareas, manipular datos, etc., permite emular a paquetes
como Matlab, con una capacidad gráfica notable. Adicionalmente con la importación de
las librerías adecuadas permite realizar cálculo numérico avanzado, controlar hardware
e incluso aplicar álgebra simbólica.
La presente guía esta orientada a los estudiantes de los primeros semestres de la
licenciatura de las carreras de ciencias o ingeniería, aunque alumnos de semestres
superiores que quieran aprender Python también podrán sacarle provecho. Se ha tratado
en todo momento que sea de ágil lectura, con ejemplos relevantes en el área de la física
o matemáticas.
son un problema a la hora de ejecutar el código, pero para programar hay que tener
claro cual versión se está utilizando. Esta incompoatibilidad entre las versiones de
Python es un inconveniente, pero es necesario si se quiere tener un lenguaje ágil y
moderno. Efectivamente la computación es una ciencia en evolución constante, nuevos
paradigmas surgen, las técnicas se mejoran, los estilos cambian, etc. Adicionalmente
existen actualmente programas creados para “traducir” de la rama 2 a la 3, además de
extensa información al respecto[Pyt]. Este libro no requiere ningún conocimiento previo
de Python, y como se utilizará en todo momento la versión 3.3, no hará falta ninguna
clase de referencia a versiones más antiguas.
Figura 1.1: Una típica ventana con un terminal en linux. En la linea de comandos se ha
invocado a Python versión 3.3
Una vez creada la ventana del terminal se observa en ella una cosa llamada prompt y
que significa que el terminal está listo para recibir ordenes. En el caso que se muestra en
la figura 1.1 es:
msuarez@linux-rf6d:~>
mientras que en windows el prompt es el (antiguamente) famoso “C:\ >”. La orden que
hemos dado es ejecutar python, y para ello se ha escrito simplemente python3.3 (donde
el número 3.3 indica la versión que se está utilizando). Luego de apretar la tecla intro
python responde con tres líneas. En la primera se confirma la versión de Python, la fecha
de lanzamiento y el compilador que se ha utilizado para compilar al propio Python, en
este caso se está usando linux y el compilador es GCC.
La segunda línea nos sugiere que escribamos una serie de comandos que se explican
por si mismos, y me ahorran el trabajo de hacerlo a mi. En particular el comando “help()”
puede ser de mucha utilidad mas adelante, cuando no se entienda nada de lo que estoy
explicando. Finalmente la última línea “>>>” es una invitación a escribir algo. ¡Pero
no lo haga! ¡No sea atrevido! ¡No sea curioso! ¡No haga nada por usted mismo! Espere
a que yo le explique todo, y si no me entiende, pues entonces si escriba help().
Cuando haya tenido suficiente y quiera olvidarse de todo, entonces puede escribir
quit() o exit() o apretar simultáneamente las teclas Ctrl y d.
2 — Primeros Tropiezos
>>>2+2
¿Todo bien? Ahora apretaremos la tecla “enter” (o “intro” según su teclado y prefe-
rencia) y el extraordinario y poderoso compilador de Python nos da como por arte de
magia la respuesta.
>>>2+2
4
>>>
12 Primeros Tropiezos
Fantástico! ¿Verdad que valió la pena? Es extraordinario lo que se puede hacer con
la tecnología hoy en día! De hecho Python le ahorra una cantidad enorme de dinero
evitándole comprar una calculadora ya que no solo sabe sumar 2+2, vea por ejemplo el
siguiente ejemplo.
>>> ((2*(3528)/24)+8931)-9221
4.0
>>>
>>> 2*3528/24+8931-9221
4.0
>>>
>>> 5+25/2
17.5
>>>
en cambio
>>> (5+25)/2
15.0
>>>
>>> 5**2
25
>>> 2**5
32
1Apesar de que este libro está escrito en castellano, para representar los números se utilizará la
notación inglesa, es decir 4.0 y no 4,0 como debería de ser. Esto es para tener compatibilidad con el
interprete de Python
2.2 1 + 1 es igual a 10 13
>>> 16**0.5
4.0
>>> 16**1/2
8.0
>>> 2**3**2
512
>>> (2**3)**2
64
>>>
notemos que en la potenciación el resultado sólo es entero si tanto la base como el
exponente son enteros y el resultado correcto también lo es. Para la división entera
tenemos //
>>> 14//2
7
>>> 15//2
7
>>>
y finalmente % que no se usa para sacar porcentaje, se usa para hallar el resto de la
división entera. ¿Se acuerdan de la escuela?
26 3
−24 8
2
bueno entonces
>>> 26%3
2
>>>
este tipo de operación es muy útil y ya tendremos oportunidad de utilizarla más adelante.
En definitiva el orden de precedencia en que se realizan las operaciones (si no se utilizan
paréntesis) viene dado por la siguiente lista de prioridad siendo el primer operador el de
mayor prioridad y el último el de menor prioridad:
** (exponenciación)
*, /, //, % (multiplicación, división, división entera y resto)
+, - (suma y resta)
cuando las operaciones tienen el mismo orden de precedencia se ejecutan de izquierda a
derecha.
2.2 1 + 1 es igual a 10
Tal vez usted haya escuchado alguna vez decir que las computadoras solo entienden
una clase especial de números llamados binarios. Pues es verdad, no le han dicho ninguna
mentira. Los números binarios están formados por dos tipos de dígitos o símbolos “0” y
“1”. Es fácil formar cualquier número entero con solo dos símbolos, por ejemplo:
14 Primeros Tropiezos
0000 ---> 0
0001 ---> 1
0010 ---> 2
0011 ---> 3
0100 ---> 4
0101 ---> 5
0110 ---> 6
0111 ---> 7
1000 ---> 8
1001 ---> 9
... y así sucesivamente. ¿Por que esta sucesión en particular? se preguntarán algunos.
Los que no se lo pregunten, pueden saltarse la siguiente tediosa explicación:
Para los números que usamos corrientemente en la actualidad, tenemos sólo diez
símbolos distintos (del 0 al 9), si queremos representar un número mayor que 9 tendre-
mos que repetir algunos símbolos. La solución es darle diferente valor a los símbolos
dependiendo del lugar que ocupen. Por lo tanto para escribir 9 + 1 colocamos (repetimos
el dígito) 0 en el lugar de las unidades y colocamos (repetimos) un 1 en el lugar de las
decenas, es decir: 10. De esta manera podemos crear nuestra lista de números “decimales”
o en base 10 de la siguiente manera.
0000
0001
0002
0003
.
.
.
0008
0009
0010
0011
0012
0013
.
.
.
0019
0020
.
.
.
0099
0100
0101
.
2.3 Manteniéndose a flote 15
.
.
Con los números binarios procedemos de igual forma, pero claro solo tenemos dos
símbolos diferentes. Si a 0 le sumamos 1 no hay problema 0 + 1 = 1, pero para lograr
1 + 1 tenemos que repetir símbolos y haciendo uso de la posición, colocamos cero y nos
“llevamos” 1, entonces 01 + 01 = 10. Claro los humanos no suelen poner los ceros a la
izquierda, pero las computadoras no son tan inteligentes, ellas guardan los números en
un espacio en la memoria y cada bit cuenta.
Aún quedan por ahí maquinas con 32 bits (además de los teléfonos celulares y
tablets) eso significa que en esas computadoras disponemos de una combinación de 32
“ceros” y “unos” para representar un número cualquiera. A esta combinación se le llama
palabra (que muy frecuentemente se usa sin traducir, “word”). Por ejemplo el cinco es:
00000000000000000000000000000101
01111111111111111111111111111111
Python 3 viene con una interesante y nueva3 característica para los números enteros, si
queremos representar un número aún mayor al anterior, no hay problema, el interprete
de Python utilizará dos palabras, luego tres, cuatro, y de esta manera se puede llegar
hasta números enteros verdaderamente astronómicos. Claro que de ninguna manera la
computadora puede manejar números arbitrariamente grandes, al final existe un límite
dado por la memoria RAM de la máquina.
1. xxxx × 2xxxx
donde las x representan tanto 0 como 1. Observemos que la mantisa siempre empieza
por 1 entonces, esta información resulta redundante y sólo se toma la parte decimal.
Como no podría ser de otra manera, esta forma tan ingeniosa de representar un número
real en la computadora tiene nombre, se llama estándar IEEE 7544 .
En resumen si escribimos 9584.35 o 0.00489 o incluso .358 gracias al “.” Python
sabe que debe aplicar el estándar IEEE 754, como esto implica una notación normalizada
se debe correr el punto para que a la izquierda de él, aparezca un dígito diferente de
cero. De ahí el nombre de punto flotante que es como se conoce a la implementación
de los reales en la computadora. Ahora realizar cualquier operación con números punto
flotante es fácil pues el punto “flota” hasta el lugar correcto para que el número quede
normalizado y el punto deje de ser un problema.
También podemos usar la notación científica directamente cuando queremos escribir
números muy grandes o pequeños. Escribimos la mantisa y después el exponente
aclarando cuál es el exponente con una letra “e” de exponente.
>>> 91.1e-32
9.11e-31
>>>
>>> (5+52.3)*4
229.2
>>> 45/7
6.428571428571429
>>>
Esto implica que uno generalmente termina trabajando con punto flotante, ya que en el
paso de un punto flotante a un entero se puede perder precisión, como se muestra en el
siguiente ejemplo:
>>> 93.678954e3
93678.954
>>> int(93.678954e3)
93678
>>>
en el cual se ve como se pierden los decimales haciendo uso de una conversión explicita
en int(93.678954e3)5 y el resultado será 123.0 como cabría esperar.
Lamentablemente el punto flotante tiene una limitación que no la tenían los enteros,
no podemos trabajar con números arbitrariamente grandes o arbitrariamente pequeños.
Esta limitación no la da la memoria de la máquina, es una consecuencia de la implemen-
tación del estándar IEEE 754. Así el número mas grande que podemos representar es
el:
>>> 1.7976931348623157e+308
1.7976931348623157e+308
>>>
>>> 1.8e308
inf
>>>
para los distraídos, la palabra inf es en realidad una abreviatura de la palabra infinity y
que funciona notablemente bien en castellano. También ocurre algo parecido cuando el
número es muy pequeño:
>>> 4.9406564584124654e-324
5e-324
>>>
>>> 2e-324
0.0
>>>
Es decir que si tenemos un número menor o igual que 2 × 10−324 se toma como cero. Si
inadvertidamente sobrepasamos este límite inferior cometemos un underflow error cuya
traducción sería algo así como error de “desbordamiento por debajo”.
>>> 5/3
1.6666666666666667
>>>
>>> (5/3)-(5*(1/3))
2.220446049250313e-16
>>>
2.4 A Python le sale todo redondo 19
debería ser cero, pero aunque arroja un valor muy pequeño está lejos de ser cero (es
mucho mas grande que el valor numérico de la masa del electrón). Un número racional
puede tener infinitas cifras decimales dependiendo de su base. En base decimal un
décimo es un número muy bonito y manejable, se escribe así: 0.1, Pero en binarios se
vuelve horrendo con infinitas cifras decimales y este efecto es acumulativo.
Véase el error cometido por solo sumar tres veces 0.1. Parece poco pero si se suman
458 veces o mil, el error es apreciable y esta situación
√ es bastante frecuente. Además
hay números tan locos e irracionales como π, e, 2, etc, que siempre tendrán infinitas
cifras decimales en cualquiera de las dos bases.
Por lo tanto es frecuente cuando se trabaja con números punto flotante que la máquina
realice automática y silenciosamente algún tipo de redondeo. La manera que tiene Python
de redondear puede parecer confusa en un principio. Nosotros estamos acostumbrados a
la forma de redondeo que aprendimos en la escuela y que aparece en todo libro de física
básica [HRW08]. Por ejemplo, el número 2.3 se redondea a 2.0, el 2.7 se redondea a 3.0
y el número 2.5 también se redondea “hacia arriba” a 3.0, como todos sabemos. Bueno
esto último tiene un pequeño problema. La razón es que el “0” no se redondea, por lo
tanto de los diez dígitos decimales solo tenemos que redondear 9. Esto conduce a una
asimetría que se aprecia bien en el siguiente esquema:
1
2
redondeo hacia abajo
3
4
5 −→ ¿?
6
7
redondeo hacia arriba
8
9
La manera clásica (la de la escuela) funciona muy bien cuando tenemos que redon-
dear unos pocos números, pero si son cientos, miles, o millones de números redondeados,
y se hacen operaciones entre ellos, se termina con un número mayor del que se debería.
Otra forma mala de redondear es hacia abajo (2.5 → 2.0) en este caso se termina con
un numero menor. Adicionalmente debemos contar la influencia en el redondeo de los
números negativos, lo cuál empeora la cosa. Por lo tanto es necesario escoger una forma
de redondeo mas adecuada. El estándar IEEE 754 define al menos 5 tipos diferentes
de redondeo. Python implementa el redondeo que el IEEE 754 trae por defecto. Este
se llama redondeo mitad al par también conocido como el redondeo del banquero ya
que es muy utilizado en el mundo financiero (claro allí cada céntimo cuenta). Se realiza
20 Primeros Tropiezos
igual que antes, pero si el numero a redondear es 5, se redondea la cifra hacia arriba solo
si el resultado final es par, sino se redondea hacia abajo. Un ejemplo puede aclararle la
situación. Supongamos que queremos redondear 27.45 a un número con una sola cifra
decimal, entonces el resultado es 27.4. Si en cambio el número fuese 27.75 el resultado
sería 27.8. Otros dos ejemplos; 27.35 pasa a 27.4 y 27.25 pasa a 27.2.
El error de redondeo no es un error que cometa la máquina, es mas bien una
característica derivada del hecho de no poder manejar infinitos con la computadora.
Es responsabilidad del programador tener esta característica en cuenta. Si el programa
se vuelve inestable o los resultados obtenidos no tienen sentido a causa del “error de
redondeo”, el error es del programador.
>>> a = 2
>>> b = 0.001
>>> c = 5
>>> (a+b)+c
7.0009999999999994
>>> a+(b+c)
7.001
>>>
Es una diferencia pequeña, pero es una diferencia y si tenemos que hacer miles de estas
operaciones al final podemos terminar con un resultado que no es el correcto. Lo mismo
ocurre con la asociativa para la multiplicación (averigüelo usted mismo).
Como sabemos (yo me enteré hace poco) el conjunto de los números reales es denso,
es decir entre dos números reales cualesquiera siempre podemos encontrar otro número
real (de hecho podemos encontrar infinitos números). Con los punto flotante no ocurre
lo mismo como debe quedar claro si ha leído las secciones anteriores. Esto nos lleva
a otra de las propiedades que tampoco se cumplen a cabalidad con los números punto
flotante, es la existencia del neutro en la adición. Si existe, lo que sucede es que no es
único. En los reales existe solo un número x tal que a + x = a ese número es el cero.
Pero con punto flotante la cosa cambia un poco.
>>> a = 5.0
>>> b = 2.0e-16
>>> a+b
5.0
>>>
2.6 Python no es tan complejo 21
lo que significa que hay una enorme cantidad de números (en este ejemplo cualquier
número menor que 2.0e-16) que cumplen con la condición a+x = a y por lo tanto x no es
único. Este aspecto es tan importante para la gente que estudia análisis numérico que le
han puesto un nombre, según Wikipedia ...se llama épsilon de la máquina (ε − mach) al
menor valor de una determinada máquina que cumple lo siguiente: 1.0+ε −mach > 1.0
El épsilon es el número decimal más pequeño que, sumado a 1, la computadora nos
arroja un valor diferente de 1, es decir, que no es redondeado. Para los curiosos el valor
de este número en una máquina de 64 bits es 2.2204460492503131e-16.
Por lo anterior la siguiente propiedad matemática: Sean cuatro números cualesquiera
a, b, c, y d. Si a > b y c > d entonces a + c > b + d
no siempre se cumple.
>>> a = 2
>>> a = 2 + 3e-20
>>> b = 2
>>> c = 1
>>> d = 1 - 3e-20
>>> a + c
3.0
>>> b + d
3.0
>>>
en este caso a + c = b + d lo cual es incorrecto. Otra cosa interesante es que a veces
multiplicar es mejor que sumar
>>> x = 1/7
>>> x+x+x+x+x+x+x
0.9999999999999998
>>> 7*x
1.0
>>>
^
SyntaxError: invalid syntax
>>>
¿Que tiene de especial la j? Se preguntará el lector. Lo mismo se pregunta el autor, ya
que la letra preferida para escribir números complejos es la “i”. Tal vez sea porque la i
se parece mucho a 1, y la intención fue evitar posibles confusiones. En todo caso Python
entiende números complejos, solo que en vez de escribir (40 + i 23) debemos escribir (40
+ 23j). Observe que la parte imaginaria se escribe 23j y no j23. Si queremos representar
al número imaginario puro “i”, simplemente escribimos 1j. Esto significa que en Python
se puede hacer todo tipo de operaciones y por lo tanto usted puede resolver problemas (o
crearlos) con números complejos. Observemos por ejemplo las siguientes operaciones:
>>> (1j)**2
(-1+0j)
>>>
>>> (2+3j)**(-1)
(0.15384615384615385-0.23076923076923078j)
>>>
>>> (1+2j)/(3-4j)
(-0.2+0.4j)
>>>
Esto es suficiente sobre complejos por ahora, más adelante tendremos mas oportuni-
dades de complicarnos la vida.
2.7 Variables
Hasta ahora hemos visto algunas cositas sobre como manejar números con Python,
pero para sacar provecho a lo aprendido en vez de números, debemos utilizar variables
que representan a esos números. Afortunadamente no es necesario una declaración del
tipo de número, ya que Python reconoce automáticamente si el número es entero, punto
flotante, o complejo, a esto se le llama tipos dinámicos.
>>> a = 5
>>> b = 20
>>> a+b
25
>>> c = a-b
>>> c
-15
>>> a = -321
>>> a
-321
>>> a+b
-301
>>> z = 2-3j
>>> z
2.7 Variables 23
(2-3j)
>>>
Observese que c = a − b no es una ecuación, y “=” no significa “es igual a”. Lo que
hace el signo “=” en a = 5 es reservar memoria en la computadora para una variable
llamada “a” y “conectarla” con otro espacio de memoria en la que se encuentra guardado
el valor6 5. Si mas adelante realizamos a = −321 estamos conectando la variable a
con un nuevo espacio de memoria que tiene guardado el número -321. Por ejemplo
el siguiente ejemplo es incorrecto desde el punto de vista matemático pero totalmente
valido en programación y en particular en Python.
>>> n = 7
>>> n
7
>>> n = n+3
>>> n
10
>>>
lo que se ha echo es asignar lo que está a la derecha de “=” a la variable que está a la
izquierda de “=”. Internamente en la memoria de la computadora conectamos la variable
de nombre n con el valor 7, y luego a la variable de nombre n la conectamos con su valor
anterior mas 3. De hecho en computación x = 20 no es una igualdad sino una asignación,
que significa que a la variable x se le asigna el valor 20.
A las variables también se les puede asignar números complejos, de hecho estas
variables tienen algunas propiedades interesantes.
>>> a = 5-3j
>>> b = -6+10j
>>> c = a+b
>>> c
(-1+7j)
>>> c.real
-1.0
>>> c.imag
7.0
>>> b.conjugate()
(-6-10j)
>>>
Los nombres dados a las variables pueden ser casi cualquier combinación de letras y
números que utilicen la codificación Unicode7 . Bueno casi, ya que existen ciertas reglas.
El primer carácter no puede ser un número. Así m2 es un nombre de variable
válido, pero 2m no.
6 Internamente es un poco mas complejo. Python no maneja variables si no mas bien referencia a
objetos. En capítulos posteriores se hablará de objetos, pero de todas maneras este manejo interno es
transparente al usuario.
7 Esto se verá mas adelante en la sección 4.1
24 Primeros Tropiezos
Al utilizar codificación unicode se pueden usar letras propias del idioma español,
lo que no ocurre con otros lenguajes como el C/C++, Fortran, Java, etc. Es
perfectamente válido escribir : año = 2014, o papá = 32.
No se pueden utilizar símbolos, a@g?3 no es un nombre de variable válido.
Existen ciertas palabras que están reservadas para el uso del interprete Python y
no se pueden usar como variables, aún no hemos visto ninguna, pero si quiere
verlas todas diríjase al apéndiceA.
>>> z = 5+2j
>>> a = 20
>>> b = -3.5
>>> z -a + b
(-18.5+2j)
>>>
En el ejemplo anterior se declararon variables de los tres tipos de datos que conocemos
hasta hora, luego se “mezclaron” en una suma, pero gracias a la conversión implícita se
calcula el resultado esperado. Por esto se dice que Python posee tipos dinámicos. Si se
nos olvidó de que tipo es determinada variable, solo tenemos que preguntarlo.
>>> type(z)
<class ’complex’>
>>> type(a)
<class ’int’>
>>>
La función8 type() (tipo) responde con la clase de dato al que pertenece la variable.
Pero si lo que queremos es saber si la variable b es del tipo flotante, debemos preguntar
con la función isinstance(b, float). Si b es del tipo punto flotante, Python responderá
verdadero (True), por supuesto si no es un “float” responde falso (False).
Por supuesto lo mismo se aplica para el tipo int o cualquier otro tipo.
8 Ya se, aún no hemos visto que son las funciones en Python, pero falta poco.
2.8 Incompletándolo todo 25
>>> oct(123)
’0o173’
>>> hex(123)
’0x7b’
>>> bin(123)
’0b1111011’
>>>
Por último en vez de trabajar con enteros o punto flotante también lo podemos hacer
directamente con decimales:
muy interesante, pero le daremos poca utilidad en este libro. Si usted intenta reproducir
el ejemplo anterior en el terminal obtendrá:
Ejemplo 2.1 — ¡Que pesado!. Un cuerpo tiene una masa de 50 kg ¿Cuál es su peso?
>>> g = 9.8
>>> m = 50
>>> P = m*g
>>> P
490.00000000000006
>>>
Ejemplo 2.2 — ¿Está muy fría?. Un termómetro mide una temperatura para un vaso
de agua caliente de 123 °F ¿Cuál es su temperatura en grados Celsius?
Respuesta: Un grado Fahrenheit equivale a 0.556 Celsius por lo tanto.
>>> 123*0.556
68.388
>>>
Ejemplo 2.3 — Móvil en SI. Un automóvil viaja por la autopista a 108 km/h. ¿A que
a)
>>> from math import sqrt
>>> a = sqrt(2)-1j
>>> b = 1-sqrt(2)*1j
2.9 Ejemplos y (un) ejercicio. 27
>>> a - 1j*b
-2j
>>>
b)
>>> a = 2+1j
>>> b = 3-4j
>>> c = a^2
>>> c = a**2
>>> c.conjugate()/b
(1-0j)
>>>
Luego de los tropiezos vienen las caídas, también deberemos darnos la cabeza contra
la pared de vez en cuando. Eso es lo natural en casos como este donde uno se propone
aprender cosas nuevas, o tal vez debería decir que eso es lo natural en este caso, donde
usted insiste en aprender Python utilizando este libro. En cualquier caso, o en cualquiera
de todos los casos, a continuación se profundizará un poco mas en el funcionamiento
básico de Python. Al funcionamiento complicado el lector deberá dejarlo para mucho
después después de haber llegado al final del libro.
Esta función tiene un nombre (float), acepta como parámetro el número o variable al
que se le quiere cambiar el tipo y regresa el número ahora con el tipo cambiado a float.
>>> a = 25
>>> b = float(a)
>>>
>>> b
25.0
>>>
otra función que ya hemos visto, que no necesita parámetros y que tampoco regresa
ningún resultado es quit(). Otra función interesante es la que obtiene el valor absoluto
de un número.
>>> a = -3.8
>>> abs(a)
3.8
>>>
>>> round(-8.235816,3)
-8.236
>>>
>>> round(3.5)
4
>>>
de utilidad a alguna que otra persona, el módulo matemático. Supongamos por ejemplo
que queremos hallar la componente x de un vector ~a conociendo su magnitud y su ángulo
con el eje de las abscisas. Como alguno de los lectores ya sepa ax = |~a| cos(α) (desde
ahora en adelante para simplificar la notación denotaremos la magnitud |~a| simplemente
como a ). Para realizar el cálculo debemos dar los valores de la magnitud y del ángulo,
estos son: a = 44 y α = 60 Ȧhora podemos codificar el problema en Python.
>>> alfa = 60
>>> a = 44
>>> import math
>>> a * math.cos(alfa)
-41.90617113826688
>>>
>>>
>>> dir(math)
>>> math.radians(60)
1.0471975511965976
>>>
>>> math.degrees(1.0471975511965976)
59.99999999999999
>>>
32 Yéndose de bruces con Python
Puede ser que el nombre del módulo no nos guste (math es bastante feo) o puede
que sea muy largo (un módulo que utilizaremos más tarde se llama matplotlib), no hay
problema podemos usar un alias.
Si por el contrario quisiéramos importar todas las funciones del módulo matemático
simplemente haríamos from math import *. Donde * significa “todas” (las funciones y
constantes).
~a ·~b = ab cos(α)
Para despejar el ángulo α debemos calcular primeramente las magnitudes de q los vectores
~
así como su producto ~a · b. La magnitud se obtiene gracias a Pitagoras: a = a2x + a2y y
el producto es simplemente: ~a ·~b = ax bx + ay by . El cálculo a realizar es desde luego:
~
~a · b
−1
α = cos
ab
a continuación el código que resuelve este problema.
(3.2)
El código en Python para resolver este problema es:
>>> c = 55
>>> cad1 + c
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can’t convert ’int’ object to str implicitly
>>>
>>> c = 55
>>> cad2 = ’0123456789’
>>> str(c)
’55’
>>> int(cad2)
123456789
>>> float(cad2)
123456789.0
>>>
Aunque parezca mentira hay personas a las que le desagradan las comillas simples, para
ellas existen las comillas dobles que son totalmente equivalentes. Solo hay que tener
cuidado de no mezclar los dos estilos en una misma sentencia.
Siempre es muy fastidioso estar repitiendo lo mismo una y otra vez, pero afortunada-
mente Python nos puede ayudar un poco.
Tal vez este sea el momento oportuno para introducir una nueva función predefinida, tal
vez no, en todo caso aquí va. La función es print(), maravíllense con su utilidad.
>>> a = 3
>>> print(a)
3
>>> b = " es un número primo"
>>> print( str(a) + b )
3 es un número primo
>>>
Bueno tal vez no parezca tan útil por ahora, pero a medida que avancemos iremos
descubriendo su poderío y sus truquitos. El primero de ellos es el siguiente:
En el miniprograma anterior hay varias cosas que explicar, en primer lugar está “\n” y
luego “\”. Empecemos por este último. Cuando estamos programando y una sentencia o
declaración es demasiado grande como para quepa en un renglón, simplemente usamos \
y podemos usar dos renglones para la misma línea de comando. Por otra parte print()
entiende \n como un caracter especial que significa “salto de línea”. El salto de línea
forma parte de un grupo de caracteres especiales llamados secuencias de escape.
En el cuadro 3.1 se encuentran todas las secuencias de escape2 que maneja la función
print(). El lector puede sentirse libre de experimentar con todas ellas, una y otra vez
hasta que las domine, o se aburra, lo que ocurra primero. Ahora empezamos a entender
2 Hace
mucho, mucho, mucho tiempo, en la época de las máquinas de escribir, la diferencia entre \n y
\r era importante, esta última se utilizaba para un nuevo párrafo, mientras que la anterior sólo para una
nueva línea. Actualmente se usa casi exclusivamente \n.
3.3 Python encadenado 37
la utilidad de print(), con esta función se le puede dar formato a una salida de texto para
que sea mas amigable y entendible al usuario. Mas adelante volveremos sobre este tema.
Nos falta una última forma de crear cadenas
Las cadenas en Python son un ejemplo de un tipo especial de dato llamado secuencia.
Las secuencias son una colección posicionalmente ordenada de objetos3 [Lut13]. Si la
secuencia es una cadena, se tendría simplemente una colección ordenada de caracteres.
Y como están ordenadas cada uno de sus caracteres se pueden ubicar con un índice.
>>>
>>> cadena = "Esta es una secuencia ordenada de caracterres"
>>> cadena[0]
’E’
>>> cadena[10]
’a’
>>>
Los índices se colocan entre paréntesis rectos y comienzan en cero. Con la función len()
obtenemos su longitud, que en este caso es 44, como los índices empiezan en cero el
último índice tiene que ser 43. Si nos pasamos de este valor obtenemos un error.
>>> len(cadena)
44
>>> cadena[43]
’s’
>>> cadena[44]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>>
también podemos tomar un pedazo o porción (slice en ingles). Observese que los
espacios en blanco cuentan como caracteres.
>>> cadena[12:21]
’secuencia’
>>> cadena[9:18]
’na secuen’
>>>
si queremos una porción desde el principio, o una hasta el final, no tenemos que escribir
los índices completos
>>> cadena[0:18]
’Esta es una secuen’
>>> cadena[:18]
’Esta es una secuen’
>>> cadena[18:len(cadena)]
’cia ordenada de caracteres’
>>> cadena[18:]
’cia ordenada de caracteres’
>>>
>>> 3>1
True
>>>
al “>” se le suele llamar mayor que y es uno de los varios operadores lógicos que existen
en Python. Es mas el número de preguntas que se pueden hacer con los operadores
3.4 Decisiones ¡Ave María! 39
Estas son las únicas preguntas que necesitamos para tomar una buena decisión y pasar a
la acción, es decir:
En Python para hacer este tipo de pregunta se utiliza if y else y se escribe así
>>> if a>=b :
... a+b
... c = a*(b/5)
... else:
... a-b
Lo anterior significa que si a es mayor que b entonces se sumará a + b y luego a c
se le asignará el resultado de a ∗ (b/5). Pero en caso de que la proposición sea falsa, es
decir si a es menor que b, entonces se resta a − b. Observemos muy bien la forma en que
se ha expresado la pregunta, en primer lugar la pregunta se finaliza con dos puntos“:”.
Luego en el siguiente renglón se utiliza una sangría, de hecho todo lo que queremos
hacer si la proposición es verdadera debe ir con la misma sangría, no es importante el
ancho, pero es obligatorio usarla. Cuando ya hemos hecho todo lo que necesitábamos
hacer si la proposición era verdadera, entonces dejamos de usar la sangría. Los tres
puntos, Python los coloca automáticamente y remplazan a >>> para recordarnos que
se debe usar sangría. La palabra reservada else no es obligatoria, ya que no siempre
estamos interesados en hacer algo específico si la proposición es falsa. Pero en caso que
necesitemos usarla sigue las mismas reglas que el if. Se debe utilizar los dos puntos
y luego lo que sigue debe expresarse con sangría. Como ejemplo véase el cálculo de
a ∗ log(|b|).
>>> import math as ma
>>> a = 10
>>> b = -30
>>> if b<0:
... b = -b
... print("pasamos por aquí")
...
pasamos por aquí
40 Yéndose de bruces con Python
>>> a * ma.log(b)
34.011973816621555
a propósito coloqué un valor de b negativo, de tal manera que la pregunta b<0 tiene
como respuesta True y se realiza el cambio de signo (b = -b). De esta manera podemos
calcular el logaritmo adecuadamente. Si por el contrario se hubiese colocado un valor
de b positivo, por ejemplo b = 100, la respuesta hubiera sido False y no se ejecuta la
instrucción b = -b. Compruébelo y verá que no pasamos por aquí.
Ejemplo 3.3 — Raíces de un polinomio de segundo grado (parte 2). En el
ejemplo 3.2 calculamos las raíces de un polinomio de segundo grado para hallar la
solución a un problema de cinemática. A continuación lo refinaremos un poco.
Lo que hemos hecho es preguntar si el radicando es mayor que cero, de no ser así las
raíces serían imaginarias, lo que nos daría un tiempo imaginario, pero el tiempo tiene
siempre que ser real (matemáticamente hablando). Pruebe hacer el ejercicio anterior con
un h suficientemente grande o por el contrario con vyo muy pequeño para comprobar el
funcionamiento del algoritmo.
La otra novedad es un nuevo uso de la función print(). Anteriormente ya la habíamos
utilizado mezclando números con cadena de caracteres, la diferencia es que aquí no
concatenamos las variables, sino que escribimos las variables separadamente ... separán-
dolas con comas. Si el lector se fija bien fueron 4 variables, dos cadenas de caracteres y
dos números.
¿Que pasa si queremos hacer muchas preguntas? ¿Que pasa si tenemos muchas
dudas? ¿Que pasa si queremos saber esto y lo otro? ¿Que sucede si no resistimos el
impulso de preguntar y preguntar todo el tiempo? Bueno en principio se pueden utilizar
tantos if como se desee.
>>> a = 100
>>> if a>0:
... print("pasé por aquí")
3.4 Decisiones ¡Ave María! 41
>>> if a>100:
... print("no, ¡pasé por aquí!")
>>> if a<=0:
... print("se muy bien por donde estoy pasando")
>>> if a!=0:
... print(a)
en el ejemplo anterior se hace una pregunta tras otra. También se pueden tener if
anidados.
>>> a = 100
>>> if a>0:
... if a>50:
... print(a)
... else:
... print("a no es menor que 50")
... else:
... print("a no es mayor que 0")
...
100
>>>
pruebe lo que pasa para diferentes valores de a.
A veces no queremos hacer muchas preguntas, ya que esto es ineficiente desde el
punto de vista computacional, solo queremos seguir preguntando en el caso de que la
respuesta a la pregunta anterior sea negativa. Es decir:
véase que elif es una contracción de else e if. En código esto sería algo así:
>>> a = 100
>>> if a>5000:
... print("pasé por aquí")
>>> elif a>150:
... print("no, ¡pasé por aquí!")
>>> elif a<=0:
... print("se muy bien por donde estoy pasando")
>>> else:
... print(a)
>>>
Ahora que ya sabe hacer preguntas, puede ir con toda seguridad a la sección siguiente.
>>> contador = 0
>>> while contador<10:
... print("Repito ", contador, " veces lo mismo.")
... contador += 1
...
Repito 0 veces lo mismo.
Repito 1 veces lo mismo.
Repito 2 veces lo mismo.
Repito 3 veces lo mismo.
Repito 4 veces lo mismo.
Repito 5 veces lo mismo.
Repito 6 veces lo mismo.
Repito 7 veces lo mismo.
Repito 8 veces lo mismo.
Repito 9 veces lo mismo.
>>>
En el ejemplo anterior, lo primero que hemos hecho es crear una variable llamada
“contador” que inicializamos a cero, luego se creó una línea que lo que significa en
3.5 ¿Me lo puede repetir por favor? 43
castellano es algo así como: mientras contador sea menor que cero, repite lo que
sigue. Para que Python entienda claramente que es lo que sigue se necesitan los dos
puntos(“:”) y utilizar sangría. Como se puede apreciar la sentencia while necesita evaluar
una proposición, que en el ejemplo es contador<0, si esta proposición es verdadera,
se ejecuta el ciclo hasta que la proposición sea falsa. Desde luego podemos colocar
una proposición que nunca sea falsa, en este caso el ciclo se repetirá hasta el fin de los
tiempos o hasta que la computadora se dañe, lo que ocurra antes. Si por el contrario la
proposición nunca es verdadera, entonces nunca se realiza el ciclo.
La línea print(“Repito...”) no debería causar problemas al lector, imprime en pantalla
en primer lugar una cadena de caracteres (“Repito ”), luego el valor de la variable
contador y por último otra cadena de caracteres (“ veces lo mismo.”). Observemos el
espacio ente las comillas y las palabras para que estas no queden pegadas a los números.
La línea contador += 1 es exactamente igual a contador = contador + 1 solo que
escribimos menos, y al escribir menos, nos equivocamos menos. Esto significa que la
variable contador se incrementa en uno cada vez que se repite el ciclo, y el ciclo se
repite diez veces ya que empieza en cero y la condición de parada es contador<10.
Si se hubiese puesto contador += 3 la variable contador habría aumentado de 3 en 3.
También existen operadores similares para la resta − =, para la multiplicación ∗ = y
para la división / =.
La sentencia while es muy útil y se usa muchísimo para las repeticiones, que formal-
mente se denominan bucles que es una palabra menos aburrida que repetición, al menos
para los computistas.
Ejemplo 3.4 — Contando Conejos. Supongamos que se tienen dos conejos, un
macho y una hembra. ¿Cuantos conejos se tendrán al cabo de un año? Responder
esta pregunta le pareció de lo más interesante a un matemático llamado Leonardo
de Pisa conocido también como Leonardo Bigollo allá por el año 1202. Claro como
buen matemático idealizó un poco el problema. En primer lugar los conejos nunca
morían. Se reproducían cada mes generando otros dos conejos (un macho y una hembra)
que también se reproducían al mes y así sucesivamente. El período de gestación dura
exactamente un mes al cabo del cual los conejos padres se vuelven a aparearse. Por
lo tanto al principio tenemos cero conejos, al mes tenemos el primer par. Al segundo
mes ocurre el apareamiento, pero seguimos con un solo par. Al tercer mes aparecen los
primeros hijos para tener dos pares de conejos. Al cuarto mes los padres vuelven a parir
otro par de conejos, pero los hijos nacidos el mes anterior aún no tienen sus propios
hijos, por lo tanto el número de pares de conejos es 3. Al quinto mes aparecen los nietos
(un nuevo par), adicionalmente los padres originales vuelven a tener otro par de hijos.
Esta secuencia es como sigue:
Leonardo de Pisa fue un matemático muy importante en la edad media, que entre
otros logros, fue quien introduzco el sistema de numeración arábigo en occidente.
Adicionalmente parece que fue el hijo (filius) de un hombre muy bien intencionado
o simple (Bonacci) de ahí su apodo póstumo Fibonacci. No dudo que ser hijo de un
hombre bien intencionado tenga sus méritos, pero Leonardo de Pisa no lo necesita ya
que brilla con méritos propios[Wika]. A pesar de eso la costumbre se ha impuesto y la
secuencia de números anterior se conoce con el nombre de sucesión de Fibonacci.
Lógicamente lo que viene a continuación es hacer un código que calcule automá-
ticamente la sucesión de Fibonacci para un número arbitrario de términos. Para ello
observamos que un número cualquiera de la sucesión se forma con la suma de los dos
anteriores. Por ejemplo 21 + 34 = 55 o 233 + 377 = 610. Claro que esta regla no funciona
con el primer y segundo número, de hecho estas son las condiciones iniciales para toda
la sucesión. Pero en general podemos comenzar en cualquier parte, solo debemos dar
dos números consecutivos en la sucesión, calcular el tercer número consecutivo y luego
repetir el proceso. He aquí el código.
>>>
>>> term1 = 0 #Primer término requerido para comenzar la sucesión
>>> term2 = 1 #Segundo término requerido para comenzar la sucesión
>>> cont =0 #Contador para la condición de parada en el bucle while
>>> while cont<10:
... term = term1 +term2
... print(term)
... term1 = term2
... term2 = term
... cont += 1
...
1
2
3
5
8
13
21
34
55
89
>>>
>>> a, b = 0, 1
>>> while b < 1000:
... print(b)
... a, b = b, a+b
...
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
>>>
En la primera línea aparece una asignación múltiple, que significa que le asignamos valor
a mas de una variable al mismo tiempo, en nuestro caso a a y a b. Esta vez no hemos
usado un contador para salir del ciclo while sino que usamos la propia variable b, solo se
saldrá del ciclo cuando la proposición b <1000 sea falsa. Dentro del ciclo imprimimos
b y luego en la siguiente línea otra vez una doble asignación donde actualizamos las
variables.
46 Yéndose de bruces con Python
ti−2 + ti−1 = ti
t1 = 0
t2 = 1
ti = ti−1 + ti−2 para i = 2, 3, 4, ...
Claro que en nuestra simulación podríamos querer tener muchas pelotas diferentes,
no hay problema, ya que una vez que conocemos todas las características que deben
tener nuestras pelotas, podremos hacer varios objetos de la misma clase. Entonces el
procedimiento sería definir una clase y luego crear tantos objetos pertenecientes a esa
clase como queramos.
No vamos a adentrarnos por ahora en las profundidades del paradigma de programa-
ción llamado Programación Orientada a Objetos (POO), pero como ya se puntualizó al
comienzo de esta sección “ en Python todos son objetos” y por lo tanto debemos tener
alguna idea acerca de ellos. Ya hemos hecho uso explícito de los objetos puesto que
hemos utilizado sin decirlo varios métodos, por ejemplo en la en la sección 2.7 y en el
ejercicio 2.4 se utilizó el método que encuentra el conjugado de una variable compleja,
así es, como en Python todo es un objeto, las variables también lo son, sean complejas
o no. Si a la variable compleja la llamamos z, entonces su conjugado es z.conjugate().
La sintaxis general sería objeto.método, de hecho cada vez que aparezca un punto en
alguna parte, seguramente es porque se está llamando al método de un objeto, incluso
hasta los módulos son objetos.
3.7.1 Cadenas
Las cadenas son iportantísimas para interaccionar con el usuario, que por lo general
es un humano. Sobre ellas ya se expuso suficiente en la sección 3.3. Sin embargo no
puedo resistir la tentación de agregar algunas líneas con el único propósito de hacer
todo esto aún mas aburrido, si esto es posible. Observemos el siguiente trozo de código
donde se ilustra el método find().
cad1 = "Esta es una aburrida sucesión de caracteres que forma una cadena"
>>> cad1
48 Yéndose de bruces con Python
3.7.3 Tuplas
En matemáticas, una tupla es una secuencia ordenada de objetos. Y eso es justamente
lo que en Python es una secuencia, así que vamos bien. La tupla es igual que una lista,
la diferencia es que la tupla es inmutable. Esto significa que no se aplican ninguno de
los maravillosos métodos que hemos visto para modificar las listas, justamente porque
las tuplas no se pueden modificar, pero si funcionan todos los métodos generales que se
apilan a las secuencias. Para crear una tupla se utilizan comas.
Por razones de claridad se suele escribir a las tuplas entre paréntesis, pero no es
obligatorio. Especial cuidado hay que tener con la notación cuando se crean tuplas de
un solo elemento.
>>> t2 = (5)
>>> type(t2)
<class ’int’>
>>> t3 = (5,)
>>> type(t3)
<class ’tuple’>
>>>
Cuando en el código anterior se le pregunta a Python de que tipo es t2, responde que es
un objeto que pertenece a la clase entero (es decir, es un número entero). Pero cuando
hacemos la misma pregunta con t3 respuesta es que pertenece a la clase tupla (tuple en
ingles). La diferencia es que t3 se creó con una coma al final y las comas son lo que
definen a las tuplas, no los paréntesis.
Una propiedad importante de las listas y tuplas es que se pueden desempaquetar, en
el código que sigue la tupla t2 se desempaqueta en tres variables enteras y una cadena.
<class ’int’>
>>>
Todavía quedan más cosas por aprender acerca de las secuencias, pero lo dicho hasta aquí
alcanza para nuestros fines, para investigar a mayor profundidad puede verse [Bea09;
Pil09]
Figura 3.1: ipython3 en un terminal. Se puede observar los números de lineas corres-
pondientes a cada instrucción.
como “salida” nos da el resultado en Out [1]: Ambas salida y entrada (In, Out) están
numeradas para poder hacer referencia a ellas mas tarde.
Como es lógico IPython hereda todas las características del terminal “normal” entre
ellas la complementación de sintaxis con la tecla tabulador. Supongamos que queremos
escribir la declaración while empezamos por escribir la w y luego apretamos la tecla
tabulador. El resultado es una lista de sentencias que todas comienzan con w6 .
In [1]: w
%who %who_ls %whos while with
In [1]: w
In [1]: a = 45
In [2]: b = 126
In [3]: b/a
Out[3]: 2.8
In [4]: c=(b-a)/10
In [5]: a+b+c
Out[5]: 179.1
In [6]: _3
Out[6]: 2.8
In [7]: _i4
Out[7]: ’c=(b-a)/10’
In [8]:
6 Como el lector puede ver por si mismo algunas de estas palabras empiezan por % y no por w, este
símbolo indica que son palabras mágicas y no pertenecen a Python sino a IPython. Como este no es un
tratado sobre IPython no se tocarán todas las palabras mágicas aquí, pero si la curiosidad lo carcome
consulte la bibliografía.
3.9 ¿Me lo puede volver a repetir por favor? 53
Puede que no estemos interesados en que se muestre una salida en particular, ya sea
porque es muy larga, muy fea, o simplemente porque no se nos da la gana, entonces
colocamos “;” al final de la línea.
In [8]: c*2-b
Out[8]: -109.8
In [9]: c*2-b;
In [10]:
In [11]: %hist
a = 45
b = 126
b/a
c=(b-a)/10
a+b+c
_3
_i4
c*2-b
c*2-b;
%hist
In [12]:
Suficiente, hacer una lista de de todas la capacidades que ofrece IPython no solo
es aburrido sino que tendríamos que mencionar cosas que aún no hemos estudiado.
Utilizaremos IPython desde ahora en adelante e iremos aprendiendo sobre la marcha.
E
l
c
o
n
t
r
a
s
e
n
t
i
d
o
d
e
l
a
v
i
d
a
In [3]:
Lo que hizo el ciclo for fue tomar una variable c y asignarle consecutivamente los
caracteres de la cadena cad1[0], cad1[1], cad1[2], .... Para cada iteración le asigna
un nuevo caracter y lo imprime, el incremento en el índice de la cadena se realiza
automáticamente. Si no nos gusta que los caracteres se impriman verticalmente, podemos
intentar la siguiente modificación para que print() no imprima al final el comando para
una nueva línea (\n), sino mas bien que no imprima nada al final (“”)
También en vez de que no escribiera nada al final le pudimos haber pedido que escribiera
Cualquier cosa.
Ahora un ejemplo con listas en vez de cadenas. Aquí la variable es animal y la secuencia
una lista llamada L1.
In [7]:
Observemos como en la función print() se han mezclado las variables como por ejemplo
animal con cadenas literales como "tiene " separándolas por comas para que se puedan
imprimir en pantalla correctamente.
Iterar directamente sobre “objetos iterables” como las secuencias es muy práctico,
pero no siempre queremos hacer esto, por ejemplo cuando queremos modificar los
valores de la propia lista sobre la que estamos iterando. Para estos casos tenemos la
función range() . Esta función genera una secuencia progresiva de enteros y su sintaxis
es la que sigue range( inicio, fin, incremento), es decir la secuencia comienza en inicio,
termina en fin y los enteros se incrementan con incremento. ¿Fácil no? Un ejemplo:
range(15, 23, 3) genera la siguiente secuencia de números 15 18 21. Si omitimos
especificar el incremento, se toma 1 como incremento por defecto, es decir range(15,
23) nos da 15 16 17 18 19 20 21 22. Si en cambio omitimos inicio se comienza en 0, por
ejemplo range(4) nos da la secuencia 0 1 2 3. Notemos que el 4 no aparece, así como
tampoco lo hace el 23 en la secuencia anterior.
Hasta Python 2.7 inclusive, la función range() devolvía como secuencia una lista, a
partir de Python 3.0 genera un iterable o iterador, sobre este tipo de objetos se tratará
mas adelante.
Volviendo a nuestro querido for, observemos el siguiente trozo de código
In [1]: L1 = [0, 1, 2, 3, 4]
56 Yéndose de bruces con Python
In [3]: L1
Out[3]: [0, 1, 4, 9, 16]
In [4]:
Instrucciones
No
While
Si
Instrucciones
del ciclo
Instrucciones
In [3]:
In [2]:
En este ejemplo al principio nos encontramos con dos ciclos for... anidados (uno dentro
del otro). En el primero de ellos se utiliza un iterador entre 2 y 10 , por lo tanto la
variable n va tomando sucesivamente los valores 2, 3, 4, ... hasta legar a 9. El segundo
ciclo comienza igualmente en 2, pero el iterador termina en el valor que en ese momento
tenga la variable n, por ejemplo supongamos que tenemos un valor de n = 5, entonces i
tomará sucesivamente los valores 2, 3, 4. Luego en la sentencia if se evalúa si el resto de
la división entera entre n e i es igual a cero o no. Si es igual a cero significa que n es
divisible entre i y por lo tanto n no puede ser primo. La sentencia break nos saca del
ciclo interno (for i in range(2, n):) pero no del externo. Véase la nueva forma de utilizar
else, aquí la sentencia else no está asociada al if sino como alternativa al ciclo for...in
interno. Si el ciclo termina correctamente, la sentencia else se ejecuta, en cambio si el
ciclo se interrumpe por alguna causa (en este caso debido al break) la sentencia else no
se ejecutará. Véase el siguiente código para asegurase de que se entendió bien el uso de
else.
3.10 Todo bajo control 59
In [4]:
Del ejemplo anterior se deduce que la forma genérica del ciclo for...in es
for variable in iterador:
instrucciones dentro del bucle
else:
instrucciones que solo se ejecutan
si el ciclo for...in termina abruptamente
while condición:
instrucciones dentro del bucle
else:
instrucciones que solo se ejecutan
si el ciclo while termina abruptamente
In [1]: cont = 0
es decir si la variable vale 5, se ejecuta la declaración if que emplea a continue para que
el ciclo continúe sin ejecutar la función print(), por eso la sucesión de números salta de
4 a 6.
Finalmente mencionaremos la sentencia pass, su utilidad consiste en no hacer abso-
lutamente nada, simplemente existe. Muchos lectores ingenuos pensaran que esto no es
útil, pero aveces no hacer nada es lo mejor que se puede hacer, el autor de este libro lo
hace todo el tiempo.
In [1]: N = 12
In [2]: result = 1
In [4]: result
Out[4]: 479001600
In [5]:
1
cos(x)
0.8
x
0.6
f(x)
0.4
0.2
0
0 0.2 0.4 0.6 0.8 1 1.2 1.4
x
Figura 3.3: En la gráfica se aprecia la intersección del la función cos(x) con la función
x en el intervalo [0, π/2].
nuestra condición de parada podría ser reportar el resultado cuando la diferencia entre
los extremos del intervalo sea menor que 0.00001. Es decir si (a − b) < 0.00001 y x está
entre a y b entonces seguramente cumple con la condición exigida.
In [2]: a = 0.1
In [3]: b = 1.1
f(b)
a c e b
f(c)
Figura 3.4: En la figura se ilustra el método de la bisección. Se comienza con el intervalo
[a, b] que se divide a la mitad para obtener el punto c, véase que f (c) y f (b) tienen
signos diferentes ya que la raíz se encuentra dentro del intervalo [c, b]. Este intervalo a
su vez se divide a la mitad para encontrar el punto d. Ahora el intervalo que contiene
la raíz es el [d, b], que nuevamente dividimos a la mitad y encontramos el punto e, este
procedimiento se repite hasta que se cumpla la condición de parada.
0.7875000000000001
0.7562500000000001
0.7406250000000001
0.7328125000000001
0.7367187500000001
0.7386718750000001
0.7396484375000001
0.7391601562500001
0.7389160156250001
0.7390380859375001
0.7390991210937501
0.7390686035156251
0.7390838623046876
0.7390914916992188
In [7]:
estos valores nos dice en cuál sub-intervalo se encuentra la raíz. Esto lo descubrimos
con la sentencia if. Si ( f x ∗ f a) < 0 es verdadero entonces la raíz esta en el intervalo
[a, x] en este caso debemos pasar el valor de x a la variable b para que en el nuevo ciclo
del bucle while podamos calcular x correctamente. En caso contrario (else) la raíz se
debe encontrar en el intervalo [x, b], por lo tanto el valor de la variable x se pasa a a.
En este punto del programa tenemos un nuevo intervalo [a, b] que tiene la mitad de la
longitud que el original. A continuación debemos calcular el nuevo valor para el ancho
del intervalo, como b > a basta con hacer ancho = b − a luego imprimimos el valor de
x. La respuesta final al problema es x = 0.73909 ± 0.00001
Los ciclos son ideales para encontrar el resultado de sumatorias y series, a conti-
nuación una serie de ejercicios que se pueden resolver con las herramientas aprendidas
hasta ahora.
Ejercicio 3.1 — π. Una forma de aproximar el valor de π es
∞
1 π4
∑ 4 90=
n=1 n
Ejercicio 3.3 — ln. El logaritmo natural de cualquier valor x se puede hallar mediante
la serie.
∞
(−1)n (x − 1)n+1
ln(x) = ∑
n=0 (n + 1)
diagramación, mientras que los procesadores de texto si la tienen. A pesar de que los
editores guardan lo escrito como texto plano (es decir sin florituras ni diagramación) no
necesariamente lo escrito con un editor es entendido correctamente por un editor distinto,
sobretodo si los textos fueron escritos en sistemas operativos diferentes. El problema
radica en la codificación, es decir la manera en como los caracteres que vemos en la
pantalla son traducidos por el editor a ceros y unos, que es lo que finalmente entiende la
computadora. En los actuales momentos existe una gran variedad de codificadores debido
fundamentalmente a que los distintos idiomas utilizan diferente conjunto de caracteres,
esto puede ser un gran problema para desarrolladores de páginas web, donde los usuarios
pueden ser chinos como rusos o ingleses. En cuanto a programación se refiere, el más
usado conjunto de caracteres son los del código ASCII2 , este tipo de código solo entiende
los caracteres del diccionario ingles, los siento nada de eñes ni acentos. No se podía
escribir palabras como año ni siquiera los nombres de físicos famosos como Schrödinger.
Desde luego esto originó una enorme cantidad de codificaciones diferentes para poder
incluir todos estos caracteres extraños, afortunadamente en la actualidad existe algo
llamado UTF-83 que cada día gana mas y mas aceptación. La codificación UTF-8 acepta
todos los caracteres de todos los idiomas del planeta, además de símbolos como !$ %
, etc. Hasta la versión Python 2.7 si uno quería usar la codificación UTF-8 tenía que
especificarlo explicitamente ya que Python como todos los demás lenguajes empezó
entendiendo solo caracteres ASCII, pero a partir de Python 3.0 utiliza UTF-8 por defecto.
Por lo tanto lo mas razonable para mantener compatibilidad entre diferentes editores e
incluso diferentes sistemas operativos es asegurarse de que nuestro editor está usando
caracteres codificados en UTF-8.
A continuación debemos encontrar un editor de nuestra preferencia el autor ha
probado Emacs, porque es un fanático; vim, porque no es tan fanático; kate, porque es un
editor hecho pensando en los programadores para trabajar con el escritorio KDE que me
agrada enormemente (lo siento por la gente de Gnome); gedit, porque es un editor hecho
pensando en los programadores para trabajar con el escritorio Gnome que me agrada
enormemente (lo siento por la gente de KDE); Anjuta, un proyecto interesantísimo que
provee un entorno de desarrollo integrado muy poderoso (lo siento por la gente de Qt);
Kdevelop, un proyecto interesantísimo que provee un entorno de desarrollo integrado
muy poderoso (lo siento por la gente de GTK); Geany, me parece genial, al igual que
Bear, solo que este último es mas incipiente, de Spyder estoy deseoso de volver a usarlo
ahora que también tiene soporte para Python 3; lo mismo me pasa con eric5; Eclipse,
esta en la lista de editores para probar, al igual que tantos otros, pero no voy a aburrir
a mi ya de por si escuálida audiencia con una lista exhaustiva. El lector podrá por si
mismo tomarse los próximos seis meses probando editores al azar hasta encontrar el
que le guste. Una vez hecho esto fanatícese y diga abiertamente que todos los demás
editores son una porquería, si no lo hace así, corre el riesgo de pasarse no seis meses
sinó el resto de su vida probando editores, bueno en realidad no es tan malo, a mi me
parece divertido.
Bien, supongamos que ya pasaron los seis meses ya encontró el editor de su agrado,
jugó con el un poco, lo tiene configurado para trabajar en UTF-8 y ya está listo para su
primer programa en Python. Como es su “primera vez” daremos las instrucciones paso a
2 American Standard Code for Information Interchange
3 UCS Transformation Format—8-bit
4.1 Guiones y Programas 67
paso. Primero abra un archivo nuevo, luego guárdelo con el nombre de su preferencia,
por ejemplo primerporgrama.py. Note que el nombre debe contener una sola palabra y
debe terminar con la extensión .py, para la gente que usa el sistema operativo Windows
ya están acostumbrados a esto de las extensiones, pero en linux la extensiones no existen,
forman parte del nombre como cualquier otro conjunto de caracteres. Para linux el
nombre pudiera haber sido primer.programa y de todas maneras hubiese funcionado. En
cambio para los humanos es de gran ayuda ya que que nos dice de que se trata el texto
en cuestión, si tiene la extensión .py no tenemos que abrirlo para ver que es lo que tiene
dentro, ya sabemos que se trata de un programa escrito en lenguaje de programación
Python. A los editores les pasa algo parecido, necesitan saber la extensión para poder
usar todo el colorido poder de la coloración de sintaxis. Si la extensión es .c, entonces se
trata de un programa escrito en el lenguaje C y el editor utiliza la coloración adecuada
para ese lenguaje.
En los lenguajes compilados al programa escrito con el editor se le llama archivo
fuente, este es el archivo que tiene que ser compilado para producir un ejecutable. En
Python que es un lenguaje interpretado el ejecutable y el archivo fuente son la misma
cosa, pero debemos decirle al sistema operativo, en nuestro caso linux 4 , que tiene que
tratar al archivo de texto como un ejecutable. Esto se hace de dos maneras, la primera es
indicando explicitamente que el programa será ejecutado con el interprete de Python
msuarez@linux-rf6d:~> python3.3 NombrePrograma.py
al escribir esto en el terminal, el sistema operativo llama al interprete de Python para
que ejecute al programa llamado NombrePrograma.py. Procedamos de inmediato, abra
un editor de su agrado, escribamos al mundo nuestro primer mensaje.
print(’Adiós, mundo cruel’)
guardemos el programa con el nombre Test1.py, cuando esto sucede aparece la magia de
la coloración de sintaxis y su programa lucirá algo así como
print(’Adiós, mundo cruel’)
lindo ¿no? En su editor no necesariamente aparecerán los mismos colores, ya que
distintos editores utilizan coloración de sintaxis diferentes, pero que se pueden modificar
según los gustos del usuario. La coloración de sintaxis no solamente le da colorido
al programa, es útil ya que nos ayuda con una forma horrible de cometer errores de
programación, los errores de sintaxis, supongamos que escribimos mal la palabra print,
entonces se perderá la coloración
pront(’Adiós, mundo cruel’)
de esta forma sabemos que hemos escrito algo mal. Procedamos ahora a ejecutar el
programa escribiendo en el terminal5 el comando python3.3 Test1.py. En el terminal se
debe ver lo siguiente:
msuarez@linux-rf6d:~> python3.3 Test1.py
Adiós, mundo cruel
msuarez@linux-rf6d:~>
4 El procedimiento en otros sistemas operativos se encuentra fácilmente en Internet
5 Asegúrese de que en el terminal, usted se encuentra en la misma carpeta que el archivo Test1.py.
68 El colorido mundo de Python
msuarez@linux-rf6d:~> ./Test2.py
Adiós, mundo cruel
msuarez@linux-rf6d:~>
programa línea por línea hasta encontrar el punto exacto donde tenemos que hacer la
modificación, este problema se vuelve particularmente importante cuando los programas
son largos, de varias decenas o cientos de líneas de código. Aquí es donde se pone de
manifiesto la utilidad de los comentarios y de una programación clara y ordenada. Por
ejemplo, el inicio del programa que aparece en el ejemplo 3.3 se podría programar así.
#Condiciones iniciales
vo = 6 #velocidad inicial
beta = m.radians(60) #ángulo en radianes
una vez que se escribe el comando python3.3 input1.py en el terminal, no pasa nada,
el programa espera que el usuario introduzca un número, nosotros sabemos que eso es
lo que hay que hacer y lo hacemos (en el ejemplo se introduzco el número 5) pero un
usuario “genérico” no sabrá que es lo que tiene que hacer, lo mejor es decírselo.
Ahora podremos reescribir el programa del ejemplo 3.3 pero indicándole al usuario
que introduzca las condiciones iniciales. De esta manera no hay que modificar el
programa cada vez que se ejecute (ver ejercicio 3.2). Pero podemos ir un poquito mas
lejos, en el ejemplo de cinemática lo que en realidad se hace es hallar las raíces de un
polinomio de segundo grado, este problema se presenta con tanta frecuencia no solo en
cinemática sino en otras áreas de la ciencia y tecnología que vale la pena realizar un
programa que lo resuelva. Veamos si puede entender lo hace el siguiente programa solo
con los comentarios.
#!/usr/bin/env python3.3
#La línea anterior es para que podamos hacer un ejecutable.
’’’Este programa halla las raíces de un polinomio de segundo
grado de la forma ax**2 + bx +c, el usuario debe introducir
los coeficientes a b y c’’’
b = float(bb)
c = float(cc)
6 Existen notables excepciones. Laplace se preciaba de que la mecánica analítica por el desarrollada,
era tan poderosa que para su libro no hizo falta ninguna figura. Afortunadamente los libros modernos de
mecánica analítica si las tienen.
72 El colorido mundo de Python
# se genera la gráfica
plt.plot([11, 20, 30, 35],[4, 9, 7, -2])
# se le pone un título
plt.title("Me parece que he visto una linda figura")
# se muestra la gráfica
plt.show()
y como por arte de magia parece en pantalla una gráfica como la que se muestra en la
figura 4.1.
Lo primero que se nota es que en la figura no aparecen puntos, sino rectas azules
que unen los lugares donde deberían aparecer los puntos. Este es el funcionamiento por
defecto que utiliza matplotlib, pero lógicamente se puede cambiar, mas adelante veremos
como. Debido a que no se le ha puesto un nombre especifico a la gráfica, matplotlib
le pone uno por defecto, este es figure 1 que se puede ver en la parte superior de la
figura. En la parte inferior izquierda se aprecian una serie de siete iconos los cuales
describiremos brevemente. Empezando de la derecha a izquierda nos encontramos en
primer lugar con el ícono que nos permite guardar la figura. El formato por defecto
es png, pero también se pueden guardar en muchos otros formatos como el postscript
encapsulado eps, o también el formato pdf. El segundo ícono de derecha a izquierda
configura la forma de la figura, haciendo clic en el, se crea una segunda ventana donde
aparecen una serie de parámetros que se pueden variar a gusto del usuario, el botón
Reset regresa dichos parámetros a sus valores originales, la mejor forma de entender que
es lo que dichos parámetros hacen es aprobándolo, ¡pruébelo ahora!. Seguidamente, el
7 Desde ahora en adelante no especificaremos como se ejecuta el programa en el terminal.
4.3 Una imagen vale mas que mil palabras 73
tercer ícono de derecha a izquierda, nos permite ampliar un trozo de la figura a nuestro
antojo, tantas veces como queramos. El Cuarto ícono realiza cambios sobre los ejes de
coordenadas, si utilizamos el botón derecho del ratón se varía la escala, si en cambio
utilizamos el botón izquierdo, variamos el rango. ¡compruébelo! Los dos siguientes
iconos (que contienen flechas) nos permite “navegar” entre los cambios realizados a la
figura. El último ícono de derecha a izquierda, o el primero de izquierda a derecha (con
una figura de casita) deshace todos los cambios realizados a la figura y nos regresa a su
apariencia original.
Modificaremos ahora el programa anterior haciendo que matplotlib dibuje solo
puntos en vez de líneas rectas.
#!/usr/bin/env python3.3
’’’
Nuestra segunda gráfica
’’’
# se muestra la gráfica
plt.show()
En el programa se han puesto etiquetas a los ejes con las punciones xlabel() y
ylabel() y a la función plot() se le ha agregado la cadena ’ro’, “r” significa rojo y la “o”
significa que vamos a usar puntos. El resultado se muestra en la figura 4.2, desde ahora
en adelante no se mostrará la ventana que genera matplotlib, sino solo la gráfica que es
la que contiene la información relevante que deseamos mostrar.
Figura 4.2: Segunda gráfica con matplotlib. Aquí se muestra solo la gráfica en si misma,
sin las decoraciones de la ventana que genera matplotlib.
Observese que el último punto cuyas coordenadas son x = 35; y = −2 apenas es visi-
ble en la esquina inferior derecha de la gráfica. Esto lo podemos corregir inmediatamente
utilizando el ícono que cambia el rango en el eje de las abscisas y/o ordenadas, pero
también podemos especificar el rango directamente en el programa con las funciones
xlim() y ylim(). Si quisieramos hacer esto en nuestro ejemplo se tendrían que agregar las
siguientes líneas, en cualquier punto antes del plt.show()
plt.xlim(10,36)
plt.ylim(-3,10)
.
.
.
plt.show()
Estas funciones aceptan como argumentos dos números punto flotante que especifi-
4.3 Una imagen vale mas que mil palabras 75
Letra Color
b azul
c cían
g verde
k negro
m magenta
r rojo
w blanco
y amarillo
g = []
h = []
for i in range (0,180):
z = (i/30)
x.append(z)
f.append(ma.exp(-z))
g.append(ma.exp(-z)*ma.sin(2*ma.pi*z))
h.append(-ma.exp(-z))
# etiquetas para los ejes
plt.xlabel("x")
# se genera la gráfica
plt.plot(x, f, label=r"$e^{-x}$")
plt.plot(x, g, label=r"$\sin(2\pi x)e^{-x}$")
plt.plot(x, h, label=r"$-e^{-x}$")
# genera la leyenda
plt.legend()
# se muestra la gráfica
plt.show()
Analizaremos solo las sentencias nuevas que aparecen en el programa anterior. Luego
de la importación de los módulos se crean unas listas vacías con la variable x y las tres
funciones que vamos a graficar f , g y h, en un ciclo for...in es donde se rellenarán la
listas con los valores correspondientes usando la función append(). Como el iterador del
ciclo for...in varía entre 0 y 180, entonces las curvas tendrán 180 puntos, es necesario una
gran cantidad de puntos para que la curva se vea “suave” en la gráfica y no una colección
de líneas rectas (véase el ejemplo 4.2). Si bien el iterador nos da los 180 puntos, es con la
variable z (punto flotante) que calculamos los valores específicos de la coordenada. Con
la sentencia x.append(z) construimos la lista que contiene la variable x, en las sentencias
siguientes construimos de la misma manera las tres funciones. Observemos que en los
argumentos de la función append() calculamos directamente las funciones que vamos
4.3 Una imagen vale mas que mil palabras 77
a graficar usando el módulo matemático math. Una vez construidas las listas con las
variable y las funciones procedemos a graficar mediante plt.plot(), aquí aparecen varias
cosas nuevas. En primer lugar en vez de usar las listas directamente, hemos utilizado el
nombre asignado a esas listas, por ejemplo plt.plot(x, f) graficará la lista f en función
de la lista x. Adicionalmente hemos añadido una leyenda con el comando label=“...”,
lo que se ponga dentro de las comillas será tomado como una cadena y se colocará
textualmente en la leyenda, esto funciona muy bien la mayoría de las veces, pero no es
muy útil si queremos representar fórmulas. Para representar fórmulas matemáticas como
ex , símbolos matemáticos como ∑, o constantes como π debemos realizar un truquito.
El truco consiste en llamar al compilador de LATEX9 mediante r“. . .” colocando dentro de
las comillas la formula escrita en LATEX. Matplotlib tiene todo lo necesario para entender
estas fórmulas sin problema, pero en cambio el programador debe conocer como escribir
con LATEX[MG04]. Ya se han añadido las leyendas con la sentencia plt.plot() pero para
“crear” la leyenda y colocarla en la gráfica hace falta escribir la orden explicitamente con
plt.legend(). El resultado se muestra en la figura 4.3. Observese que matplotlib gráfica
las 3 curvas en colores diferentes de una manera automática sin necesidad de que lo
especifiquemos explicitamente.
Figura 4.3
9 LAT
EXes un sistema de escritura de documentos de alta calidad tipográfica. Originalmente diseñado
para documentos técnicos y científicos tiene un soporte maravilloso para escribir fórmulas, pero a
evolucionado tanto que se puede escribir poesía tanto como un artículo científico. Este libro se ha escrito
completamente usando LATEX
78 El colorido mundo de Python
arch = open("/home/msuarez/Python/Datos/texto.dat")
Por defecto la función open() abre el archivo en modo de lectura, pero también
podríamos estar interesados en escribir, o los datos podrían ser binarios y no caracteres.
El programador debe conocer estas alternativas de antemano y abrir el archivo en el
modo correspondiente. Para abrir correctamente una archivo en modo lectura se debe
escribir:
archivo = open("nombre del archivo", "r")
la “r” viene de “read” que naturalmente significa escribir, en el siguiente cuadro se
enumeran los modos utilizados por la función open().
Modo Significado
r Lectura
w Crear un archivo y escribir en el
a Adicionar datos al final de un archivo ya existente
r+ Lectura y escritura en un archivo ya existente
w+ Crea un archivo para la lectura y la escritura
a+ Lo mismo que ‘w+’ pero los datos son adicionados al final del archivo
rb Lectura en archivo binario
wb Crear un archivo binario y escribir en el
ab Adicionar datos binarios al final de un archivo ya existente
Para leer el contenido del archivo se utilizó la función (o más precisamente el método
asociado al objeto “archivo”) read() , no parece de mucha ayuda, pero al menos sabemos
que contiene el archivo. Observemos que read() en realidad arroja una sola cadena donde
el salto de línea esta representado por el caracter “\n”. Si por el contrario en vez de usar
el Python en forma iterativa usamos un programa, para observar la salida producida
por read(), necesitamos emplear la función print(), de lo contrario no se muestra salida
alguna.
archivo = open("texto.dat", "r")
print(archivo.read())
cuya salida en pantalla gracias a la función print() será:
Este es un importantísimo
archivo de texto, que contiene
tanto palabras como números.
Aquí van los números:
10 20 30 40 50 60 70 80 90 100
Esta oración no indica el fin del archivo.
Notemos que ahora la salida se corresponde perfectamente con lo que está escrito
en el archivo texto.dat, no aparecen por ningún lado los “\n” ya que la función print()
se encarga de interpretar correctamente los saltos de línea al igual que todas las demás
secuencias de escape. Claro que sería mucho mas útil si pudiésemos leer el archivo línea
a línea y efectivamente si podemos.
>>>
>>> archivo = open("texto.dat", "r")
>>> archivo.readline()
’Este es un importantísimo\n’
>>>
Sin argumentos, la función readline() lee la primera línea incluido los caracteres que
denotan el salto de línea. Si se quiere leer parte del renglón, se tiene que dar como
argumento el tamaño en bytes, cada carater es un byte, incluyendo espacios en blanco
>>>
>>> archivo = open("texto.dat", "r")
>>> archivo.readline(6)
’Este e’
>>>
4.4 Para entender Python es necesario saber leer y escribir 81
>>>
>>> archivo = open("texto.dat", "r")
>>> archivo.readline()
’Este es un importantísimo\n’
>>> archivo.readline()
’archivo de texto, que contiene\n’
>>> archivo.readline()
’tanto palabras como números.\n’
>>> archivo.readline()
’Aquí van los números:\n’
>>> archivo.readline()
’10 20 30 40 50 60 70 80 90 100\n’
>>> archivo.readline()
’Esta oracion no indica el fin del archivo.’
>>> archivo.readline()
’’
>>> archivo.readline()
’’
>>> archivo.readline()
’’
>>>
Como era de esperar, cada vez que se ejecuta la sentencia readline() se lee un renglón
completo. En el último renglón no aparece el salto de línea ya que el archivo original
(texto.dat) tampoco lo tiene, pero lo interesante viene después de la última línea. Con
cada nueva aplicación de la sentencia readline() hallamos siempre el mismo resultado,
una cadena vacía (¡Cuidado!, no es un espacio en blanco). Esto es lo que verdaderamente
indica que se ha llegado al final del archivo. A continuación en vez de usar la forma
iterativa, vamos a crear un programa equivalente donde estamos obligados a usar la
función print(), y de paso ilustraremos una característica que a veces causa un poco de
confusión.
archivo = open("texto.dat", "r")
print(archivo.readline())
print(archivo.readline())
print(archivo.readline())
print(archivo.readline())
print(archivo.readline())
print(archivo.readline())
print(archivo.readline())
print(archivo.readline())
print(archivo.readline())
82 El colorido mundo de Python
Este es un importantísimo
10 20 30 40 50 60 70 80 90 100
msuarez@linux-rf6d:~/Python/programas>
La función print() toma las cadenas vacías cuando se llega al final del archivo y
por supuesto no imprime nada, de ahí los últimos renglones en blanco. Pero, ¿por qué
aparece un renglón vacío intercalado entre las oraciones? La respuesta es debido a que
print() automáticamente coloca al final un salto de línea, pero la línea leída por readline()
ya tiene incorporado un salto de línea, por lo tanto ahora tenemos dos saltos de línea, y
entonces se imprime un renglón en blanco. Por supuesto que hay una forma de evitar
este comportamiento, esto ya se explicó en la sección 3.9, ahora veremos como leer
línea a línea usando un ciclo. Si bien el ciclo while se puede usar para esta tarea (ver
ejercicio ) la forma más eficiente de leer un archivo es con el ciclo for...in. Los archivos
abiertos con open() se convierten en objetos iterables, y de esa manera podemos iterar
sobre las lineas para leer todo el archivo renglón a renglón.
archivo = open("texto.dat", "r")
for linea in archivo:
print(linea)
observemos que no es necesario usar una función de lectura, simplemente imprimimos
la linea iterada y eso es todo. La salida por pantalla de este programa se muestra a
continuación.
Este es un importantísimo
10 20 30 40 50 60 70 80 90 100
4.4 Para entender Python es necesario saber leer y escribir 83
La iteración termina en el momento en que el ciclo llega al final del archivo cuando
se obtiene una cadena vacía. Pero todavía tenemos el problema del rengĺón intercalado.
Para evitarlo se le tiene que ordenar a print() que no incluya al salto de línea al final de
la cadena de caracteres, como ya se ha visto esto se logra utilizando
archivo = open("texto.dat", "r")
for linea in archivo:
print(linea, end=")
y la salida en pantalla será:
Este es un importantísimo
archivo de texto, que contiene
tanto palabras como números.
Aquí van los números:
10 20 30 40 50 60 70 80 90 100
Esta oración no indica el fin del archivo.msuarez@linux-rf6d:~>
Un pequeño mensaje
de dos renglones
como vemos la función write() se comporta muy parecido a print() solo que write() se
utiliza con archivos. Siempre hay que tener en cuenta el salto de línea, veamos que
archi_sal = open("Salida.dat", "w")
archi_sal.write("Un pequeño mensaje")
archi_sal.write("de dos renglones")
escribe en el archivo de salida
Muchas veces lo que necesitamos escribir son datos, estos pueden ser números
enteros o punto flotante o tal vez estamos interesados en escribirlos en notación científica.
Para ello las funciones print() y write() soportan salida formateada. La escritura con
formato para un número entero es {:ad}.format(m) donde “a” el ancho en caracteres, “d”
indica que el número ha de ser un entero y “m” es el número, por ejemplo:
si escribimos {:10d} se reservan 10 caracteres, pero el número cinco solo tiene un dígito,
por lo tanto los otros nueve caracteres se rellenan con espacios en blanco. Si en vez de
espacios en blanco queremos ceros simplemente hacemos.
Una forma mas elegante de reservar espacio es con el tabulador \t que es ideal para hacer
tablas.
>>> a = 2
>>> b = 3
>>> print(Dos números enteros\t{:1d}\t{:1d}".format(a+b,10*b))
Dos números enteros 5 30
observemos que a los números se les dio espacio para un solo caracter, pero 30 tiene
dos dígitos y por lo tanto se requieren dos caracteres, a pesar de eso el resultado es el
correcto.
Para un número punto flotante la forma general es {:a.nf}.format(m), como antes “a”
es el ancho en el cual se incluye el punto decimal, “n” es la cantidad de dígitos decimales
y “m” el el número.
Esta manera de escribir la salida formateada está disponible desde Python 2.7 en
adelante, antes se usaba una forma muy parecida a la función printf() de C/C++. Python
3.x todavía acepta esta vieja forma de salida formateada (al estilo C) que aún es muy
popular, el ejemplo anterior se vería de la siguiente manera.
La función print() y la write() actúan de forma idéntica, solo que la primera imprime
en pantalla, mientras la segunda escribe en un archivo. Por último para escribir al final
de un archivo ya existente se usa:
archi_sal = open("texto.dat", "a")
archi_sal.write("Hola que tal.")
archi_sal.close()
Lo nuevo en el código anterior es la función close() como su nombre lo indica es la
encargada de cerrar el archivo abierto con open(). No es necesario hacerlo ya que Python
hace esta tarea por nosotros de forma automática una vez que el programa finaliza, pero
es muy buena práctica de programación que una vez que el archivo abierto no se utilice
mas, se cierre. Esto evita errores en programas largos y complejos y los hace más claros.
Veamos como quedó el archivo texto.dat después de correr el código anterior.
Este es un importantísimo
archivo de texto, que contiene
tanto palabras como números.
Aquí van los números:
10 20 30 40 50 60 70 80 90 100
Esta oracion no indica el fin del archivo.Hola que tal.
en Python todos son objetos, y las cadenas de caracteres no son la excepción, uno de sus
métodos es la función split() . Esta función toma a la cadena y la separa por los espacios
en blanco para crear una lista lista = cad.split(). En este caso la lista creada será [’10’,
’20’, ’30’, ’40’, ’50’, ’60’, ’70’, ’80’, ’90’, ’100’]. Como las listas son objetos iterables
utilizaremos un ciclo for...in para realizar el promedio.
suma = 0.0
for num in lista:
suma += float(num)
prom = suma/10
La función split() no convierte automáticamente los caracteres a números, por lo
tanto esto lo debemos hacer explicitamente con float(num). El siguente paso es guardar
el resultado en el archivo Salida.dat, el programa completo es siguiente:.
entr = open("texto.dat", "r")
entr.readline()
entr.readline()
entr.readline()
entr.readline()
cad = entr.readline()
lista = cad.split()
entr.close()
suma = 0.0
for num in lista:
suma += float(num)
prom = suma/10
sal = open("Salida.dat", "w")
sal.write("El promedio es: " + str(prom))
sal.close()
x y1 y2 y3 y4 y5
0.05 3.4 1.3 1.8 0.2 4.6
0.10 7.4 11.7 11.5 6.9 3.3
0.15 4.9 8.6 11.5 4.5 5.8
0.20 8.2 17.5 10.7 12.8 13.2
0.25 13.8 17.3 15.3 17.8 16.6
4.5 Hagamos un experimento 87
En la taba anterior x representa la variable indepandiente, mientras y1, y2, y3, y4, y5
son los resultados obtenidos depues de realizar cinco veces el mismo experimento. Para
llevar a cabo nuestro proposito correremos el siguiente programa:
#!/usr/bin/env python3.3
’’’
Aquí debe ir una documentación larga donde
explicitamente se diga lo que hace el programa.
’’’
# se importan los módulos necesarios
import matplotlib.pyplot as plt
x = []
y = []
arch.readline()
for linea in arch:
cad = linea.split()
x.append( float(cad[0]) ) #eje x
suma = 0.0
i = 1
#ciclo while con el resto de los datos
while i<6:
suma += float(cad[i])
i += 1
prom = suma/5.0 #cálculo del promedio
y.append( prom ) #construyo los datos de y
#graficamos y vs. x
# etiquetas para los ejes
plt.xlabel("X (unidades de x)")
plt.ylabel("Y (unidades de y)")
#rango en los ejes
plt.xlim(0, 0.45)
plt.ylim(0, 30)
#grafica domde se muestran las barras de error
plt.errorbar(x, y, xerr=0.01, yerr=0.5, fmt=’bx’)
plt.show()
88 El colorido mundo de Python
30
25
20
Y (unidades de y)
15
10
0
0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35 0.40 0.45
X (unidades de x)
Figura 4.4
4.6 Ejercicios
Ejercicio 4.1 Reescriba el programa del ejercicio 3.3 agregándole comentarios y
pidiéndole al usuario los datos necesarios.
Ejercicio 4.2 Grafique una función cualquiera en el intervalo [0,50] de tal manera
que las curvas contengan 10 puntos, 50 puntos, 100 puntos, 200 puntos y 300 puntos.
Observe la diferencias en la gráfica.
Ejercicio 4.3 Escoja una función cualquiera de uso frecuente ( seno, coseno, expo-
nencial, etc). Desarrolle la función en series de Taylor, encuentre la forma matemática
del término genérico. Realice un programa que grafique la función original y luego
haciendo uso del término genérico en un ciclo, grafique la serie de Taylor.
5 — El IGU no es una fruta
El IGU es una sigla que significa Interfaz Gráfica de Usuario, muchas veces se utiliza
el término en ingles que es GUI, pero en castellano es mas guay. Con Python tenemos
muchas formas de hacer IGU, una de las más fáciles es utilizando el módulo Tkinter.
Nuestro propósito no es realizar una completa y hermosísima IGU, sino mas bien dar
una introducción básica y utilizar el “lienzo” para dibujar y visualizar procesos físicos.
#!/usr/bin/env python3.3
’’’
Crea una pequeña ventana con botones
’’’
mamaVentana = Tk()
mamaVentana.mainloop()
La mayoría de las sentencias del programa anterior ya se conocen, las nuevas son las
que crean los botones, para ello se utiliza la función Button. Los argumentos utilizados
para esta función son text cuya función es especificar el texto que aparecerá en el
botón, fg que especifica el tipo de color del texto, y finalmente command que es lo
que Tkinter hace cuando hacemos click el botón. En este caso el botoncito izquierdo
botoncitoI destruye la ventana y el derecho botoncitoD ejecuta una función que consiste
en imprimir un mensaje en el terminal. Por último la función .pack() es la encargada de
posicionar el botón en la ventana. En los ejemplos anteriores la ventana tiene un tamaño
mínimo ya aparece posicionada en la pantalla en un lugar donde Tkinter decide que es
apropiado, generalmente un lugar donde no halla una ventana ubicada previamente. Este
comportamiento se puede cambiar con los comandos:
# Le da color al fondo
mamaVentana.config(bg="black")
’’’
Ventana con un lienzo azul.
’’’
#Creamos el lienzo
lienzo = Canvas(bg="blue", height=250, width=300)
lienzo.pack()
Ventana.mainloop()
El proximo paso es colocarle a la ventana dos botones adicionales, uno para dibujar
un triángulo y el otro para el cuadrado. La instrucción para dibujar en el lienzo un
rectángulo es:
polígonos con un número arbitrario de vértices. En el ejemplo se han puesto los vértices
entre paréntesis para que resulte mas claro, pero esto no es obligatorio. El posible
resultado final es:
’’’
Ventana con un lienzo azul y figuras geomérticas.
’’’
#Creamos al lienzo
lienzo = Canvas(bg="blue", height=250, width=300)
lienzo.pack()
Ventana.mainloop()
En este programa solo debemos hacer “click” en el boton triángulo o rectángulo para
que las figuras se dibujen, y esto es independiente del orden en que se haga. El resultado
se aprecia en la figura 5.2
Ya que sabemos como dibujar triángulos ahora aprenderemos a no dibujar un triángu-
lo. Esto requiere una explicación concienzuda y detallada que yo no pienso ofrecer, solo
diré que los triángulos al igual que cualquier figura plana tienen solo dos dimensiones.
Matemáticamente esto se puede expresar de la siguiente manera, supongamos que la
letra L representa la dimensión espacial, es decir la longitud, entonces el área de una
figura plana como el triángulo es proporcional al cuadrado de la longitud, A ∝ L2 . Hasta
94 El IGU no es una fruta
hace poco1 , solo conocíamos objetos geométricos con un número entero de dimensiones,
las curvas tienen una dimensión (L), las figuras planas tienen dos dimensiones (L2 ), las
pirámides, cubos, y demás poliedros son cuerpos geométricos con tres dimensiones
(L3 ), a algunos matemáticos les encanta hablar de cosas como el hipercubo que seria
una especie de cubo en cuatro dimensiones (L4 ), etc. Con la ayuda de las matemáticas
podemos utilizar objetos geométricos con un número arbitrario de dimensiones, aunque
seamos totalmente incapaces de representar en nuestra cabeza ese tipo de artefactos,
como por ejemplo un cubo de diez dimensiones.
No fue sinó hasta que un señor llamado Mandelbrot descubrió allá por la década
de los 70 del siglo pasado (suena muy lejano, pero para el mundo de la geometría esto
fue apenas ayer) que había objetos geométricos que tienen una dimensión no entera. A
estos objetos les llamó fractales. Para entender lo que es un fractal, lo mejor es empezar
por ver uno. En la figura 5.3 se aprecia como se construye uno de los fractales mas
famosos, el triángulo de Sierpinski (parece pero no es un triángulo) llamado así en
honor al genial matemático Polaco que lo descubrió a principios del siglo XX. En dicha
figura se observa una de las maneras en las cuales se puede construir. Se comienza por
un triángulo equilátero de color negro, luego a este triángulo se le quita un triángulo
invertido justo del centro, tal como se ve en la figura. Ahora pareciera que tenemos tres
triángulos negros mas pequeños. La tercera etapa consiste en repetir el proceso con cada
uno de estos tres triángulos y así se obtiene el tercer dibujo de la figura 5.3, en la cual se
dibujan igualmente la cuarta y quinta etapa. El triángulo de Sierpinski queda terminado
después de repetir el proceso anterior infinitas veces.
Este tipo de figuras planas no llena el plano en el cual está dibujado, de hecho
tiene tantos “huecos” que está casi “vacio”, y por ende no tiene dimensión igula a 2.
Encontrar la dimensión a un objeto fractal se escapa del propósito de este libro, pero
basta decir que hay varias definiciones de dimensión fractal. La dimensión fractal de
1 Si tomamos en cuenta la larga historia de las matemáticas
5.2 Sierpinski no es un triángulo 95
3
Hausdorff-Besicovitch para el triángulo de Sierpinski es DHB = ln ln 2 . en general se puede
decir que un obgeto es un fractal si cumple con las siguientes caracteristicas.
Autosimilitud. Esto significa que si hacemos un cambio de escala como una
ampliación o una reducción, el objeto se sigue viendo igual.
Dimensión fractal. Es decir su dimensión no es un número entero.
Se puede definir recursivamente
Los fractales no se restringen al ámbito de las matemáticas, Tambien existen una
cantidad enorme de objetos reales que se pueden considerar fractales, claro la propiedad
de autosimilitud tiene un límite ya que la naturaleza no se lleva bien con los infinitos.
Ejemplo de fractales en la naturaleza son, las nubes, los bronquios, los árboles, los
helechos, el romanescu2 , las cuencas hidrográficas, los copos se nieve, las descargas
electricas, y un gran etc.
Lógicamente lo que sigue a continuación es implementar el triángulo de Sierpinski
con la ayuda de Python. La forma en que lo haremos es diferente de la mostrada en la
figura 5.3, utilizaremos un proceso iterativo. Es muy curioso como este tipo de reglas
muy sencillas ejecutadas de forma iterativa producen fractales, el procedimiento es el
siguiente.
1. Se fijan los tres vértices del triangulo.
2. Escojamos un punto cualquiera del plano, haciendo uso de nuestra prodigiosa
imaginación lo llamaremos P0 .
3. Se escoge aleatoriamente alguno de los tres vértices.
4. Se halla el punto medio de la recta que une el vértice escogido con el punto P0 . A
este punto lo llamaremos P1 y lo dibujamos en el lienzo.
5. Actualizamos P0 = P1 y repetimos el proceso iterativamente a partir de item 2.
Nótese que si nuestro punto inicial está muy lejos del interior del triángulo, los
primeros puntos no no son validos. Solo sirven los puntos que siguen el procedimiento
anterior que son internos al triángulo. Adicionalmente aunque esté dentro del triángulo,
el primer punto como es aleatorio, nada nos garantiza que sea un punto válido, podría por
ejemplo, caer cerca del centro del triángulo donde no hay ningún punto. Afortunadamente
el proceso converge rápidamente y en pocos pasos los puntos generados son válidos. Sin
embargo para que no se vea feo, los primeros puntos deben ser desechados, por lo tanto
debemos hacer dos ciclos. En el primero de ellos generamos puntos que no dibujamos
(unos diez son suficientes) y el segundo ciclo será el que utilizamos para dibujar. El
programa es el siguiente:
"""
Dibuja en la pantalla el triángulo de Sierpiński
"""
import numpy as np
#Llamo al módulo aleatorio
import random as rnd
#Llamo al módulo gráfico
import tkinter as Tki
#creo el lienzo
w = 600 #ancho de la ventana
hh = 500 #altura de la ventana
lzo = Tki.Canvas(window, width=w, height=hh, background="white")
lzo.pack()
#primer punto
P0 = (50,450)
#número de vértices
sec =(1,2,3)
#Fase transitoria
for i in range (10):
#genera un número aleatorio de la secuencia sec
n = rnd.choice(sec)
if n == 1:
D = A
elif n == 2:
D = B
else:
D = C
P1 = (P0 + D) * 0.5
P0 = P1
if n == 1:
D = A
color = "green"
elif n == 2:
D = B
color = "blue"
else:
D = C
color = "red"
P1 = (P0 + D) * 0.5
x,y = P1
lzo.create_line(x, y, x+1, y+1, fill = color)
lzo.update()
P0 = P1
print("fin")
#necesario para que aparezca la ventana
window.mainloop()
Analizaremos brevemente el programa anterior. Lo primero fue importar los módulos,
obsérvese que a diferencia de los ejemplos anteriores, el módulo tkinter se importó
utilizando un alias (se importa como Tki) que es una práctica muy utilizada. Además se
importó un módulo nuevo llamado random que se utiliza para generar números aleatorios.
Luego se crea la ventana y el lienzo. Posteriormente se definen los tres vértices del
triángulo. En este programa hemos escogido un valor fijo para el punto inicial P0, pero
bien pudo haber sido aleatorio, eso no es importante. A continuación implementamos
una corta fase transitoria (apenas diez puntos) que consiste en primer lugar en obtener
aleatoriamente un número de la secuencia sec que consta de tres números (1, 2, 3), esto
es equivalente a lanzar un dado de tres lados 3 . Luego haciendo uso adecuado del if, del
elif, y del else seleccionamos el vértice correspondiente para mas tarde hallar el punto
medio con P1 = (P0 + D) * 0.5. Observemos que P0, P1 y D son listas con dos elementos
cada uno que representan las coordenadas x y y de cada punto. Finalmente se actualiza
el valor de P0 para seguir con el proceso iterativo. A continuación sigue el código donde
se dibuja el triángulo propiamente dicho con unos 90.000 puntos. Es muy similar al
anterior solo que hemos agregado color dependiendo del vértice seleccionado. En x,y
= P1 se recuperan las coordenadas del punto para poder dibujarlo con la instrucción
lzo.create_line(x, y, x+1, y+1, fill = color), donde para dibujar un punto simplemente
hemos creado una linea de un pixel de largo, es decir hemos dibujado un pixel y lo hemos
rellenado del color anteriormente seleccionado. La instrucción lzo.update() actualiza
el dibujo cada vez que se dibuja un pixel, esto hace el proceso muchísimo mas lento,
pero así tenemos el placer de ver aparecer el triángulo de Sierpinski delante de nuestros
ojos. Como el programa se tarda un poquito en dibujar los 90.000 puntos, finalmente
imprimimos el la pantalla la palabra fin para estar seguros de que el programa al fin a
terminado. El resultado final se ve en la figura 5.4
3 Ciertamentelos dados de tres lados no existen en el universo conocido, pero si existieran la forma de
simularlo con Python sería precisamente esa.
98 El IGU no es una fruta
Artículos
[PG07] Fernando Pérez y Brian E. Granger. «IPython: a System for Interactive
Scientific Computing». En: Computing in Science and Engineering 9.3
(mayo de 2007), páginas 21-29. ISSN: 1521-9615. DOI: 10.1109/MCSE.
2007.53. URL: http://ipython.org (véase página 51).
Libros
[Bea09] David M Beazley. Python Essential Reference. Pearson Education, 2009
(véase página 51).
[Ber11] Herman J. C. Berendsen. A Student’s Guide to Data and Error Analysis.
Editado por Cambridge University Press. 2011 (véase página 17).
[Cha13] Bhaskar Chaudhary. Tkinter GUI Application Development. Packt Publis-
hing Ltd, 2013 (véase página 92).
[Dal+09] Darren Dale y col. Matplotlib. 2009 (véase página 75).
[Dev14] Alexandre Devert. matplotlib Plotting Cookbook. 4 Packt Publishing, 2014
(véase página 75).
[GRA00] JOHN E. GRAYSON. Python and Tkinter Programming. Manning Publica-
tions Co., 2000 (véase página 92).
[Gre06] Douglas Gregory. Classical Mechanics. Cambridge University Press, 2006
(véase página 60).
[HRW08] Holliday, Resnick y Walker. Fundamentals of Physics. John Wiley y Sons,
Inc., 2008 (véase páginas 19, 33).
[LPB08] Rubin H. Landau, Manuel José Paez y Cristian C. Bordeianu. A Survey of
Computational Physics. PRINCETON UNIVERSITY PRESS, 2008 (véase
páginas 15, 17).
102 Palabras reservadas
Páginas Web
[blo] blogspot. Tutorial TKInter Python (GUI). URL: http://gmendezm.blogspot.
com / 2012 / 12 / tutorial - tkinter - python - gui . html (véase pági-
na 92).
[Cou] Cambridge Course. Numerical Programming in Python. URL: http://www.
ucs.cam.ac.uk/docs/course-notes/unix-courses/NumericalPython/
(véase página 20).
[FSF] FSF. Free Software Foundation. Free Software Foundation. URL : http:
//www.fsf.org/ (véase página 7).
[GNU] GNU. Various Licenses and Comments about Them. GNU. URL: http:
//www.gnu.org/licenses/license-list.html (véase página 7).
[GPL] GPL. GNU General Public License. URL: http : / / www . gnu . org /
licenses/gpl.html (véase página 7).
[OP] OP. The Open Source Initiative. URL : http://www.opensource.org/
(véase página 7).
[Pyt] Python. Python Programming Language Official Website. URL: http://
www.python.org/ (véase página 8).
[Ram] Chet Ramey. Bash. URL: http://tiswww.case.edu/php/chet/bash/
bashtop.html (véase página 65).
[Tea] The IPython Development Team. IPython Documentation. URL : http :
//ipython.org/documentation.html (véase página 51).
103
ε − mach, 21 for...in, 58
π, 32 while, 59
*=, 43 epsilon de la máquina, 21
+=, 43 error
-=, 43 de desborde, 17
/=, 43 de redondeo, 18
<, 39 estructuras de control, 56
<=, 39
==, 39 False, 38
>, 38 Fibonacci, sucesión de, 43
>=, 39 flujo, control de, 56
for, 53
ASCII, 66 función
abs(), 30
bash, 65 append(), 49
binario, 13 cos(), 31
break, 57 degrees(), 31
bucles, 42 dir(), 31
find(), 47
cadenas de caracteres, 34
float(), 17, 29
chmod, 70
input(), 73
clase, 47
insert(), 49
constante
int(), 17
pi, 32
isinstance(), 24
continue, 59
len(), 37
conversión implícita, 16
open(), 89–99
diagrama de flujo, 57 pop(), 49
print(), 36, 40, 112
elif, 42 radians(), 31
else, 39 read(), 100
else readline(), 102
106 ÍNDICE ALFABÉTICO
número
complejo, 21
decimal, 25
entero, 15
hexadecimal, 25
octal, 25