Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
1.1 Introducción
1.2 Imprimir
1.2.1 Imprimir Texto
\t Tabulador
Este
es
mi
ejemplo.
1.4 Comentarios
Los comentarios son importantes (incluso si los ignora el
ordenador)
'''
Esto es
un
comentario
de
múltiples
líneas. Nada
de lo que esté
se ejecutará.
print("Allí")
'''
print("Hecho")
La mayoría de los programadores profesionales de
Python solo usan este tipo de comentarios multilínea en
los llamados docstrings. Los docstrings permiten escribir
la documentación a lo largo del código y luego extraerla
automáticamente como documentación impresa,
páginas web, y en Entornos de Desarrollo Integrados
(IDEs). Para los comentarios genéricos es mejor usar el
símbolo #.
1
2
3
# Crea la variable x
4 # Almacena el valor de 10 en ella. Variables
x = 10 :
5
# Imprime el valor almacenado en x. x=
6 Salida:
print(x)
7 # Imprime la letra x, pero no el valor contenido en x
10
8 print("x")
x
# Imprime "x= 10"
9 x= 10
print("x=", x)
10
11
12
Inicio
x =x +1
print(x)
1 x =5
2 print(x) # Imprime 5
3 x =x +1
print(x) # Imprime 6
4
x +1
print(x)
1.6 Variables
Las variables empiezan con una letra minúscula.
X =5
print(x)
ds9 %correcto X
1.7 Operadores
Para operaciones matemáticas más complejas contamos
con los operadores matemáticos comunes, junto con
otros no tan comunes:
+ suma a=3
operador operación ejemplo de ecuación ejem
- resta a=3
* multiplicación a=3
/ división a = 10
** potencia a=2
Vídeo: Operadores
x = 5y
x = 5(3/2)
x =5*y
x = 5 * (3 / 2)
1 x=5*(3/2)
2 x =5*( 3/2)
x =5 *( 3/ 2)
3
# del programa.
x = sin(0) + cos(0)
1.10 Cálculo de Ecuaciones
Personales
Un programa puede usar Python para calcular el
consumo por unidad distancia de un coche que recorrió
294 millas con 10.5 galones de gasolina.
m = 294 / 10.5
print(m)
g = 10.5
print(m2)
galones_usados = 10.5
print(mpg)
Con esto, incluso una persona que no sea
programadora, puede ver el programa y hacerse una
idea de qué es lo que hace. Otro ejemplo de un uso
correcto de los nombres para una variable, frente a uno
malo, sería:
# Difícil de entender
ir = 0.12
b = 12123.34
i = ir * b
# Fácil de entender
tasa_interes = 0.12
balance_cuenta = 12123.34
Figure
1.4: Error ejecutando programa KPL
x = millas_recorridas + galones_usados
print("Suma de m + g:", x)
1
2
3
4
Variable
5 # Sample Python/Pygame Programs
s:
# Simpson College Computer Science
6 millasRec
# http://programarcadegames.com/ orridas=
7 galonesUs
# http://simpson.edu/computer-science/
ados=
8 # Vídeo explicativo: http://youtu.be/JK5ht5_m6Mk mpg=
9 # Calcular las millas por galon Salida:
print("Este programa calcula mpg.")
10 Este prog
# Obtener del usuario las millas recorridas rama calc
11 ula las m
millas_recorridas = input("Introduce las millas recorridas: ")
illas por
12 # Convertimos el texto introducido a galón.
21
22
23
24
25
Inicio
1
2
3
# Sample Python/Pygame Programs
4
# Simpson College Computer Science
5 # http://programarcadegames.com/
6 # http://simpson.edu/computer-science/
v = float(v_string)
11
e = 0.5 * m * v * v
12 print("El objeto tiene " + str(e) + " joules de energía.")
13
14
15
millas_recorridas = float(millas_recorridas)
1.11 Repaso
1.11.1 Test
1.11.2 Ejercicios
1.11.3 Taller
0 0 0
1 1 1
10 2 2
11 3 3
100 4 4
101 5 5
110 6 6
111 7 7
1000 8 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
1 0000 16 10
1 0001 17 11
Vídeo: Sistemas decimal, binario, y hexadecimal
2.2 Repaso
2.2.1 Test
2.2.2 Ejercicios
2.2.3 Taller
Variables:
# Comparaciones básicas
a=4
if a < b: b=5
print ("a es menor que b") Resultado:
a es menor que b
if a > b:
Hecho
print ("a es mayor que b")
print("Hecho")
Inicio
if a <= b:
print ("a es menor o igual que b")
if a >= b:
print ("a es mayor o igual que b")
# Igual
if a == b:
print ("a es igual que b")
# Distinto
if a != b:
print ("a y b no son iguales")
3.2 Indentación
La indentación importa. Cada línea indentada debajo de
la sentencia if solo se ejecutará si la sentencia if es cierta:
if a == 1:
print("Si a es uno, esto se imprimirá.")
print("Lo mismo que esto.")
print("Y que esto.")
if a == 1:
print("Indentado dos espacios.")
print("Indentado cuatro. Esto generará un error.")
print("El ordenador te pedirá que te decidas.")
# Y
if a < b y a < c:
print ("a es menor que b y c")
# O no exclusiva
if a < b or a < c:
print ("a es menor que b o c (o ambos)")
Nos repetimos.
a = True
b = False
if a and b:
print ("a y b son ambos ciertos")
a = 3
b = 3
# La siguiente línea parece extraña, pero es correcta.
# c será cierta o falsa, dependiendo si
# a y b son iguales.
c = a == b
# Imprime el valor de c, en este caso True
print(c)
if 1:
print ("1")
if "A":
print ("A")
El siguiente código no imprimirá nada, debido a que el
valor en la sentencia if es cero y es tratado como False.
Cualquier otro valor distinto a cero es considerado
como True.
if 0:
print ("Cero")
a = "c"
if a == "B" or "b":
print ("a es igual que b. A lo mejor.")
# Esto sí funciona
if nombre_usuario == "Paul" or nombre_usuario == "Mary":
a = 4
b = 5
c = 6
# Comparaciones básicas
if a < b:
print ("a es menor que b")
if a > b:
print ("a es mayor que b")
if a <= b:
print ("a es menor o igual a b")
if a >= b:
print ("a es mayor o igual a b")
# Not equal
if a != b:
print ("a y b no son iguales")
# And
if a < b and a < c:
print ("a es menor que b y c")
# Non-exclusive or
if a < b or a < c:
print ("a es menor que a o b (o ambos)")
if not(a):
print ("a es falso")
a = True
b = False
if a and b:
print ("a y b, ambos son ciertos")
a = 3
b = 3
c = a == b
print(c)
3.8 Repaso
3.8.1 Test
3.8.2 Ejercicios
3.8.3 Taller
¿Pero espera, qué tiene que ver todo esto con gráficos y
videojuegos? Pues un montón. Cada frame
(fotograma) que el juego muestra, es uno, de una serie a
través del bucle. Probablemente estés habituado a las
estadísticas de frame-per-second (FPS) que muestran los
juegos. El FPS representa el número de veces que el
ordenador actualiza la pantalla por cada segundo. A
mayor tasa de refresco, más fluido es el juego. De todas
formas, una tasa de FPS superior a 60, es más rápida de
lo que la mayoría de monitores puede actualizar, por lo
que no tiene mucho sentido sobrepasar ese valor. La
Figura 4.1 muestra el juego Eve Online y una gráfica
donde se ve cuántos fotogramas por segundo (frames
per second) es capaz de resolver el ordenador.
Figure 4.1: FPS en videojuegos
Salida:
Salida:
Por favor,
for i in range(5):
Por favor,
print ("Por favor,")
Por favor,
print ("¿Puedo ir al centro comercial?")
Por favor,
Inicio Por favor,
¿Puedo ir al centro comercial
?
Salida:
for i in range(5):
print ("Por favor,") Por favor,
print ("¿Puedo ir al centro comercial?" ¿Puedo ir al centro comercial
) ?
Por favor,
Inicio
¿Puedo ir al centro comercial
?
Por favor,
¿Puedo ir al centro comercial
?
Por favor,
¿Puedo ir al centro comercial
?
Por favor,
¿Puedo ir al centro comercial
?
Salida:
0
1
2
for i in range(10):
3
print(i)
4
5
Inicio
6
7
8
9
Un programa no está obligado a usar una variable
llamada i, podría ser cualquier otra cosa. Por ejemplo,
una programadora podría usar linea_numero si ella estuviera
procesando un archivo de texto.
Salida:
1
for i in range(1,11): 2
print(i) 3
4
5
6
7
8
9
10
print(i) 4
6
for i in range(5): 8
print ((i + 1) * 2) 10
2
4
6
8
10
Salida:
10
9
for i in range(10, 0, -1):
8
print(i)
7
6
5
4
3
2
1
for i in [2,6,4,2,4,6,7,4]:
print(i)
Esto imprimirá:
2
6
4
2
4
6
7
4
print("Hecho")
total = 0
for i in range(5):
nuevo_numero = int(input("Introduce un número: " ))
total += nuevo_numero
print("El total es: ",total)
total = 0
for i in range(5):
nuevo_numero = int(input( "Introduce un número: "))
if nuevo_numero == 0:
total += 1
print("Has introducido ",total," ceros")
Un programador que comprenda los bucles
anidados for y los totales acumulados, debería ser capaz
de predecir el resultado para el código siguiente.
# ¿Cuál es el valor de a?
a = 0
for i in range(10):
a=a+1
print(a)
# ¿Cuál es el valor de a?
a = 0
for i in range(10):
a = a + 1
for j in range(10):
a = a + 1
print(a)
# ¿Cuál es el valor de a?
a = 0
for i in range(10):
a = a + 1
for j in range(10):
a = a + 1
print(a)
for i in range(10):
print(i + 1)
for i in range(5):
print((i + 1) * 2)
# ¿Cuál es el valor de a?
a = 0
for i in range(10):
a = a + 1
print(a)
# ¿Cuál es el valor de a?
a = 0
for i in range(10):
a = a + 1
for j in range(10):
a = a + 1
print(a)
# ¿Cuál es el valor de a?
a = 0
for i in range(10):
a = a + 1
for j in range(10):
a = a + 1
print(a)
for i in range(10):
print(i)
i = 0
while i < 10:
print(i)
i = i + 1
while range(10):
print(i)
i = i + 1
Con esto:
i += 1
i = 0
while i < 10:
print(i)
i += 1
i *= 2
Es lo mismo que:
i = i * 2
i = 1
while i <= 2 ** 32:
print(i)
i *= 2
4.3.2 Iterando Hasta Que El Usuario Decide
Salir
salir = "n"
while salir == "n":
salir = input ("¿Quieres salir? ")
hecho = False
while not hecho:
salir = input ("¿Quieres salir? ")
if salir == "y" :
hecho = True;
valor = 0
incremento = 0.5
while valor < 0.999:
valor += incremento
incremento *= 0.5
print(valor)
i = 10
while i == 0:
print (i)
i -= 1
i = 1
while i < 10:
print (i)
4.4 Ejemplo de Bucles while
El siguiente programa trata de los diferentes usos de los
que hemos hablado sobre el bucle while.
# Es lo mismo que:
for i in range(10):
print(i)
# Una tarea muy habitual, es iterar hasta que el usuario realiza una peti
ción de salida.
salir = "n"
while salir == "n":
salir = input ("¿Quieres salir? ")
valor = 0
incremento = 0.5
while valor < 0.999:
valor += incremento
incremento *= 0.5
print(valor)
# ¿Qué es lo que está mal en este bucle que intenta contar hasta 10?
# ¿Qué sucederá cuando lo ejecutemos?
i = 1
while i < 10:
print (i)
import random
mi_numero = random.randrange(50)
mi_numero = random.randrange(100,201)
mi_numero = random.random()
Con algo de matemáticas básicas, este número puede ser
adaptado. Por ejemplo, el código siguiente genera un
número aleatorio real entre 10 y 15:
mi_numero = random.random() * 5 + 10
4.6 Repaso
4.6.1 Test
4.6.2 Ejercicios
4.6.3 Taller
pygame.init()
5.3 Colores
Los siguiente que necesitamos es añadir unas variables
que definan los colores que usaremos en nuestro
programa. Los colores se definen mediante una lista:
rojo, verde y azul (red, green, blue). ¿Has oído alguna
vez hablar de un monitor RGB? De ahí viene el término;
Red-Green-Blue. Con los antiguos monitores, podías
sentarte realmente cerca a él y construir los colores RGB
individuales. Al menos hasta que tu madre te llamara y
te dijera que no te sentaras demasiado cerca de la tele.
Esto es muy difícil hacerlo en la actualidad debido a la
alta resolución de los monitores.
NEGRO = ( 0, 0, 0)
ROJO = (255, 0, 0)
¿Por qué están en mayúsculas estas variables? Recuerda
el Capítulo 1 en que una variable que no cambia se
llama constante. No esperamos que el color negro vaya a
cambiar; es una constante. Destacamos las constantes
por mayúsculas. Si esperamos que un color vaya a
cambiar, algo así como color_cielo, el cual cambia a medida
que el sol se oculta, entonces, sería una variable en
minúsculas.
pantalla = pygame.display.set_mode(dimensiones)
reloj = pygame.time.Clock()
3
# -------- Bucle Principal del Programa -----------
4 while not hecho:
7 hecho = True # Esto que indica que hemos acabado y sale de este bucle
8
9
2 if evento.type == pygame.QUIT:
etc.):
▪ Usa una cadena de instrucciones if para
pantalla.fill(BLANCO)
Vídeo: Representando Líneas
pygame.display.flip()
4 http://programarcadegames.com/
http://simpson.edu/computer-science/
5
Vídeo explicativo: http://youtu.be/vRB_983kUMc
6 """
7 import pygame
dimensiones = [700,500]
15
pantalla = pygame.display.set_mode(dimensiones)
16
pygame.display.set_caption("Mi Primer juego en Informática")
17 #El bucle se ejecuta hasta que el usuario hace click sobre el botón de cierre.
18 hecho = False
pygame.display.flip()
30
# --- Limitamos a 60 fotogramas por segundo (frames per second)
31 reloj.tick(60)
1 # Dibuja en la pantalla una línea verde desde (0, 0) hasta (100, 100)
2 # y 5 píxeles de grosor.
1
# Dibuja sobre la pantalla varias líneas desde (0, 10) hasta (100, 110)
2 # de 5 píxeles de grosor usando un bucle while
3 desplazar_y = 0
1 # Dibuja sobre la pantalla varias líneas desde (0, 10) hasta (100, 110)
2 # de 5 píxeles de grosor usando un bucle for
1
2
3 for i in range(200):
radianes_x = i / 20
4
radianes_y = i / 6
5
x = int( 75 * math.sin(radianes_x)) + 200
6 y = int( 75 * math.cos(radianes_y)) + 200
8
9
1 # Dibuja un rectángulo.
1
# Representa un arco como parte de una elipse. Usamos radianes para determinar qué
2 # ángulo dibujar.
3 pygame.draw.arc(pantalla, VERDE, [100, 100, 250, 200], pi/2, pi, 2)
Representar un polígono
Por ejemplo:
Representar texto sobre la pantalla
1
2
3 # Selecciona la fuente. Fuente Default, tamaño 25 pt.
11
12
simple_graphics_demo.py
"""
1
Sencilla demo gráfica
2
Sample Python/Pygame Programs
3 Simpson College Computer Science
4 http://programarcadegames.com/
http://simpson.edu/computer-science/
5
"""
6
# Importamos una biblioteca de funciones llamada 'pygame'
7 import pygame
pygame.init()
9
# Definimos algunos colores
10 NEGRO = (0, 0, 0)
19 hecho = False
reloj = pygame.time.Clock()
20
# Iteramos en el bucle hasta que hecho == False
21 while not hecho:
pantalla.fill(BLANCO)
27
# Dibujamos sobre la pantalla una línea verde de 5 píxeles de ancho
28 # que vaya desde (0,0) hasta (100,100).
# Usando un bucle for, dibujamos sobre la pantalla varias líneas rojas de 5 píxeles
30
# de ancho, que vayan desde (0,10) hasta (100,110).
31
for desplazar_y in range(0, 100, 10):
32 pygame.draw.line(pantalla, ROJO, [0, 10 + desplazar_y], [100, 110 + desplazar_y], 5)
33 # Dibujamos un rectángulo
# El color es negro. Esto nos crea una imagen de las letras, pero no las coloca
45
# sobre la pantalla.
46 texto = fuente.render("Mi texto", True, NEGRO)
54 pygame.quit()
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
5.19 Repaso
5.19.1 Test
5.19.2 Ejercicios
5.19.3 Taller
print("Rosa")
Pulpo
Rosa
print("Rosa")
Esto imprimirá:
PulpoRosa
print("Rosa")
Y ahora:
Pulpo Rosa
i =1
Esto imprimirá:
0 1
Respuesta:
ProgramArcadeGames.com/chapters/06_back_to_l
ooping/problem_7_es.php
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8
0 1 2 3 4 5 6 7
0 1 2 3 4 5 6
0 1 2 3 4 5
0 1 2 3 4
0 1 2 3
0 1 2
0 1
0
0 0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9
0 2 4 6 8 10 12 14 16 18
0 3 6 9 12 15 18 21 24 27
0 4 8 12 16 20 24 28 32 36
0 5 10 15 20 25 30 35 40 45
0 6 12 18 24 30 36 42 48 54
0 7 14 21 28 35 42 49 56 63
0 8 16 24 32 40 48 56 64 72
0 9 18 27 36 45 54 63 72 81
1
1 2
1 2 3
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6
1 2 3 4 5 6 7
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 5 6 5 4 3 2 1
1 2 3 4 5 6 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
Por último añade espacios para obtener el resultado
final.
97. Construye:
98. 1
99. 1 2 1
100. 1 2 3 2 1
101. 1 2 3 4 3 2 1
102. 1 2 3 4 5 4 3 2 1
103. 1 2 3 4 5 6 5 4 3 2 1
104. 1 2 3 4 5 6 7 6 5 4 3 2 1
105. 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
106. 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
107. 1 2 3 4 5 6 7 8
108. 1 2 3 4 5 6 7
109. 1 2 3 4 5 6
110. 1 2 3 4 5
111. 1 2 3 4
112. 1 2 3
113. 1 2
114. 1
6.3 Repaso
6.3.1 Test
6.3.2 Ejercicios
6.3.3 Taller
>>> type(3)
<class 'int'>
type(3)
>>> type(3.145)
type(3.145)
<class 'float'>
type("¡Qué tal!")
type(True)
>>> type("Qué tal")
<class 'str'>
>>> type(True)
<class 'bool'>
type(x)
type([2, 3, 4, 5])
7.2 Trabajando Con Listas
Seguramente has creado listas de la compra, listas de lo
que queda por hacer y hasta quizás, listas de lo que
tienes que hacer antes de morir. ¿Pero cómo creas listas
en un ordenador?
>>> print(x)
[1, 2]
>>> print(x)
[22, 2]
>>> print(x)
(1, 2)
>>> print(x[0])
>>> x[0] = 22
x[0] = 22
>>>
Salida:
print(item) 10
50
60
Salida:
mi_lista = ["Cuchara", "Tenedor", "Cuchillo"]
print(item) Tenedor
Cuchillo
Las listas también pueden contener otras listas. Lo
siguiente itera a través de cada item de la lista principal,
pero no en las sublistas.
Salida:
mi_lista = [[2, 3], [4, 3], [6, 7]]
print(item) [4,3]
[6,7]
Salida:
for i in range(len(mi_lista)): 20
print(mi_lista[i]) 10
50
60
Este método es más complejo, pero también más
potente. Como estamos trabajando directamente con los
elementos de la lista, en lugar de hacerlo con una copia,
podemos modificarla. El bucle para-cada no permite
modificaciones de la lista original.
mi_lista.append(9) [2, 4, 5, 6]
print(mi_lista) [2, 4, 5, 6, 9]
Salida:
5 print(mi_lista)
# en el array:
5
for i in range(len(mi_lista)):
6 # Añade el elemento 0, después el 1, luego el 2, etc.
7 total_lista += mi_lista[i]
# Imprime el resultado
8
print(total_lista)
9
10
11
12
13
14
1
2
# Copia de un array a una suma
3
mi_lista = [5, 76, 8, 5, 3, 3, 56, 5, 23]
4 # La suma inicial debería ser cero
5 total_lista = 0
# Itera a través del array, copiando cada item del mismo en una
6
# variable llamada item.
7 for item in mi_lista:
total_lista += item
9
# Imprime el resultado
10
print(total_lista)
11
12
13
14
1
2
# Copia del array a modificar
3
mi_lista = [5, 76, 8, 5, 3, 3, 56, 5, 23]
4
# Itera desde 0 hasta el total del número de elementos
5 # en el array:
6 for i in range(len(mi_lista)):
10
11
10
11
# Acceso 0 - 5
7
print("x[:6] = ", x[:6])
8 # Acceso 6
# Acceso 6 - 8
10
print("x[6:9] = ", x[6:9])
11
12
13
14
15
16
17
18
1 a = "Hola"
2 b = "Qué tal"
c = "!"
3
print(a + b)
4
print(a + b + c)
5 print(3 * a)
6 print(a * 3)
print((a * 2) + (b * 2))
7
8
1
a = "Hola, qué tal"
2
print(len(a))
3
b = [3, 4, 5, 6, 76, 4, 3, 3]
4 print(len(b))
print (caracter)
for c in texto_llano:
40 ( 61 = 82 R 103 g
41 ) 62 > 83 S 104 h
42 * 63 ? 84 T 105 i
43 + 64 @ 85 U 106 j
44 , 65 A 86 V 107 k
45 - 66 B 87 W 108 l
46 . 67 C 88 X 109 m
47 / 68 D 89 Y 110 n
48 0 69 E 90 Z 111 o
49 1 70 F 91 [ 112 p
50 2 71 G 92 \ 113 q
51 3 72 H 93 ] 114 r
52 4 73 I 94 ^ 115 s
53 5 74 J 95 _ 116 t
54 6 75 K 96 ` 117 u
55 7 76 L 97 a 118 v
56 8 77 M 98 b 119 w
57 9 78 N 99 c 120 x
58 : 79 O 100 d 121 y
59 ; 80 P 101 e 122 z
60 < 81 Q 102 f
Para una mayor información sobre ASCII (el cual posee
los mismos valores que Unicode para el alfabeto
Occidental) ir a:
http://es.wikipedia.org/wiki/ASCII
for c in texto_llano:
for c in texto_llano:
x = ord(c)
x =x +1
c2 = chr(x)
1
"""
2 # Sample Python/Pygame Programs
3 # Simpson College Computer Science
# http://programarcadegames.com/
4
# http://simpson.edu/computer-science/
5
# Vídeo explicativo: http://youtu.be/sxFIxD8Gd3A
6 """
texto_cifrado = ""
8
for c in texto_plano:
9
x = ord(c)
10 x =x +1
11 c2 = chr(x)
texto_cifrado = texto_cifrado + c2
12
print(texto_cifrado)
13
14
15
16
17
18
simple_decryption.py
"""
1
# Sample Python/Pygame Programs
2 # Simpson College Computer Science
3 # http://programarcadegames.com/
# http://simpson.edu/computer-science/
4
# Vídeo explicativo: http://youtu.be/sxFIxD8Gd3A
5 """
6 texto_cifrado = "Ftup!ft!vob!qsvfcb/!BCD!bcd"
texto_plano= ""
7
for c in texto_cifrado:
8
x = ord(c)
9 x =x -1
10 c2 = chr(x)
texto_plano = texto_plano + c2
11
print(texto_plano)
12
13
14
15
16
17
18
x = {}
# Añadirle algo
x["fred"] = 2
x["scooby"] = 8
x["wilma"] = 1
print(x["fred"])
7.9 Repaso
7.9.1 Test
7.9.2 Ejercicios
7.9.3 Taller
rect_x += 1
rect_x = 50
hecho = True # Avisa de que hemos acabado, por lo que salimos de este bucle
pantalla.fill(NEGRO)
rect_x += 1
Para mover más rápido a la caja, en lugar de
incrementar rect_x por 1, hagámoslo por 5:
rect_x += 5
rect_x = 50
rect_y = 50
if evento.type == pygame.QUIT:
hecho = True
pantalla.fill(NEGRO)
# Dibuja el rectángulo
rect_x += 5
rect_y += 5
rect_x = 50
rect_y = 50
rect_cambio_x = 5
rect_cambio_y = 5
hecho = True # Avisa de que hemos acabado, por lo que salimos de este bucle
pantalla.fill(NEGRO)
# Dibuja el rectángulo
rect_x += rect_cambio_x
rect_y += rect_cambio_y
rect_cambio_y = rect_cambio_y * -1
rect_cambio_y = rect_cambio_y * -1
rect_cambio_x = rect_cambio_x * -1
8.2 Nevando
¿No tienes suficiente con animar un elemento? ¿Quieres
animar más objetos? ¿Qué tal animar cientos de ellos a
la vez? Aquí te mostramos como usar las técnicas de la
sección 8.1 para animar copos de nieve que caen.
8.2.1 Explicación del Código
Vídeo: Nevando
x = random.randrange(0, 400)
y = random.randrange(0, 400)
x = random.randrange(0, 400)
y = random.randrange(0, 400)
lista_nieve.append([x, y])
[10, 50],
[20, 18]]
Para imprimir la coordenada y en la posición 0,
seleccionamos primero la coordenada 0, y luego, el valor
de y en la posición 1. El código es el siguiente:
print(lista_nieve[0][1])
for i in range(len(lista_nieve)):
for i in range(len(lista_nieve)):
lista_nieve[i][1] += 1
Esto hace que la nieve caiga, pero una vez que llega al
final de la pantalla, nada nuevo aparece. Añadiendo el
código siguiente, volveremos a colocar nieve
aleatoriamente en la parte superior de la pantalla:
# Si el copo ha salido del fondo de la pantalla
y = random.randrange(-50, -10)
lista_nieve[i][1] = y
lista_nieve[i][0] = x
http://programarcadegames.com/
4
http://simpson.edu/computer-science/
5 Vídeo explicativo: http://youtu.be/Gkhz3FuhGoI
6 ”'
import pygame
8
import random
9 # Inicializamos el motor de juegos.
10 pygame.init()
NEGRO = [0, 0, 0]
11
BLANCO = [255, 255, 255]
12
# Establecemos el largo y ancho de la pantalla.
13 dimensiones = [400, 400]
pantalla = pygame.display.set_mode(dimensiones)
14
pygame.display.set_caption("Está Nevando")
15 # Creamos un array vacío
16 lista_nieve = []
20 lista_nieve.append([x, y])
reloj = pygame.time.Clock()
21
# Iteramos hasta que el usuario haga click sobre le botón de salida.
22 hecho = False
23 while not hecho:
27 pantalla.fill(NEGRO)
lista_nieve[i][1] += 1
32
# Si el copo se escapa del fondo de la pantalla.
33 if lista_nieve[i][1] > 400:
y = random.randrange(-50, -10)
35
lista_nieve[i][1] = y
36
# Le damos una nueva ubicación x
37 x = random.randrange(0, 400)
38 lista_nieve[i][0] = x
41 # Pórtate bien con el IDLE. Si nos olvidamos de esta línea, el programa se 'colgará
# en la salida.
42
pygame.quit ()
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
8.3 Animación 3D
Vídeo: Demo del Motor de Juegos Blender
4 blue_object = cont.owner
blue_object["y_change"] *= -1
16
if blue_object.position[1] < -6 and blue_object["y_change"] < 0:
17 blue_object["y_change"] *= -1
18
19
20
21
22
23
24
25
26
8.4 Repaso
8.4.1 Test
8.4.2 Ejercicios
8.4.3 Taller
dibujar_casa()
dibujar_coche()
dibujar_conejito_asesino()
print("Bienvenido a la Batalla del Barro! El objetivo es darle al otro jugado con una bo
1 def volumen_esfera(radio):
2 pi = 3.141592653589
3 volumen = (4 / 3) * pi * radio ** 3
3 resultado = a + b
return resultado
4
2 suma_dos_numeros(22, 15)
print(mi_resultado)
3
return volumen
4
Debido al return, la función puede usarse más tarde como parte de una ecuación que
calcule el volumen para el pack de seis:
volumen_pack_seis = volumen_cilindro(2.5, 5) * 6
resultado = a + b
print(resultado)
# Función que devuelve el resultado
resultado = a + b
return resultado
imprime_suma(4, 4)
# Este no
devuelve_suma(4, 4)
x1 = imprime_suma(4, 4)
# Esto sí lo hará
x2 = devuelve_suma(4, 4)
resultado = (a + b) / 2
return resultado
x = 45
y = 56
calcular_promedio(x, y)
resultado = (a * b) / 2
return resultado
x = 45
y = 56
promedio = calcular_promedio(x, y)
print(promedio)
1
def volumen_cilindro(radio, altura):
2 """Devuelve el volumen de un cilindro, conocidos su radio y altura."""
3 pi = 3.141592653589
# x es igual a 22
def f():
x = 22
# Llamada a la función
f()
print(x)
x = 44
def f():
print(x)
# Llamamos a la función
f()
x = 44
def f():
x += 1
print(x)
# Llamamos a la función
f()
Otros lenguajes tienen reglas más complejas en cuanto a
la creación de variables y su ámbito que Python. Debido
a que Python es un lenguaje sencillo, es un buen
lenguaje introductorio.
9.7 Pass-by-copy
Las funciones pasan sus valores, creando copias del
original. Por ejemplo:
# Define una función elemental que imprime x
def f(x):
x += 1
print(x)
# Establece y
y = 10
# Llamada a la función
f(y)
print(y)
def f(x):
x += 1
print(x)
# Establece x
x = 10
# Llamada a la función
f(x)
print(x)
brazo_fuera("derecho", "abajo")
brazo_fuera("izquierdo", "abajo")
brazo_fuera("derecho", "arriba")
brazo_fuera("izquierdo", "arriba")
# etc
print("Hola mundo.")
main()
print("Hola Mundo.")
if __name__ == "__main__":
main()
1
2
3 # Ejemplo 1
4 def a():
print("A")
5
def b():
6
print("B")
7 def c():
8 print("C")
a()
9
10
11
Ejemplo 2
1 # Ejemplo 2
2 def a():
b()
3
print("A")
4 def b():
5 c()
print("B")
6
7 def c():
print("C")
8
a()
9
10
11
12
13
Ejemplo 3
1
2
3
# Ejemplo 3
4 def a():
5 print("A")
b()
6
def b():
7
print("B")
8 c()
9 def c():
print("C")
10
a()
11
12
13
Ejemplo 4
# Ejemplo 4
1
def a():
2
print("A empieza con")
3 b()
4 print("A termina con")
def b():
5
print("B empieza con")
6 c()
def c():
8
print("C empieza y termina con")
9
a()
10
11
12
13
14
15
Ejemplo 5
1
2 # Ejemplo 5
3 def a(x):
c(x + 1)
8
print("C termina con, x = ",x)
9 def c(x):
a(5)
11
12
13
14
15
Ejemplo 6
1
2
# Ejemplo 6
3 def a(x):
4 x =x +1
5 x =3
a(x)
6
print(x)
7
8
Ejemplo 7
1
2
# Ejemplo 7
3
def a(x):
4 x =x +1
5 return x
x =3
6
a(x)
7
print(x)
8
9
Ejemplo 8
# Ejemplo 8
1
def a(x):
2 x =x +1
3 return x
x =3
4
x = a(x)
5 print(x)
6
7
8
9
Ejemplo 9
1
2
# Ejemplo 9
3
def a(x, y):
4
x =x +1
5 y =y +1
6 print(x, y)
x = 10
7
y = 20
8
a(y, x)
9 print(z)
10
11
Ejemplo 10
1 # Ejemplo 10
5 return y
6 x = 10
y = 20
7
z = a(x, y)
8 print(z)
9
10
11
12
Ejemplo 11
1
2
# Ejemplo 11
3
def a(x, y):
4
x =x +1
5 y =y +1
6 return x, y
x = 10
7
y = 20
8
z = a(x, y)
9 print(z)
10
11
Ejemplo 12
1 # Ejemplo 12
5 x = 10
6 y = 20
9
10
11
12
Ejemplo 13
1
2
# Ejemplo 13
3
def a(mis_datos):
4
print("función a, mis_datos = ", mis_datos)
5 mis_datos = 20
mis_datos = 10
7
print("entorno global, mis_datos = ", mis_datos)
8
a(mis_datos)
9 print("entorno global, mis_datos = ", mis_datos)
10
11
Ejemplo 14
1 # Ejemplo 14
def a(mi_lista):
2
print("función a, lista = ", mi_lista)
3
mi_lista = [10, 20, 30]
4 print("función a, lista = ", mi_lista)
5 mi_lista = [5, 2, 4]
6 print("entorno global, lista = ", mi_lista)
a(mi_lista)
7
print("entorno global, lista = ", mi_lista)
8
9
10
11
Ejemplo 15
1
2
3 # Ejemplo 15
# Concepto nuevo!
4
# Se describe con más detalle en el Capítulo 12
5
def a(mi_lista):
6 print("función a, lista = ", mi_lista)
7 mi_lista[0] = 1000
12
13
#--
mudball.py
"""
1
Este es un simple juego de texto para mostrar el uso de funciones.
2
El juego se llama "BolaDeBarro", donde los jugadores, por turnos, se
3 lanzan bolas de barro unos contra otros, hasta que alguien es alcanzado.
4 """
import math
5
import random
6 def imprimir_instrucciones():
""")
12
def calcular_distancia(psi, angulo_en_grados):
13 """ Calcula la distancia que vuela la bola de barro. """
14 angulo_en_radianes = math.radians(angulo_en_grados)
return distancia
16
def obtener_datosdel_usuario(nombre):
17 """ Obtiene del usuario los valores para la presión y el ángulo. Lo devuelve como u
18 números. """
22 angulo = float(input(nombre + " ¿con qué ángulo quieres apuntar el arma? "))
hecho = False
26
jugadores = []
27
while not hecho:
28 jugador = input("Introducir jugador (presiona intro para salir): ")
29 if len(jugador) > 0:
jugadores.append(jugador)
30
else:
31 hecho = True
32 print()
return jugadores
33
def procesa_turno_jugador(jugador_nombre, distancia_aparte):
34
""" El código ejecuta el turno para cada jugador.
35 Si devuelve False, continuamos con el juego.
if diferencia > 1:
41
print("Ha caído", diferencia, "metros muy lejos!")
42 elif diferencia < -1:
else:
44
print("Bingo!", jugador_nombre, "gana!")
45
return True
46 print()
47 return False
def main():
48
""" Programa Principal. """
49 # Comenzamos el juego.
50 imprimir_instrucciones()
jugador_nombres = obtener_nombres_jugadores()
51
distancia_aparte = random.randrange(50, 150)
52
# Se mantiene alerta hasta que alguien gana
53 hecho = False
54 while not hecho:
61 main()
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
9.11 Repaso
9.11.1 Test
9.11.2 Ejercicios
9.11.3 Taller
10.1 Introducción
1
def dibujar_hombredenieve(pantalla, x, y):
2
# Dibuja un círculo para la cabeza
3 pygame.draw.ellipse(pantalla,BLANCO, [35 + x, y, 25, 25])
1
2
# Hombre de nieve en la parte superior izquierda
3 dibujar_hombredenieve ( pantalla , 10, 10)
4 # Hombre de nieve en la parte superior derecha
1
2
3
# Cabeza
4 pygame.draw.ellipse(pantalla, NEGRO, [96, 83, 10, 10], 0)
5 # Piernas
9 # Brazos
1 def dibuja_hombrepalitos(pantalla,x,y):
# Cabeza
2
pygame.draw.ellipse(pantalla, NEGRO, [96, 83, 10, 10], 0)
3 # Piernas
# Cuerpo
6
pygame.draw.line(pantalla, ROJO, [100, 100], [100, 90], 2)
7 # Brazos
1
2
3
def dibuja_hombrepalitos(pantalla, x, y):
4
# Cabeza
5 pygame.draw.ellipse(pantalla, NEGRO,[96 + x, 83 + y, 10, 10], 0)
6 # Piernas
# Brazos
10
pygame.draw.line(pantalla, ROJO, [100 + x, 90 + y], [104 + x, 100 + y], 2)
11
pygame.draw.line(pantalla, ROJO, [100 + x, 90 + y], [96 + x, 100 + y], 2)
12
13
14
Ahora el problema es que la figura aparece dibujada a
cierta distancia del origen. Vamos a asumir el origen en
(0,0) y dibujar la figura alrededor de 100 píxeles, hacia
abajo y a la derecha. Observa la Figura 10.4 de cómo el
hombre de palitos no aparece en las coordenadas (0,0)
que le habíamos pasado.
1
2
3
def dibuja_hombrepalitos(pantalla, x, y):
4
# Cabeza
5 pygame.draw.ellipse(pantalla, NEGRO, [1 + x, y, 10, 10], 0)
6 # Piernas
# Brazos
10
pygame.draw.line(pantalla, ROJO, [5 + x, 7 + y], [9 + x, 17 + y], 2)
11
pygame.draw.line(pantalla, ROJO, [5 + x, 7 + y], [1 + x, 17 + y], 2)
12
13
14
10.2 Ratón
Vídeo: Mover con el ratón
pos = pygame.mouse.get_pos()
x = pos[0]
y = pos[1]
# Sección de dibujo
dibuja_hombrepalitos(pantalla, x, y)
pygame.mouse.set_visible(False)
Podemos encontrar un ejemplo completo de todo esto
en:
ProgramArcadeGames.com/python_examples/f.php?la
ng=es&file=move_mouse.py
10.3 Teclado
Vídeo: Mover con el teclado
x_speed = 0
y_speed = 0
# Posición actual
x_coord = 10
y_coord = 10
if evento.type == pygame.QUIT:
hecho = True
# ajusta la velocidad.
if evento.key == pygame.K_LEFT:
x_speed = -3
if evento.key == pygame.K_RIGHT:
x_speed = 3
if evento.key == pygame.K_UP:
y_speed = -3
if evento.key == pygame.K_DOWN:
y_speed = 3
if evento.type == pygame.KEYUP:
if evento.key == pygame.K_LEFT:
x_speed = 0
if evento.key == pygame.K_RIGHT:
x_speed = 0
if evento.key == pygame.K_UP:
y_speed = 0
if evento.key == pygame.K_DOWN:
y_speed = 0
x_coord += x_speed
y_coord += y_speed
K_BACKSPACE \b retroceso
K_RETURN \r volver
K_TAB \t tab
K_ESCAPE ^[ escape
K_SPACE espacio
K_COMMA , coma
K_MINUS - menos
K_PERIOD . punto
K_SLASH / barra
K_0 0 0
K_1 1 1
K_2 2 2
Código Pygame ASCII Nombre Común
K_3 3 3
K_4 4 4
K_5 5 5
K_6 6 6
K_7 7 7
K_8 8 8
K_9 9 9
K_EQUALS = igual
K_BACKSLASH \ contrabarra
K_a a a
K_b b b
K_c c c
K_d d d
K_e e e
K_f f f
K_g g g
K_h h h
K_i i i
Código Pygame ASCII Nombre Común
K_j j j
K_k k k
K_l l l
K_m m m
K_n n n
K_o o o
K_p p p
K_q q q
K_r r r
K_s s s
K_t t t
K_u u u
K_v v v
K_w w w
K_x x x
K_y y y
K_z z z
K_DELETE delete
K_UP up arriba
K_F1 F1
K_F2 F2
K_F3 F3
K_F4 F4
K_F5 F5
K_F6 F6
K_F7 F7
K_F8 F8
K_F9 F9
K_F10 F10
K_F11 F11
K_F12 F12
K_NUMLOCK bloqnum
K_CAPSLOCK bloqmayus
x_coord = 10
y_coord = 10
joystick_cuenta = pygame.joystick.get_count()
if joystick_cuenta == 0:
# No joysticks!
else:
mi_joystick = pygame.joystick.Joystick(0)
mi_joystick.init()
if joystick_cuenta != 0:
horiz_axis_pos = mi_joystick.get_axis(0)
vert_axis_pos = mi_joystick.get_axis(1)
# Mueve x de acuerdo al eje. Multiplicamos por 10 para aumentar el movimiento.
# Limpia la pantalla
pantalla.fill(BLANCO)
joystick_calls.py
1 """
4 # http://simpson.edu/computer-science/
"""
5
import pygame
6
# Definimos algunos colores
7 NEGRO = (0, 0, 0)
class TextPrint(object):
9
”'
10
Esta es una sencilla clase que nos ayudará a imprimir sobre la pantalla
11 No tiene nada que ver con los joysticks, tan solo imprime información
12 ”'
def __init__(self):
13
"""Constructor"""
14 self.reset()
15 self.x_pos = 10
16 self.y_pos = 10
self.y += self.line_height
20
def reset(self):
21
self.x = 10
22 self.y = 10
23 self.line_height = 15
def indent(self):
24
self.x += 10
25 def unindent(self):
26 self.x -= 10
27 pygame.init()
30 pygame.display.set_caption("Mi Juego")
pygame.joystick.init()
35
# Se prepara para imprimir
36 text_print = TextPrint()
44 if evento.type == pygame.JOYBUTTONUP:
48 pantalla.fill(BLANCO)
text_print.reset()
49
# Contamos el número de joysticks
50 joystick_count = pygame.joystick.get_count()
51 text_print.print(pantalla, "Número de joysticks: {}".format(joystick_count) )
52 text_print.indent()
55 joystick.init()
text_print.indent()
63
for i in range(ejes):
64
eje = joystick.get_axis(i)
65 text_print.print(pantalla, "Eje {} valor: {:>6.3f}".format(i, eje))
66 text_print.unindent()
botones = joystick.get_numbuttons()
67
text_print.print(pantalla, "Número de botones: {}".format(botones))
68 text_print.indent()
69 for i in range(botones):
boton = joystick.get_button(i)
70
text_print.print(pantalla, "Botón {:>2} valor: {}".format(i,boton))
71
text_print.unindent()
72 # Hat switch. Todo o nada para la dirección, no como en los joysticks.
hats = joystick.get_numhats()
74
text_print.print(pantalla, "Número de hats: {}".format(hats))
75 text_print.indent()
76 for i in range(hats):
77 hat = joystick.get_hat(i)
84 pygame.quit()
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
10.5 Repaso
10.5.1 Test
10.5.2 Ejercicios
10.5.3 Taller
Figure
11.1: Crear una carpeta nueva
posicion_jugador = pygame.mouse.get_pos()
x = posicion_jugador[0]
y = posicion_jugador[1]
11.4 Sonidos
Video: Sonidos
if evento.type == pygame.QUIT:
hecho = True
pulsar_sonido.play()
4 http://programarcadegames.com/
5 http://simpson.edu/computer-science/
25 imagen_de_fondo = pygame.image.load("saturn_family1.jpg").convert()
26 imagen_personaje = pygame.image.load("playerShip1_orange.png").convert
imagen_personaje.set_colorkey(NEGRO)
27
hecho = False
28
while not hecho:
29
reloj.tick(10)
30
for evento in pygame.event.get():
31
if evento.type == pygame.QUIT:
32
hecho = True
33
elif evento.type == pygame.MOUSEBUTTONDOWN:
34
sonido_click.play()
35
# Copia la imagen en pantalla:
36
pantalla.blit(imagen_de_fondo, posicion_base)
37 # Obtiene la posición actual del ratón. Devuelve ésta como
38 # una lista de dos números.
39 posicion_del_personaje = pygame.mouse.get_pos()
40 x = posicion_del_personaje[0]
41 y = posicion_del_personaje[1]
42 # Copia la imagen en pantalla:
44 pygame.display.flip()
45 reloj.tick(60)
46 pygame.quit()
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
11.6 Repaso
11.6.1 Test
11.6.2 Ejercicios
11.6.3 Taller
1 nombre = "Link"
2 sexo = "Varón"
3 golpe_puntos_max = 50
golpe_puntos_actuales = 50
4
golpe_puntos_actuales = 50
3
velocidad_max = 10
4 def mostrar_personaje(nombre, sexo, golpe_puntos_max, golpe_puntos_actuales,velocida
6
7
8
1
2 class Personaje():
""" Esta es una clase que representa al protagonista principal del juego. """
3
def __init__(self):
4 """ Este es un método que establece las variables del objeto. """
5 self.name = "Luis"
6 self.sexo = "Varón"
self.puntos_impacto_max = 50
7
self.puntos_impacto_actuales = 50
8 self.vel_max = 10
9 self.cantidad_escudos = 8
10
1 class Direccion():
2 """ Contiene todos los campos para una dirección postal. """
3 def __init__(self):
6 self.via2 = ""
self.ciudad = ""
7
self.provincia = ""
8
self.cod_postal = ""
9
10
1
2
# Crea una dirección
3 casa_direccion = Direccion()
7 casa_direccion.ciudad = "Indianola"
casa_direccion.provincia = "IA"
8
casa_direccion.cod_postal = "50125"
9
10
1
2
class Direccion():
3
def __init__(self):
4 self.nombre = ""
5 self.via1 = ""
self.via2 = ""
6
self.ciudad = ""
7 self.provincia = ""
8 self.cod_postal = ""
mi_direccion = Direccion()
10
# Cuidado! Esto no establece el nombre para la dirección!
11 nombre = "Dr. Craven"
12 # Esto tampoco
1 class Direccion():
2 def __init__(self):
self.nombre = ""
3
self.via1 = ""
4 self.via2 = ""
5 self.ciudad = ""
self.provincia = ""
6
self.cod_postal = ""
7
# Crea una dirección
8 casa_direccion = Direccion()
13 casa_direccion.provincia = "IA"
casa_direccion.cod_postal = "50125"
14
# Crea otra dirección
15 casa_vacaciones_direccion = Direccion()
casa_vacaciones_direccion.via2 = ""
19
casa_vacaciones_direccion.ciudad = "Panama City Beach"
20 casa_vacaciones_direccion.provincia = "FL"
21 casa_vacaciones_direccion.cod_postal = "32407"
31
32
# Imprime una dirección en pantalla
33
def imprimir_direccion(direccion):
34
print(direccion.nombre)
35 # Si existe una via1 en esa dirección, imprímela
print (direccion.via1)
37
# Si existe una via2 en esa dirección, imprímela
38 if( len(direccion.via2) > 0 ):
39 print( direccion.via2 )
43
44
1
2 class Perro():
3 def __init__(self):
self.edad = 0
4
self.nombre = ""
5 self.peso = 0
6 def ladra(self):
print("Guau")
7
8
1
2
mi_perro = Perro()
3 mi_perro.nombre = "Spot"
4 mi_perro.peso = 20
mi_perro.edad = 3
5
mi_perro.ladra()
6
7
Perro.ladra(mi_perro)
6 def ladra(self):
1 class Pelota():
def __init__(self):
2
# --- Atributos de la Clase ---
3 # Posición de la pelota
4 self.x = 0
5 self.y = 0
# vector Pelota
6
self.cambio_x = 0
7 self.cambio_y = 0
8 # Dimensiones de la Pelota
9 self.talla = 10
# color de la Pelota
10
self.color = [255,255,255]
11 # --- Métodos para la Clase ---
12 def mover(self):
self.x += self.cambio_x
13
self.y += self.cambio_y
14
def dibujar(self, pantalla):
15 pygame.draw.circle(pantalla, self.color, [self.x, self.y], self.talla )
16
17
18
19
20
21
22
23
24
laPelota.x = 100
laPelota.y = 100
laPelota.cambio_x = 2
laPelota.cambio_y = 1
laPelota.color = [255,0,0]
El siguiente código, que dibujará y moverá la pelota, irá
dentro del bucle principal:
laPelota.mover()
laPelota.dibujar(pantalla)
12.4 Referencias
Vídeo: Referencias
1
2
3
class Persona:
4
def __init__(self):
5 self.nombre = ""
6 self.dinero = 0
bob = Persona()
7
bob.nombre = "Bob"
8 bob.dinero = 100
9 nancy = Persona()
nancy.nombre = "Nancy"
10
print(bob.nombre, "tiene", bob.dinero, "dólares.")
11
print(nancy.nombre, "tiene", nancy.dinero, "dólares.")
12
13
14
El código anterior crea dos instancias para la clase
Persona(). Podemos visualizar las dos clases
usando www.pythontutor.com Figura 12.5.
4 bob = Persona()
bob.nombre = "Bob"
5
bob.dinero = 100
6
nancy = bob
7 nancy.nombre = "Nancy"
8 print(bob.nombre, "tiene", bob.dinero, "dólares.")
self.dinero = 0
5
bob = Persona()
6 bob.nombre = "Bob"
7 bob.dinero = 100
dameDinero1(bob.dinero)
8
print(bob.dinero)
9
10
11
12
13
14
14
def dameDinero2(persona):
15
persona.dinero += 100
16
dameDinero2(bob)
17 print(bob.dinero)
18
Figure 12.9:
Referencias a Funciones
12.5 Constructores
Vídeo: Constructores
def __init__(self):
self.nombre = ""
mi_perro = Perro()
1
2 class Perro():
3 def __init__(self):
mi_perro = Perro()
7
8
1
2 # Mal:
3 class Perro():
def __init__(self):
4
self.edad = 0
5
self.nombre = ""
6 self.peso = 0
7 def __init__(self):
1 # Bien:
2 class Perro():
3 def __init__(self):
self.edad = 0
4
self.nombre = ""
5 self.peso = 0
1
class Perro():
2
def __init__(self, nombre_nuevo):
3 """Constructor"""
4 self.nombre = nombre_nuevo
7 print(mi_perro.nombre)
12.6 Herencia
Vídeo: Herencia
self.esta_atracado = True
4
def atracar(self):
5 if self.esta_atracado:
else:
7
self.esta_atracado = True
8
print("Atracando")
9 def desatracar(self):
10 if not self.esta_atracado:
14
15
16
17
18
19
3 b.desatracar()
b.atracar()
4
b.atracar()
5
6
7
Las salidas:
Ya has atracado.
Desatracando.
No estás atracado.
Atracando
Ya has atracado.
1 class Submarino(Barco):
2 def sumergirse(self):
print("Sumergirse!")
3
4 def __init__(self):
class Cliente(Persona):
8
def __init__(self):
9 super().__init__()
10 self.email = ""
john_smith = Persona()
11
john_smith.nombre = "John Smith"
12
jane_empleado = Empleado()
13 jane_empleado.nombre = "Empleado Jane"
bob_cliente = Cliente()
15
bob_cliente.nombre = "Bob Cliente"
16 bob_cliente.email = "enviame@spam.com"
17
18
19
20
21
22
23
24
25
26
27
4 # Informe básico
super().__init__()
8
# Establecemos las variables ahora
9
self.nombre_del_puesto = ""
10 def informe(self):
15 self.email = ""
def informe(self):
16
# Ejecutamos el informe padre:
17 super().informe()
18 # Añadimos ahora nuestro propio código al final, de forma que hacemos los dos
21 jane_empleado = Empleado()
25 bob_cliente.email = "envia_me@spam.com"
john_smith.informe()
26
jane_empleado.informe()
27 bob_cliente.informe()
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
self.y = 3
3
# Ejemplo de una variable estática
4 class ClaseB():
5 x =7
print(b.x)
10
print(ClaseB.x)
11 # Una forma de imprimir una variable de instancia
12 # La segunda genera un error, ya que no sabemos a que instancia referirnos.
13 print(a.y)
print(ClaseA.y)
14
15
16
17
18
19
20
21
22
# Esto imprime 7
5
print(b.x)
6 # Esto también imprime 7
7 print(ClaseB.x)
print(ClaseB.x)
12
# Asignamos un nuevo valor a x usando la instancia.
13 # ¡Pero espera, realmente no está asignando un nuevo valor a x!
14 # Esto crea una variable x completamente nueva. Esta x es una
18 # Esto imprime 9
print(b.x)
19
# Esto imprime 8. NO 9!!!
20
print(ClaseB.x)
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
12.8 Repaso
12.8.1 Test
12.8.2 Ejercicios
12.8.3 Taller
1
2 import pygame
import random
3
# Definimos algunos colores
4
NEGRO = ( 0, 0, 0)
5 BLANCO = (255, 255, 255)
6 ROJO = (255, 0, 0)
9
class Bloque(pygame.sprite.Sprite):
10 """
15
16 def __init__(self, color, largo, alto):
19 super().__init()__
20
self.image.fill(color)
25
Las líneas 24 y 25 crean la imagen que finalmente
aparecerá en la pantalla. La línea 24 crea una imagen en
blanco. La línea 25 la rellena de negro. Si el programa
necesita dibujar una figura distinta al bloque negro,
deberemos modificar las siguientes líneas de código:
Por ejemplo:
15
16
17 def __init__(self, color, largo, alto):
18 """
22 super().__init__()
26 # Dibuja la elipse
15
16
17 def __init__(self):
self.image.set_colorkey(BLANCO)
23
24
25
29 # rect.x y rect.y
self.rect = self.image.get_rect()
30
32 # Inicializamos Pygame
pygame.init()
33
# Establecemos el largo y alto de la pantalla
34
largo_pantalla = 700
35 alto_pantalla = 400
40
41 # Esta es una lista de 'sprites.' Cada bloque del programa es
listade_todoslos_sprites = pygame.sprite.Group()
46
47
49
50
for i in range(50):
51
# Esto representa un bloque
52
bloque = Bloque(NEGRO, 20, 15)
53 # Establece una ubicación aleatoria para el bloque
54 bloque.rect.x = random.randrange(largo_pantalla)
bloque.rect.y = random.randrange(alto_pantalla)
55
# Añade el bloque a la lista de objetos
56
bloque_lista.add(bloque)
57 listade_todoslos_sprites.add(bloque)
58
59
listade_todoslos_sprites.add(protagonista)
63
65
66
# Iteramos hasta que el usuario pulse el botón de cerrar.
67
hecho = False
68 # Determinamos cuán rápido se refresca la pantalla
69 reloj = pygame.time.Clock()
marcador = 0
70
# -------- Bucle Principal del Programa -----------
71
while not hecho:
72 for evento in pygame.event.get():
73 if evento.type == pygame.QUIT:
hecho = True
74
# Limpiamos la pantalla
75 pantalla.fill(BLANCO)
76
77
78
79
80
82
83 # Obtenemos la posición actual del ratón como
pos = pygame.mouse.get_pos()
85
# Extraemos los valores x e y de la lista,
86
# de la misma forma que extraemos letras de una cadena de caraceteres (string).
87 # Colocamos al objeto protagonista en la ubicación del ratón
88 protagonista.rect.x = pos[0]
protagonista.rect.y = pos[1]
89
90
97 marcador += 1
print(marcador)
98
101 listade_todoslos_sprites.draw(pantalla)
103
104
# Limitación de 60 fotogramas por segundo
105 reloj.tick(60)
106 # Avanzamos y actualizamos la pantalla con todo aquello que ha sido dibujado.
pygame.display.flip()
107
pygame.quit()
108
109
self.rect.y += 1
bloque_lista.update()
self.rect.y += 1
"""
def update(self):
self.rect.y += 1
self.reset_pos()
marcador += 1
print(marcador)
bloque.reset_pos()
13.4.1 ¿Disparamos?
13.4.2 Paredes
13.4.3 Plataformas
13.4.4 Serpiente/Ciempiés
13.4.6 Test
13.4.7 Ejercicios
13.4.8 Taller
1
2 # Función Foo
def foo():
3
print("foo!")
4 # Llamada a la función Foo
5 foo()
1 # Función Foo
2 def foo():
print("foo!")
3
archivo test.py que no funciona
2 foo()
1
# Importa el archivo <kbd>mis_funciones.py</kbd>
2
import mis_funciones
3
# Llamada a la función Foo que aún no se ejecuta
4 foo()
1
# Importa el archivo mis_funciones.py
2
import mis_funciones
3
# Llamada a la función Foo que ya se ejecuta
4 mis_funciones.foo()
14.3 Namespace
Vídeo: Namespace
1 def imprimir_informe():
funciones_financieras.py
1 def imprimir_informe():
1
import funciones_alumnos
2
import funciones_financieras
3
funciones_alumnos.imprimir_informe()
4 funciones_financieras.imprimir_informe()
1
# import foo
2
from mis_funciones import *
3 foo()
1 """
4 import random
wb.save("ejemplo.xlsx")
13
14
15
16
17
18
19
20
21
22
1 """
4 import urllib.request
5 # Leemos el archivo
url= "http://www.espnfc.com/spi/rankings/_/view/fifa/teamId/203/mexico?cc=5901"
6
pagina = urllib.request.urlopen(url)
7 sopa = BeautifulSoup(page.read(), "html.parser")
rango = sopa.find("table").tbody
9
# Obtenemos una lista con las filas de la tabla
10
filas = rank.findAll("tr")
11 # Iteramos a través de cada fila
# Listo, hemos terminado con esa fila. Imprimos una línea en blanco y vamos a la
17
# siguiente.
18 print()
19
20
21
22
23
24
25
26
27
28
29
30
31
Ejemplo 1
"""
1
Recta con cuatro valores.
2 Por defecto, el eje x empieza en cero.
3 """
y = [1, 3, 8, 4]
5
plt.plot(y)
6 plt.ylabel('Valor del Elemento')
7 plt.xlabel('Número del Elemento')
plt.show()
8
9
10
11
12
13
Ejemplo 2
1 """
5 x = [1, 2, 3, 4]
y = [1, 3, 8, 4]
6
plt.plot(x, y)
7
plt.ylabel('Valor del Elemento')
8 plt.xlabel('Elemento')
9 plt.show()
10
11
12
13
14
15
Ejemplo 3
1
2
3
4 """
5 En este ejemplo se muestra como dibujar dos series diferentes de datos
9 y1 = [1, 3, 8, 4]
y2 = [2, 2, 3, 3]
10
plt.plot(x, y1)
11
plt.plot(x, y2)
12 plt.ylabel('Valor del Elemento')
13 plt.xlabel('Elemento')
plt.show()
14
15
16
17
Example 4
x = [1, 2, 3, 4]
2
y1 = [1, 3, 8, 4]
3
y2 = [2, 2, 3, 3]
4 plt.plot(x, y1, label = "Serie 1")
9 plt.show()
10
11
12
13
14
15
16
1
2
3
4
5
"""
6 Anotando sobre la gráfica
7 """
10 plt.annotate('Aquí',
xy = (2, 3),
11
xycoords = 'data',
12
xytext = (-40, 20),
13 textcoords = 'offset points',
18 plt.xlabel('Elemento')
plt.show()
19
20
21
22
23
¿No te gusta el estilo de líneas por defecto de tu gráfica?
Lo puedes cambiar añadiendo un tercer parámetro al
comando plot.
Ejemplo 6
"""
1
Aquí mostramos cómo establecer el estilo de línea y los símbolos.
2 """
x = [1, 2, 3, 4]
4
y1 = [1, 3, 8, 4]
5
y2 = [2, 2, 3, 3]
6 # Primer carácter: Estilo de línea
# http://matplotlib.org/1.4.2/api/markers_api.html
10
plt.plot(x, y1, '-ro')
11
plt.plot(x, y2, '--g^')
12 plt.ylabel('Valor del Elemento')
13 plt.xlabel('Elemento')
plt.show()
14
15
16
17
18
19
20
21
22
23
24
25
Ejemplo 7
1
"""
2 Cómo construir una gráfica de barras.
3 """
plt.xlabel('Elemento')
8
plt.show()
9
10
11
12
13
14
Ejemplo 8
"""
1
Cómo añadir etiquetas a los valores del eje x.
2 """
5 plt.plot(x, y)
9 plt.show()
10
11
12
13
14
15
16
17
Ejemplo 9
1 """
9 plt.xlabel('Elemento')
10 plt.show()
11
12
13
14
15
16
1
2
3
4
"""
5
Uso de 'fill' para rellenar una gráfica
6
"""
7 import numpy
15
16
17
18
Ejemplo 11
1 """
Ejemplo 12
1 """
5 DayLocator, MONDAY
if len(valores) == 0:
11
raise SystemExit
12 # Definimos el aspecto de la gráfica
13 fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
14
# Ponemos marcas mayores para los lunes
15
lunes = WeekdayLocator(MONDAY)
16 ax.xaxis.set_major_locator(lunes)
resto_dias = DayLocator()
18
ax.xaxis.set_minor_locator(resto_dias)
19 # Damos formato a los días
20 formato_semana = DateFormatter('%b %d') # e.g., Ene 12
21 ax.xaxis.set_major_formatter(formato_semana)
ax.xaxis_date()
22
candlestick_ohlc(ax, valores, width=0.6)
23 ax.autoscale_view()
plt.show()
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
14.5 Repaso
14.5.1 Test
14.5.2 Ejercicios
14.5.3 Taller
1
file = open("super_villains.txt")
2
for line in file:
3 print(line)
4
En este código, aparece tan solo un nuevo comando; open.
Como es una función incorporada en Python, tal
como print, no tenemos necesidad de usar un import. Los
detalles completos de esta función los puedes encontrar
en la documentación de Python. Pero en estos
momentos, la documentación de ese comando es tan
técnica, que no merece la pena perder el tiempo en ella.
1
2
file = open("super_villains.txt")
3 for line in file:
4 line = line.strip()
print(line)
5
file.close()
6
7
El código anterior funciona mejor. Tiene dos elementos
nuevos. En la línea 4 se hace una llamada al método strip,
incluido en cada clase String. Esta función devuelve una
cadena nueva, sin los espacios finales ni los retornos de
carro de la cadena original. El método no altera la
cadena original, en todo caso, crea una nueva. La
siguiente línea de código no funcionaría por si sola :
line.strip()
5 file.close()
6
7
8
9
print(nombre)
1
2
# Búsqueda Lineal
3
clave = "Morgana la Arpía"
4
i =0
5 while i < len(lista_nombres) and lista_nombres[i] != clave:
6 i += 1
if i < len(lista_nombres):
7
print( "El nombre se encuentra en la posición", i)
8
else:
9 print( "El nombre no se encuentra en la lista." )
10
11
Vídeo: Búsqueda Lineal
1
class Alien:
2 """ Clase que define un alien"""
3 def __init__(self, color, peso):
self.color = color
5
self.peso = peso
6
4 if mi_alien.color.upper() == "VERDE":
return True
5
else:
6
return False
7
1 def comprueba_si_un_elemento_tiene_propiedad_v1(mi_lista):
propiedad. """
3
i =0
4 while i < len(mi_lista) and not tiene_propiedad(lista[i]):
5 i += 1
6 if i < len(mi_lista):
return False
10
11
12
13
14
1
def comprueba_si_un_elemento_tiene_propiedad_v2(mi_lista):
2
""" Devuelve true si al menos un item tiene esa
3 propiedad. Funciona como v1, pero con menos código. """
if tiene_propiedad(item):
5
return True
6
return False
7
15.4.2 ¿Todos Los Elementos Tienen Una
Propiedad?
1
def comprueba_si_todos_elementos_tienen_propiedad(mi_lista):
2 """ Devuelve true si TODOS los items tienen una propiedad. """
3 for item in mi_lista:
4 if not tiene_propiedad(item):
return False
5
return True
6
if tiene_propiedad(item):
5
lista_coincidentes.append(item)
6 return lista_coincidentes
7
8
1
2
3
lista_aliens = []
4
lista_aliens.append(Alien("Verde", 42))
5
lista_aliens.append(Alien("Rojo", 40))
6 lista_aliens.append(Alien("Azul", 41))
7 lista_aliens.append(Alien("Púrpura", 40))
resultado = comprueba_si_un_elemento_tiene_propiedad_v1(lista_aliens)
8
print("Resultado del test comprueba_si_un_elemento_tiene_propiedad_v1:", resultado)
9 resultado = comprueba_si_un_elemento_tiene_propiedad_v2(lista_aliens)
resultado = comprueba_si_todos_elementos_tienen_propiedad(lista_aliens)
11
print("Resultado del test comprueba_si_todos_elementos_tienen_propiedad:", resultad
12
resultado = obtener_elementos_coincidentes(lista_aliens)
13 print("Número de items devueltos por el test obtener_elementos_coincidentes:", len(
14
15
16
17
3 limite_superior = len(lista_nombres)-1
encontrado = False
4
# Iteramos hasta encontrar el objeto, o donde se encuentran nuestros límites superi
5
while limite_inferior <= limite_superior and not encontrado:
6 # Hallamos la posición intermedia
7 posicion_intermedia = (limite_inferior+limite_superior) // 2
# Determinamos si:
8
# desplazamos hacia arriba el límite superior, o
9
# desplazamos hacia abajo el límite inferior, o si
10 # ya hemos encontrado lo que buscábamos
limite_inferior = posicion_intermedia + 1
12
elif lista_nombres[posicion_intermedia] > clave:
13 limite_superior = posicion_intermedia - 1
14 else:
encontrado = True
15
if encontrado:
16 print("El nombre se encuentra en la posición", posicion_intermedia)
17 if not found:
15.6 Repaso
15.6.1 Test
15.6.2 Ejercicios
15.6.3 Taller
OO
022
010
100
Figure 16.1:
Buscaminas y su Retícula Numérica
16.2 Aplicación
Basta de charla y vamos a escribir algo de código. En
este ejemplo crearemos una retícula que se activará si
mostramos un bloque de color blanco o verde. Podemos
cambiar el valor de la retícula y hacer que sea verde
haciendo clic sobre ella. Es un primer paso hacia un
juego del tipo el buscaminas, hundir la flota, etc. (Hubo
un año en que una estudiante me llamó para enseñarme
una versión modificada de un programa como éste,
donde aparecía mi nombre en luces parpadeantes. Fue
como mínimo....inquietante. Por favor, usen su
conocimiento para hacer el bien solamente!)
1
2 # --- Creamos una retícula numérica
grid = []
4
# Iteramos para cada fila
5 for fila in range(10):
6 # Para cada fila, creamos una lista que
grid.append([])
8
# Iteramos para cada columna
9 for columna in range(10):
grid[fila].append(0)
11
12
9. Podemos ver un ejemplo más reducido debajo en el
que se utilizan ciertas particularidades de Python,
pero que no voy a explicar en este libro:
Creamos un array numérico de 10x10
grid[1][5] = 1
1 """
2 Programa de ejemplo de cómo usar un array para respaldar una retícula en pantalla.
3 Sample Python/Pygame Programs
"""
7
import pygame
8
# Definimos algunos colores
9 NEGRO = (0, 0, 0)
VERDE = ( 0, 255, 0)
11
ROJO = (255, 0, 0)
12 # Establecemos el LARGO y ALTO de cada celda de la retícula.
13 LARGO = 20
14 ALTO = 20
grid = []
18
for fila in range(10):
19
# Añadimos un array vacío que contendrá cada celda
20 # en esta fila
21 grid.append([])
grid[1][5] = 1
25
# Inicializamos pygame
26
pygame.init()
27 # Establecemos el LARGO y ALTO de la pantalla
28 DIMENSION_VENTANA = [255, 255]
pantalla = pygame.display.set_mode(DIMENSION_VENTANA)
29
# Establecemos el título de la pantalla.
30 pygame.display.set_caption("Retículas y Matrices")
hecho = False
32
# Lo usamos para establecer cuán rápido de refresca la pantalla.
33
reloj = pygame.time.Clock()
34 # -------- Bucle Principal del Programa-----------
pos = pygame.mouse.get_pos()
40
# Cambia las coordenadas x/y de la pantalla por coordenadas reticulares
41 columna = pos[0] // (LARGO + MARGEN)
46 pantalla.fill(NEGRO)
# Dibujamos la retícula
47
for fila in range(10):
48 for columna in range(10):
49 color = BLANCO
if grid[fila][columna] == 1:
50
color = VERDE
51
pygame.draw.rect(pantalla,
52 color,
53 [(MARGEN+LARGO) * columna + MARGEN,
reloj.tick(60)
57
# Avanzamos y actualizamos la pantalla con lo que hemos dibujado.
58
pygame.display.flip()
59 # Pórtate bien con el IDLE.
60 pygame.quit()
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
y empieza a trabajar en tu propio videojuego!
16.2.4 Test
16.2.5 Ejercicios
lista[2] = lista[0]
Figure
17.2: Intento fallido de intercambiar valores en un array
2 lista[0] = lista[2]
lista[2] = temp
3
Figure 17.3:
Método correcto para intercambiar valores en un array
1
# Ordenamiento por selección
2
def ordenamiento_porseleccion(lista):
3 # Itera por todo el array
temp = mi_lista[pos_min]
13
mi_lista[pos_min] = mi_lista[pos_actual]
14 mi_lista[pos_actual] = temp
15
16
17
18
19
20
21
22
print("{:3}".format(item), end="")
3
print()
4 # Creamos una lista con números aleatorios
5 mi_lista = []
for i in range(10):
6
lista.append(random.randrange(100))
7
# Intentamos el ordenamiento
8 print_lista(mi_lista)
9 ordenamiento_porseleccion(mi_lista)
print_lista(mi_lista)
10
11
12
13
14
15
16
17.3.1 Test
17.3.2 Ejercicios
18.1 Vocabulario
Los términos y frases más habituales cuando trabajamos
con excepciones son:
1
# Dividir entre cero
2 try:
3 x =5/0
except:
4
print("Error división entre cero")
5
1
# Conversión fallida a número
2 try:
3 x = int("fred")
except:
4
print ("Error al intentar convertir fred a número")
5
1
numero_introducido = False
2
while not numero_introducido:
3 numero_cadena = input("Introduce un número entero: ")
4 try:
5 n = int(numero_cadena)
numero_introducido = True
6
except:
7 print ("Error, número entero incorrecto")
1
# Error al abrir un archivo
2 try:
3 mi_archivo = open("miarchivo.txt")
except:
4
print("Error al abrir el archivo")
5
Podemos capturar y procesar, de maneras distintas,
muchos tipos de errores. Por ejemplo, sería muy útil
mostrarle al usuario un mensaje de error más preciso
que un simple; “ocurrió un error.”
1 import sys
# Errores múltiples
2
try:
3 mi_archivo = open("miarchivo.txt")
4 mi_linea = mi_archivo.readline()
5 mi_entero = int(s.strip())
8 except ValueError:
13
14
15
16
1 """
2 # Sample Python/Pygame Programs
5 """
def obtener_puntuacion_mas_alta():
6
# Puntuación más alta por defecto
7
puntuacion_mas_alta = 0
8 # Intentemos leer la puntuación más alta desde un archivo
9 try:
13 except IOError:
23 except IOError:
puntuacion_mas_alta = obtener_puntuacion_mas_alta()
28
# Obtenemos la puntuación del juego en curso
29 puntuacion_actual = 0
30 try:
38 guardar_puntuacion_mas_alta(puntuacion_actual)
else:
39
print("Mejor suerte la próxima vez.")
40 # Llamamos a la función principal, empezamos el juego
41 if __name__ == "__main__":
main()
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
1 try:
2 x =5/0
3 except ZeroDivisionError as e:
print(e)
4
La variable e apunta hacia una información imprimible
más amplia sobre la excepción en cuestión. Podemos
hacer más cosas con los objetos excepción, pero
lamentablemente, eso está más allá del ámbito de este
capítulo.
1
2 # Generamos excepciones
def get_input():
3
entrada_usuario = input("Escribe algo: ")
4
if len(entrada_usuario) == 0:
5 raise IOError("No has escrito nada")
6 get_input()
18.7 Repaso
18.7.1 Test
18.7.2 Ejercicios
18.1 Vocabulario
Los términos y frases más habituales cuando trabajamos
con excepciones son:
1
# Dividir entre cero
2 try:
3 x =5/0
except:
4
print("Error división entre cero")
5
1
# Conversión fallida a número
2 try:
3 x = int("fred")
except:
4
print ("Error al intentar convertir fred a número")
5
1
numero_introducido = False
2
while not numero_introducido:
3 numero_cadena = input("Introduce un número entero: ")
4 try:
5 n = int(numero_cadena)
numero_introducido = True
6
except:
7 print ("Error, número entero incorrecto")
1
# Error al abrir un archivo
2 try:
3 mi_archivo = open("miarchivo.txt")
except:
4
print("Error al abrir el archivo")
5
Podemos capturar y procesar, de maneras distintas,
muchos tipos de errores. Por ejemplo, sería muy útil
mostrarle al usuario un mensaje de error más preciso
que un simple; “ocurrió un error.”
1 import sys
# Errores múltiples
2
try:
3 mi_archivo = open("miarchivo.txt")
4 mi_linea = mi_archivo.readline()
5 mi_entero = int(s.strip())
8 except ValueError:
13
14
15
16
1 """
2 # Sample Python/Pygame Programs
5 """
def obtener_puntuacion_mas_alta():
6
# Puntuación más alta por defecto
7
puntuacion_mas_alta = 0
8 # Intentemos leer la puntuación más alta desde un archivo
9 try:
13 except IOError:
23 except IOError:
puntuacion_mas_alta = obtener_puntuacion_mas_alta()
28
# Obtenemos la puntuación del juego en curso
29 puntuacion_actual = 0
30 try:
38 guardar_puntuacion_mas_alta(puntuacion_actual)
else:
39
print("Mejor suerte la próxima vez.")
40 # Llamamos a la función principal, empezamos el juego
41 if __name__ == "__main__":
main()
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
1 try:
2 x =5/0
3 except ZeroDivisionError as e:
print(e)
4
La variable e apunta hacia una información imprimible
más amplia sobre la excepción en cuestión. Podemos
hacer más cosas con los objetos excepción, pero
lamentablemente, eso está más allá del ámbito de este
capítulo.
1
2 # Generamos excepciones
def get_input():
3
entrada_usuario = input("Escribe algo: ")
4
if len(entrada_usuario) == 0:
5 raise IOError("No has escrito nada")
6 get_input()
18.7 Repaso
18.7.1 Test
18.7.2 Ejercicios
Figure 19.2:
Página Web con tablas
Esto funciona recursivamente. Cada caja contiene una
página web, que puede tener una caja, la cual podría
contener otra página web, tal como vemos en la
Figura 19.3.
Figure 19.3:
Página Web con recursividad
1 def f():
g()
2
print("f")
3
def g():
4 print("g")
5 f()
6
7
8
1
def f():
2
print("Hola")
3
f()
4 f()
Output:
Llamada
de recur
Controlando los niveles de recursividad sividad,
nivel 1
1
Llamada
2 de recur
def f(nivel): sividad,
3 # Imprime el nivel en el que nos encontramos nivel 2
1
# Este programa calcula el factorial de un número
2
# SIN emplear recursividad
3 def factorial_norecursivo(n):
4 respuesta = 1
1
# Este programa calcula el factorial de un número
2
# USANDO recursividad
3 def factorial_recursivo(n):
4 if(n == 1):
return n
5
else:
6
return n * factorial_recursivo(n-1)
7
27
28
29
30
31
32
recursive_rectangles.py
1 """
5 http://simpson.edu/computer-science/
6 """
import pygame
7
# Definimos algunos colores
8 NEGRO = (0, 0, 0)
13 1)
17 y += alto * .1
largo *= .8
18
alto *= .8
19 # Lo dibujamos otra vez recursivamente
pygame.init()
21
# Establecemos el alto y largo de la pantalla
22
dimensiones = [700, 500]
23 pantalla = pygame.display.set_mode(dimensiones)
24 pygame.display.set_caption("Mi Juego")
27 reloj = pygame.time.Clock()
38 reloj.tick(60)
# Pórtate bien con el IDLE. Si nos olvidamos de esta línea, el programa se 'colgará
39
# en la salida.
40 pygame.quit()
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
19.6 Fractales
Los fractales son definidos recursivamente. Aquí
puedes observar un fractal muy básico, que nos muestra
cómo cambia, en función de cuan “profunda” sea la
recursividad.
Figure 19.5: Fractal Recursivo nivel 0
Figure 19.6: Fractal Recursivo nivel 1
Figure 19.7: Fractal Recursivo nivel 2
Figure 19.8: Fractal Recursivo nivel 3
fractal.py
1 """
6 """
import pygame
7
# Definimos algunos colores
8
NEGRO = (0, 0, 0)
9 BLANCO = (255, 255, 255)
# Dibujamos el rectángulo
11
# pygame.draw.rect(pantalla,NEGRO,[x,y,largo,alto],1)
12 pygame.draw.line(pantalla,
13 NEGRO,
14 [x + largo*.25,alto//2+y],
[x + largo*.75,alto//2+y],
15
3)
16 pygame.draw.line(pantalla,
17 NEGRO,
[x+largo*.25,(alto*.5)//2+y],
18
[x+largo*.25,(alto*1.5)//2+y],
19
3)
20 pygame.draw.line(pantalla,
21 NEGRO,
[x + largo*.75,(alto*.5)//2+y],
22
[x + largo*.75,(alto*1.5)//2+y],
23 3)
24 if cuenta > 0:
cuenta -= 1
25
# Arriba izquierda
26
dibujo_recursivo(x, y, largo // 2, alto // 2, cuenta)
27 # Arriba derecha
28 dibujo_recursivo(x + largo // 2, y, largo // 2, alto // 2, cuenta)
# Abajo izquierda
29
dibujo_recursivo(x, y + largo // 2, largo // 2, alto // 2, cuenta)
30 # Abajo derecha
pygame.init()
32
# Establecemos el alto y largo de la pantalla
33
dimensiones = [700, 500]
34 pantalla = pygame.display.set_mode(dimensiones)
35 pygame.display.set_caption("Mi Juego")
42 hecho = True # Marca que ya lo hemos hecho, de forma que abandonamos el bucle
reloj.tick(20)
50
# Pórtate bien con el IDLE. Si nos olvidamos de esta línea, el programa se 'colgará
51
# en la salida.
52 pygame.quit()
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
limite_superior = pos_intermedia
8
else:
9
encontrado = True
10 if encontrado:
11 print("El nombre se encuentra en la posición",pos_intermedia)
else:
12
print("El nombre no estaba en la lista.")
13 busqueda_binaria_norecursiva(nombre_en_lista,"Morgiana la Arpía")
14
15
16
17
18
19
5 pos_intermedia + 1,
limite_superior)
6
elif lista_busqueda[pos_intermedia] > clave:
7 busqueda_binaria_recursiva(lista_busqueda,
8 clave,
limite_inferior,
9
pos_intermedia )
10
else:
11 print("Encontrado en la posición", pos_intermedia)
12 limite_inferior = 0
13 limite_superior = len(nombre_en_lista) - 1
busqueda_binaria_recursiva(nombre_en_lista,
14
"Morgiana la Arpía",
15 limite_inferior,
16 limite_superior)
17
18
19
20
21
19.8 Repaso
19.8.1 Test
11 {:^10d} 11 Centrado
Showing 1 to 11 of 11 entries
1
import random
2
for i in range(10):
3
x = random.randrange(20)
4 print(x)
13
10
18
14
5
Podemos utilizar el formateo para que, alineándolos
hacia la derecha, la lista de números presente un mejor
aspecto. El primer paso es usar el comando format sobre la
cadena. Observa:
1
import random
2
for i in range(10):
3
x = random.randrange(20)
4 print("{}".format(x) )
15
12
3
8
15
12
1
2import random
for i in range(10):
3
x = random.randrange(20)
4print("{:2}".format(x) )
5
7
15
12
15
12
8
Esto está mejor; hemos alineado a la derecha los
números! Pero cómo funciona? La expresión :2 que
hemos añadido es todo menos intuitiva.
1
import random
2
for i in range(10):
3
x = random.randrange(100000)
4 print( "{:6}".format(x) )
5
Esto produce un resultado justificado a la derecha, pero
aún no luce todo lo bien que debiera:
18394
72242
97508
21583
11508
76064
88756
77413
7930
81095
1
import random
2
for i in range(10):
3
x = random.randrange(100000)
4 print( "{:6,}".format(x) )
65,732
30,248
13,802
17,177
3,584
7,598
21,672
82,900
72,838
48,557
1 x =5
2 y = 66
3 z = 777
1 x =5
2 y = 66
3 z = 777
C - ' 777' A - ' 5' B - ' 66' C y otra vez - ' 777'
20.2 Cadenas
Veamos ahora cómo formateamos cadenas de texto.
1
mi_fruta = ["Manzanas", "Naranjas", "Uvas", "Peras"]
2
mis_calorias = [4, 300, 70, 30]
3
for i in range(4):
4 print(mi_fruta[i], "son", mis_calorias[i], "calorías.")
1
mi_fruta = ["Manzanas", "Naranjas", "Uvas", "Peras"]
2
mis_calorias = [4, 300, 70, 30]
3
for i in range(4):
4 print("{:7} son {:3} calorías.".format(mi_fruta[i], mis_calorias[i]) )
1
mi_fruta = ["Manzanas", "Naranjas", "Uvas", "Peras"]
2
mis_calorias = [4, 300, 70, 30]
3
for i in range(4):
4 print("{:>7} son {:<3} calorías.".format(mi_fruta[i], mis_calorias[i]) )
Hora 8:56
Hora 8:57
Hora 8:58
Hora 8:59
Hora 9:0
Hora 9:1
Hora 9:2
Hora 08:56
Hora 08:57
Hora 08:58
Hora 08:59
Hora 09:00
Hora 09:01
Hora 09:02
1
2 x = 0.1
y = 123.456789
3
print("{:.1} {:.1}".format(x,y))
4
print("{:.2} {:.2}".format(x,y))
5 print("{:.3} {:.3}".format(x,y))
6 print("{:.4} {:.4}".format(x,y))
print("{:.5} {:.5}".format(x,y))
7
print("{:.6} {:.6}".format(x,y))
8 print()
9 print("{:.1f} {:.1f}".format(x,y))
print("{:.2f} {:.2f}".format(x,y))
10
print("{:.3f} {:.3f}".format(x,y))
11
print("{:.4f} {:.4f}".format(x,y))
12 print("{:.5f} {:.5f}".format(x,y))
13 print("{:.6f} {:.6f}".format(x,y))
14
15
0.1 1e+02
0.1 1.2e+02
0.1 1.23e+02
0.1 123.5
0.1 123.46
0.1 123.457
0.1 123.5
0.10 123.46
0.100 123.457
0.1000 123.4568
0.10000 123.45679
0.100000 123.456789
print("'{:10.2}' '{:10.2}'".format(x,y))
5
print("'{:10.3}' '{:10.3}'".format(x,y))
6
print("'{:10.4}' '{:10.4}'".format(x,y))
7 print("'{:10.5}' '{:10.5}'".format(x,y))
8 print("'{:10.6}' '{:10.6}'".format(x,y))
print()
9
print("'{:10.1f}' '{:10.1f}'".format(x,y))
10
print("'{:10.2f}' '{:10.2f}'".format(x,y))
11 print("'{:10.3f}' '{:10.3f}'".format(x,y))
12 print("'{:10.4f}' '{:10.4f}'".format(x,y))
print("'{:10.5f}' '{:10.5f}'".format(x,y))
13
print("'{:10.6f}' '{:10.6f}'".format(x,y))
14
15
1
2 precio1 = 3.07
6 print("------------")
print("Total: ${0:5.2f}".format(total1) )
7
8
1
precio1 = 3.07
2
impuesto1 = precio1 * 0.06
3
total1 = precio1 + impuesto1
4 print("Precio: ${0:5.2f}".format(precio1))
5 print("Impuesto: {0:5.2f}".format(impuesto1))
print("------------")
6
print("Total: ${0:5.2f}".format(total1))
7 precio2 = 5.07
8 impuesto2 = precio2 * 0.06
print()
10
print("Precio: ${0:5.2f}".format(precio2))
11 print("Impuesto: {0:5.2f}".format(impuesto2))
12 print("------------")
print("Total: ${0:5.2f}".format(total2))
13
print()
14
gran_total = total1 + total2
15 print("Gran total: ${0:5.2f}".format(gran_total))
16
17
18
19
20
21
22
23
Ésta es la salida:
Precio: $ 3.07
Impuesto: 0.18
------------
Total: $ 3.25
Precio: $ 5.07
Impuesto: 0.30
------------
Total: $ 5.37
Precio: $3.070
Impuesto: 0.184
------------
Total: $3.254
Precio: $5.070
Impuesto: 0.304
------------
Total: $5.374
1 precio1 = 3.07
5 print("------------")
print("Total: ${0:5.2f}".format(total1))
6
precio2 = 5.07
7
impuesto2 = round(precio2 * 0.06,2)
8 total2 = precio2 + impuesto2
9 print()
10 print("Precio: ${0:5.2f}".format(precio2))
print("Impuesto: {0:5.2f}".format(impuesto2))
11
print("------------")
12 print("Total: ${0:5.2f}".format(total2))
13 print()
Precio: $ 3.07
Impuesto: 0.18
------------
Total: $ 3.25
Precio: $ 5.07
Impuesto: 0.30
------------
Total: $ 5.37
1
x = 1234.5678
2 print(round(x, 2))
3 print(round(x, 1))
4 print(round(x, 0))
print(round(x, -1))
5
print(round(x, -2))
6
1234.57
1234.6
1235.0
1230.0
1200.0
1
2 # Usamos el formateo de cadenas de Python para añadir ceros al principio
20.7 Repaso
20.7.1 Test