Primer dÃa (PDF, 13.3 MB)
Primer dÃa (PDF, 13.3 MB)
Primer dÃa (PDF, 13.3 MB)
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
1<br />
Sunday, April 7, 2013<br />
1
Objetivo<br />
• ¡Aprender a programar en Python!<br />
• No es lo mismo que “aprender a programar” a secas.<br />
No aspiramos a escribir “Fortran en Python”. Los que<br />
ya sabéis programar tendréis que olvidar algunas de<br />
las cosas que sabéis – mientras estéis aquí.<br />
• Pero 20 horas tan sólo nos permitirán echar un<br />
vistazo muy superficial a todo el lenguaje...<br />
en el mejor de los casos.<br />
• Establecer unas bases sólidas para el<br />
aprendizaje por nuestra cuenta.<br />
• La participación es fundamental.<br />
2<br />
Sunday, April 7, 2013<br />
2
¡Volvernos renacentistas!<br />
3<br />
Sunday, April 7, 2013<br />
3
Evaluaciones<br />
• Agradeceremos enormemente cualquier sugerencia<br />
que nos hagáis sobre el temario, estilo y desarrollo<br />
del curso.<br />
• Por cualquier medio; ya sea en persona, por correo<br />
electrónico o mediante amenazas por teléfono de<br />
madrugada.<br />
• Si esperáis al viernes para decir algo podréis mejorar<br />
la experiencia de los que vengan detrás, pero no la<br />
vuestra. Hablad ahora o callad hasta la siguiente<br />
convocatoria.<br />
4<br />
Sunday, April 7, 2013<br />
4
Evaluaciones<br />
Y ahora, explicado en el lenguaje del siglo XXI<br />
Nosotros Nosotros<br />
Vosotros<br />
5<br />
A la UDIT<br />
Sunday, April 7, 2013<br />
5
Diplomas<br />
• Evaluación basada en asistencia, no en el rendimiento ni en<br />
los conocimientos adquiridos. Basta con venir y firmar cada<br />
día para obtener el certificado.<br />
• Decisión del Gabinete de Formación, no nuestra.<br />
• Todos valoramos nuestro tiempo y estamos aquí para<br />
aprender lo máximo posible, pero para aquellos que queráis<br />
un desafío durante el curso, ofrecemos la posibilidad de<br />
obtener nuestros propios diplomas no-oficiales.<br />
• Sin utilidad alguna en ningún escenario concebible, pero son<br />
bonitos y, aunque muy improbable, podrían convertirse en<br />
valiosos algún día – ¡como los cheques de Donald Knuth!<br />
• Pero ante todo es un pequeño y divertido desafío.<br />
6<br />
Sunday, April 7, 2013<br />
6
Arbeit macht frei<br />
Hacer todos los ejercicios que se vean en clase cada día,<br />
mandándonoslos por correo electrónico para que os los<br />
corrijamos personalmente y os enviemos nuestros comentarios.<br />
7<br />
Sunday, April 7, 2013<br />
7
Masters of the Universe<br />
Otorgado a los dos mejores alumnos del curso (¡percentil 90!),<br />
aquellos que con más entusiasmo destaquen en la asimilación,<br />
ejecución y proselitismo de nuestra nueva ideología Pythónica.<br />
8<br />
Sunday, April 7, 2013<br />
8
Python<br />
como calculadora<br />
9<br />
Sunday, April 7, 2013<br />
9
Aritmética básica<br />
>>> 2 + 2<br />
4<br />
10<br />
Sunday, April 7, 2013<br />
10
Aritmética básica<br />
>>> 2.1 + 4.9<br />
7.0<br />
11<br />
Sunday, April 7, 2013<br />
11
Aritmética básica<br />
>>> 8 - 5<br />
3<br />
12<br />
Sunday, April 7, 2013<br />
12
Aritmética básica<br />
>>> 3 * 4<br />
12<br />
13<br />
Sunday, April 7, 2013<br />
13
Aritmética básica<br />
>>> 9 / 3<br />
3<br />
14<br />
Sunday, April 7, 2013<br />
14
Aritmética básica<br />
>>> 3 / 4<br />
0<br />
¿Por qué?<br />
15<br />
Sunday, April 7, 2013<br />
15
¡Estamos operando con enteros!<br />
int / int = int<br />
3 / 4 = 0.75<br />
int(0.75) = 0<br />
16<br />
Sunday, April 7, 2013<br />
16
Necesitamos números reales<br />
float / float = float<br />
float / int<br />
int / float<br />
= float<br />
= float<br />
17<br />
Sunday, April 7, 2013<br />
17
Pero esto no funcionaría...<br />
>> float(3/4)<br />
float(int)<br />
float(0) = 0.0<br />
18<br />
Sunday, April 7, 2013<br />
18
int() trunca...<br />
>> int(0.49) = 0<br />
>> int(1.50) = 1<br />
>> int(2.9) = 2<br />
19<br />
Sunday, April 7, 2013<br />
19
... y round() redondea<br />
>> round(0.49) = 0<br />
>> round(1.50) = 2<br />
>> round(2.9) = 3<br />
20<br />
Sunday, April 7, 2013<br />
20
from<br />
_ _future_ _ import division<br />
>> 1 / 4<br />
0.25<br />
>> 4 / 7<br />
0.5714285714285714<br />
21<br />
Sunday, April 7, 2013<br />
21
Python 2.7<br />
• Publicada en julio de 2010<br />
• Última versión de la serie 2.x!<br />
• El futuro: Python 3000;! nueva versión del lenguaje<br />
incompatible con 2.x. Mejorada, reorganizada, unificada.<br />
Última versión: Python 3.3 (09/2012)<br />
• La mayor parte del código existente sigue siendo 2.x. De<br />
ahí que lo usemos en este curso. Y una vez podamos<br />
defendernos en Python 2.x, el salto a Py3K es trivial (y<br />
automatizable: herramienta 2to3)<br />
• Python 3000 es objetivamente mejor que 2.x. Ver<br />
presentación “Python 3.3: Trust Me, It's Better Than<br />
Python 2.7”, de Brett Cannon (PyCon US 2013)<br />
22<br />
Sunday, April 7, 2013<br />
22
from<br />
_ _future_ _ import division<br />
• La división funciona como esperaríamos desde Python<br />
3.0. Pero en realidad estaba implementado desde la<br />
versión 2.2 (diciembre de 2001), sólo que su uso es<br />
opcional.<br />
• Permite una transición suave, a años vista.<br />
• La máquina del tiempo de<br />
los creadores de Python.<br />
23<br />
Sunday, April 7, 2013<br />
23
Aritmética básica<br />
>>> 7 % 2<br />
1<br />
24<br />
Sunday, April 7, 2013<br />
24
Aritmética básica<br />
>>> 10 ** 2<br />
1024<br />
25<br />
Sunday, April 7, 2013<br />
25
Aritmética básica<br />
>>> (1 + 3) * 4 + 2<br />
18<br />
26<br />
Sunday, April 7, 2013<br />
26
Long integers<br />
>> 1024 ** 2 ** 2<br />
1099511627776L<br />
¿Y esa L?<br />
27<br />
Sunday, April 7, 2013<br />
27
Long integers<br />
• Enteros normales utilizan al menos 32 bits (máximo<br />
entero positivo representable 2,147,483,647; en el caso<br />
de 64 bits: 9,223,372,036,854,775,807)<br />
• Por encima de ese umbral Python usa automáticamente<br />
los long ints, limitados únicamente por la memoria<br />
disponible. En otras palabras: precisión ilimitada.<br />
• En la práctica: Python se encarga de todo. Tan sólo<br />
necesitamos saber que para valores muy grandes<br />
aparecerá esa L al final del número.<br />
28<br />
Sunday, April 7, 2013<br />
28
Variables<br />
>>> x = 8.5<br />
>>> x<br />
8.5<br />
29<br />
Sunday, April 7, 2013<br />
29
Variables<br />
>>> x = 1<br />
>>> y = 2<br />
>>> x + y<br />
3<br />
30<br />
Sunday, April 7, 2013<br />
30
Variables<br />
int x;<br />
double y;<br />
31<br />
Sunday, April 7, 2013<br />
31
Variables<br />
int x;<br />
x = 5.6;<br />
32<br />
Sunday, April 7, 2013<br />
32
Variables<br />
>>> x = 56.6<br />
>>> x + 2<br />
78.6<br />
33<br />
Sunday, April 7, 2013<br />
33
Asignación múltiple<br />
>>> x, y = 5, 3<br />
>>> x + y<br />
8<br />
34<br />
Sunday, April 7, 2013<br />
34
Asignación múltiple<br />
>>> x = y = 3<br />
>>> x<br />
3<br />
35<br />
Sunday, April 7, 2013<br />
35
Variables no declaradas<br />
>>> x = 1<br />
>>> x + y<br />
NameError: name 'y' is<br />
not defined<br />
36<br />
Sunday, April 7, 2013<br />
36
Operadores de comparación<br />
>>> 2 == 3<br />
False<br />
37<br />
Sunday, April 7, 2013<br />
37
Operadores de comparación<br />
>>> 2 != 3<br />
True<br />
38<br />
Sunday, April 7, 2013<br />
38
Operadores de comparación<br />
>>> 5 < 3<br />
False<br />
39<br />
Sunday, April 7, 2013<br />
39
Operadores de comparación<br />
>>> 5 > 5<br />
False<br />
40<br />
Sunday, April 7, 2013<br />
40
Operadores de comparación<br />
>>> 5 >= 5<br />
True<br />
41<br />
Sunday, April 7, 2013<br />
41
Operadores lógicos<br />
>>> not 2 > 3<br />
True<br />
42<br />
Sunday, April 7, 2013<br />
42
Operadores lógicos<br />
>>> x = 1.56<br />
>>> x >= 0 and x
Operadores lógicos<br />
>>> x = 1.56<br />
>>> x >= 0 or x
Operadores lógicos<br />
>>> x = 1.56<br />
>>> 0
Tipos de datos básicos<br />
• int → entero<br />
• float → real<br />
• bool → lógico<br />
• string → texto<br />
46<br />
Sunday, April 7, 2013<br />
46
Tipos de datos básicos<br />
>>> x = 4.5<br />
>>> type(x)<br />
<br />
47<br />
Sunday, April 7, 2013<br />
47
Strings<br />
• Cadenas de texto:<br />
“¡Hola mundo!”<br />
• Comillas simples o dobles:<br />
‘¡Hola mundo!’<br />
• Inmutables<br />
48<br />
Sunday, April 7, 2013<br />
48
Strings<br />
>>> nombre = ‘Sara’<br />
>>> nombre<br />
‘Sara’<br />
49<br />
Sunday, April 7, 2013<br />
49
Strings<br />
>>> frase = ‘Sara dijo “¡hola!”’<br />
>>> frase<br />
‘Sara dijo “¡hola!”’<br />
50<br />
Sunday, April 7, 2013<br />
50
Strings<br />
Secuencia de escape:<br />
“Sara dijo \“¡hola!\””<br />
51<br />
Sunday, April 7, 2013<br />
51
Strings<br />
Triple entrecomillado:<br />
“““ Sara dijo “¡hola!” ”””<br />
52<br />
Sunday, April 7, 2013<br />
52
Slices<br />
a[index]<br />
Devuelve el index-1 elemento<br />
a = “Abstulit qui dedit”<br />
a[0] = “A”<br />
a[6] = “i”<br />
a[-1] = “t”<br />
53<br />
Sunday, April 7, 2013<br />
53
El primer elemento<br />
tiene índice = 0<br />
54<br />
Sunday, April 7, 2013<br />
54
Edsger W. Dijkstra<br />
“Why numbering should start at zero” (1982)<br />
55<br />
Sunday, April 7, 2013<br />
55
Para representar la secuencia 1, 2, ..., 10<br />
tenemos cuatro posibilidades:<br />
a) 1 ≤ i < 11<br />
b) 0 < i ≤ 10<br />
c) 1 ≤ i ≤ 10<br />
d) 0 < i < 11<br />
b) nos obliga a utilizar un número no natural<br />
(cero) Tanto para a) como determinar b) tienen un intervalo la ventaja de números que la<br />
diferencia entre naturales. los límites Poco elegante. del intervalo (11-1 y<br />
10-0) es igual al número de elementos de éste<br />
56<br />
Sunday, April 7, 2013<br />
56
Para representar una secuencia de N elementos,<br />
utilizando la nomenclatura a), tenemos dos opciones:<br />
a) 1 ≤ i < N+1<br />
b) 0 ≤ i < N<br />
La opción b) es más simple e intuitiva: el límite superior nos<br />
indica directamente el número de elementos en el intervalo<br />
57<br />
Sunday, April 7, 2013<br />
57
Slices<br />
a[start:end]<br />
Elementos desde start hasta end-1<br />
a = “Alea jacta est”<br />
a[0:10] = “Alea jacta”<br />
a[5:10] = “jacta”<br />
a[5:6] = “j”<br />
a[5:5] = “”<br />
58<br />
Sunday, April 7, 2013<br />
58
Slices<br />
a[start:]<br />
Elementos desde start hasta el final<br />
a = “Fabricando fit faber”<br />
a[12:] = “fit faber”<br />
a[-5:] = “faber”<br />
59<br />
Sunday, April 7, 2013<br />
59
Slices<br />
a[:end]<br />
Elementos desde el comienzo hasta end-1<br />
a = “In vino veritas”<br />
a[:2] = “In”<br />
a[:8] = “In vino”<br />
a[:-5] = “In vino ve”<br />
60<br />
Sunday, April 7, 2013<br />
60
Slices<br />
a[start:end:step]<br />
De start a end de step en step elementos<br />
a = “Is fecit, cui prodest”<br />
a[::2] = “I ei,cipoet”<br />
a[:12:3] = “Ifi ”<br />
a[::-1] = “tsedorp iuc ,ticef sI”<br />
61<br />
Sunday, April 7, 2013<br />
61
Inmutables<br />
>>> nombre = “Sara”<br />
>>> nombre[0] = “M”<br />
TypeError: 'str' object<br />
does not support item<br />
assignment<br />
62<br />
Sunday, April 7, 2013<br />
62
Inmutables<br />
>>> nombre = “Sara”<br />
>>> nombre = “Mara”<br />
>>> nombre<br />
‘Mara’<br />
63<br />
Sunday, April 7, 2013<br />
63
Concatenación<br />
>> nombre = “Sara”<br />
>> nombre = “M” + nombre[1:]<br />
>> nombre<br />
‘Mara’<br />
64<br />
Sunday, April 7, 2013<br />
64
Subcadenas<br />
>>> “ere” in “sapere aude”<br />
True<br />
65<br />
Sunday, April 7, 2013<br />
65
Subcadenas<br />
>>> “sapere aude”.find(“ere”)<br />
3<br />
La subcadena existe y empieza en el<br />
elemento 3 (es decir, el cuarto)<br />
66<br />
Sunday, April 7, 2013<br />
66
Subcadenas<br />
>>> “flux” in “et veritas”<br />
False<br />
67<br />
Sunday, April 7, 2013<br />
67
Subcadenas<br />
>>> “et veritas”.find(“flux”)<br />
-1<br />
La subcadena no existe<br />
68<br />
Sunday, April 7, 2013<br />
68
Tamaño<br />
>>> len(“victoria aut mors”)<br />
17<br />
69<br />
Sunday, April 7, 2013<br />
69
Tamaño<br />
>>> comic = “V de Vendetta”<br />
>>> len(comic)<br />
13<br />
70<br />
Sunday, April 7, 2013<br />
70
Mayúsculas<br />
>>> “hoygan”.upper()<br />
“HOYGAN”<br />
71<br />
Sunday, April 7, 2013<br />
71
Minúsculas<br />
>>> vocales = “AEIOU”<br />
>>> vocales.lower()<br />
“aeiou”<br />
72<br />
Sunday, April 7, 2013<br />
72
Eliminando espacios<br />
>>> planeta = “ Saturno”<br />
>>> planeta.lstrip()<br />
“Saturno”<br />
73<br />
Sunday, April 7, 2013<br />
73
Eliminando espacios<br />
>>> lugar = “En el Sol ”<br />
>>> print lugar.rstrip(), “hace calor”<br />
En el Sol hace calor<br />
74<br />
Sunday, April 7, 2013<br />
74
Eliminando espacios<br />
>>> apellido = “ Lee ”<br />
>>> print “Bruce”, apellido.strip(), “Jr.”<br />
Bruce Lee Jr.<br />
75<br />
Sunday, April 7, 2013<br />
75
Ejercicios<br />
Manipulación de cadenas utilizando el intérprete<br />
cadena = “Cabeza grande, ojos hermosos”<br />
1. ¿El tamaño de la cadena?<br />
2. Los primeros cinco caracteres de la cadena<br />
3. Los siete últimos caracteres.<br />
4. De los cinco primeros caracteres, los que ocupan posiciones pares.<br />
5. De los últimos trece caracteres, los de posiciones impares<br />
6. En mayúscula, los caracteres en posiciones múltiplo de tres<br />
7. De dos en dos, del caracter en la posición 4 al de la 17<br />
8. ¿Está el caracter “x” en la cadena?<br />
9. ¿Y “o”, en mayúscula o minúscula?<br />
76<br />
Sunday, April 7, 2013<br />
76
Módulos<br />
(un primer vistazo)<br />
Instrucciones almacenadas<br />
en un fichero y ejecutadas<br />
por el intérprete de Python<br />
77<br />
Sunday, April 7, 2013<br />
77
Módulos<br />
(un primer vistazo)<br />
x = 4<br />
y = 5<br />
x ** (y + 1)<br />
78<br />
Sunday, April 7, 2013<br />
78
Módulos<br />
(un primer vistazo)<br />
python fichero.py<br />
El nombre del módulo es fichero<br />
(sin la extensión .py)<br />
79<br />
Sunday, April 7, 2013<br />
79
Módulos<br />
(un primer vistazo)<br />
chmod +x fichero.py<br />
Hacemos el fichero ejecutable<br />
80<br />
Sunday, April 7, 2013<br />
80
Módulos<br />
(un primer vistazo)<br />
#! /usr/bin/env python<br />
<strong>Primer</strong>a línea del módulo: especifica que debe utilizarse<br />
Python para ejecutar el código contenido en el fichero<br />
81<br />
Sunday, April 7, 2013<br />
81
Módulos<br />
(un primer vistazo)<br />
udit-d41:~ vterron$ python ejemplo.py<br />
udit-d41:~ vterron$<br />
82<br />
Sunday, April 7, 2013<br />
82
Módulos<br />
(un primer vistazo)<br />
udit-d41:~ vterron$ ./ejemplo.py<br />
udit-d41:~ vterron$<br />
83<br />
Sunday, April 7, 2013<br />
83
print<br />
>>> print “Abre las puertas, HAL”<br />
‘Abre las puertas, HAL”<br />
84<br />
Sunday, April 7, 2013<br />
84
print<br />
>>> print “Lo siento,”<br />
>>> print “Dave”<br />
‘Lo siento,’<br />
‘Dave’<br />
Añade salto de línea al final<br />
85<br />
Sunday, April 7, 2013<br />
85
print<br />
>>> print “Me temo que”, “no puedo”<br />
‘Me temo que no puedo’<br />
Inserta espacio entre las cadenas mostradas por pantalla<br />
86<br />
Sunday, April 7, 2013<br />
86
print<br />
>>> x = 2<br />
>>> y = 3<br />
>>> print x, “^”, y, “=”, 2**3<br />
2 ^ 3 = 8<br />
87<br />
Sunday, April 7, 2013<br />
87
Formateo de cadenas<br />
• Pero print sólo nos proporciona una funcionalidad<br />
básica de manipulación de cadenas; para un<br />
control más avanzado necesitamos necesitamos<br />
formatear la cadena.<br />
• Idéntico al antediluviano y universal printf,<br />
presente en cualquier lenguaje de programación<br />
digno de ese nombre.<br />
• Nos da control absoluto de la representación por<br />
pantalla de la información. Entre otro, podemos<br />
especificar tipo, precisión, signo, alineamiento,<br />
entre otros.<br />
88<br />
Sunday, April 7, 2013<br />
88
Formateo de cadenas<br />
>>> print “Numero: %d” % 42<br />
Número: 42<br />
>>> print “Pi: %f” % 3.1415927<br />
Pi: 3.141593<br />
>>> print “Pi: %.3f” % 3.1415927<br />
Pi: 3.142<br />
89<br />
Sunday, April 7, 2013<br />
89
Formateo de cadenas<br />
>>> print “%d + %d = %d” % (5, 3, 8)<br />
5 + 3 = 8<br />
>>> b = 10.4<br />
>>> e = 2<br />
>>> print “%f ** %d = %.2d” % (b, e, b ** e)<br />
10.400000 ** 2 = 108.16<br />
90<br />
Sunday, April 7, 2013<br />
90
Comentarios<br />
#<br />
A partir del primer # y hasta el final de la línea<br />
91<br />
Sunday, April 7, 2013<br />
91
Comentarios<br />
>>> x = 2<br />
>>> x = x + 1 # incrementa x en uno<br />
>>> x<br />
3<br />
92<br />
Sunday, April 7, 2013<br />
92
Listas<br />
• Serie de elementos separados por comas,<br />
encerrados entre corchetes.<br />
• Los elementos pueden ser de distinto tipo<br />
• Dinámicas: número variable de elementos<br />
• Mutables<br />
93<br />
Sunday, April 7, 2013<br />
93
Listas<br />
>>> v = [1, 2, 3]<br />
>>> v<br />
[1, 2, 3]<br />
94<br />
Sunday, April 7, 2013<br />
94
Listas<br />
>>> v = [1, 2.0, “tres”]<br />
>>> print v[1]<br />
2.0<br />
95<br />
Sunday, April 7, 2013<br />
95
Listas<br />
>>> v = []<br />
>>> v<br />
[]<br />
96<br />
Sunday, April 7, 2013<br />
96
Asignación<br />
>>> v = [4, 7, 3, 8]<br />
>>> v[-1] = 0<br />
>>> v<br />
[4, 7, 3, 0]<br />
97<br />
Sunday, April 7, 2013<br />
97
Tamaño<br />
>>> v = [1, 2.0, “tres”]<br />
>>> len(v)<br />
3<br />
98<br />
Sunday, April 7, 2013<br />
98
Inserción<br />
>>> v = [1, 3, 4]<br />
>>> v.append(5)<br />
>>> v<br />
[1, 2, 3, 5]<br />
99<br />
Sunday, April 7, 2013<br />
99
Inserción<br />
>>> v = [1, 3, 4]<br />
>>> v.insert(9, 2)<br />
>>> v<br />
[1, 3, 9, 4]<br />
Añade el elemento 9 en la posición de index = 2<br />
100<br />
Sunday, April 7, 2013<br />
100
Eliminación<br />
>>> v = [1, 3, 4]<br />
>>> v.remove(3)<br />
>>> v<br />
[1, 4]<br />
Borrado por valor<br />
101<br />
Sunday, April 7, 2013<br />
101
Eliminación<br />
>>> v = [9, 5, 8, 5, 9]<br />
>>> del v[3]<br />
>>> v<br />
[9, 5, 8, 9]<br />
Borrado por posición<br />
102<br />
Sunday, April 7, 2013<br />
102
Búsqueda<br />
>>> v = [7, 0, 7]<br />
>>> 7 in v<br />
True<br />
103<br />
Sunday, April 7, 2013<br />
103
Búsqueda<br />
>>> v = [7, 0, 7]<br />
>>> v.index(7)<br />
0<br />
104<br />
Sunday, April 7, 2013<br />
104
Búsqueda<br />
>>> v = [7, 0, 7]<br />
>>> 3 in v<br />
False<br />
105<br />
Sunday, April 7, 2013<br />
105
Búsqueda<br />
>>> v = [7, 0, 7]<br />
>>> 8 not in v<br />
True<br />
106<br />
Sunday, April 7, 2013<br />
106
Búsqueda<br />
>>> v = [7, 0, 7]<br />
>>> v.index(3)<br />
ValueError: list.index(x): x<br />
not in list<br />
107<br />
Sunday, April 7, 2013<br />
107
Concatenación<br />
>>> [1, 2, 3] + [9, 8]<br />
[1, 2, 3, 9, 8]<br />
108<br />
Sunday, April 7, 2013<br />
108
Concatenación<br />
>>> x = [1, 2, 3]<br />
>>> x.append([9, 8])<br />
>>> x<br />
[1, 2, 3, [9, 8]]<br />
El cuarto elemento es ahora una lista<br />
109<br />
Sunday, April 7, 2013<br />
109
Máximo<br />
>>> max([7, 2, 5])<br />
7<br />
110<br />
Sunday, April 7, 2013<br />
110
Mínimo<br />
>>> x = [7, 2, 5]<br />
>>> min(x)<br />
2<br />
111<br />
Sunday, April 7, 2013<br />
111
Sumatorio<br />
>>> sum([7, 2, 5])<br />
14<br />
112<br />
Sunday, April 7, 2013<br />
112
Listas vacías<br />
>>> x = []<br />
>>> len(x)<br />
0<br />
113<br />
Sunday, April 7, 2013<br />
113
Listas vacías<br />
>>> x = []<br />
>>> bool(x)<br />
False<br />
Las listas vacías evalúan a False<br />
114<br />
Sunday, April 7, 2013<br />
114
Ejercicios<br />
Manipulación de listas utilizando el intérprete<br />
lista = [“primero”, 2, “3.5”, 4.0, “ultimo”]<br />
1. ¿El tamaño de la lista?<br />
2. El tamaño de la lista multiplicado por su segundo elemento<br />
3. El producto del segundo elemento de la lista por el tercero<br />
4. ¿Está 2 en la lista? ¿Y 2.0?<br />
5. Eliminar el primer elemento de la lista<br />
6. Eliminar ahora los dos últimos elementos simultaneamente<br />
7. ¿Está la lista vacía?<br />
8. Añadir el elemento “nuevo ultimo” a la lista.<br />
115<br />
Sunday, April 7, 2013<br />
115
Entrada de datos<br />
raw_input(mensaje)<br />
• Imprime mensaje por pantalla<br />
• Devuelve entrada en un string<br />
116<br />
Sunday, April 7, 2013<br />
116
Entrada de datos<br />
>>> persona = raw_input(“Nombre: ”)<br />
Nombre:<br />
Mr. Marshall<br />
>>> print “Bienvenido,”, persona<br />
Bienvenido, Mr. Marshall<br />
117<br />
Sunday, April 7, 2013<br />
117
Entrada de datos<br />
>>> x = raw_input(“x: ”)<br />
x:<br />
57<br />
>>> print 2*x<br />
5757<br />
118<br />
Sunday, April 7, 2013<br />
118
Entrada de datos<br />
• raw_input() siempre devuelve una<br />
cadena de texto<br />
• Necesitamos hacer una conversión<br />
al tipo de dato que necesitamos<br />
119<br />
Sunday, April 7, 2013<br />
119
Entrada de datos<br />
int * string concatena string int veces<br />
>>> 3 * “adios”<br />
“adiosadiosadios”<br />
De vuelta al ejemplo anterior...<br />
120<br />
Sunday, April 7, 2013<br />
120
Entrada de datos<br />
>>> x = int(raw_input(“x: ”))<br />
x:<br />
57<br />
>>> print 2*x<br />
114<br />
121<br />
Sunday, April 7, 2013<br />
121
Entrada de datos<br />
input(mensaje)<br />
• También imprime mensaje por pantalla<br />
• Pero la entrada es interpretada como una<br />
expresión de código Python<br />
122<br />
Sunday, April 7, 2013<br />
122
Entrada de datos<br />
>>> numeros = input(“Lista: ”)<br />
Nombre:<br />
[7, 8, 9]<br />
>>> del numeros[-1]<br />
>>> numeros<br />
[7, 8]<br />
123<br />
Sunday, April 7, 2013<br />
123
Entrada de datos<br />
>>> x = [1, 2]<br />
>>> x.append(input())<br />
18<br />
>>> x<br />
[1, 2, 18]<br />
124<br />
Sunday, April 7, 2013<br />
124
Entrada de datos<br />
>>> x = [7, 8]<br />
>>> x.append(input(“elemento: ”))<br />
elemento:<br />
y<br />
NameError: name 'y' is not defined<br />
La mayor parte del tiempo necesitamos raw_input<br />
125<br />
Sunday, April 7, 2013<br />
125
Estructuras de control<br />
Necesitamos modificar el flujo de ejecución del<br />
programa en función de los datos<br />
if<br />
for<br />
while<br />
126<br />
Sunday, April 7, 2013<br />
126
if<br />
Evalúa una condición y ejecuta un bloque de<br />
instrucciones si es verdadera<br />
>>> if 2 > 1:<br />
... print “obviamente”<br />
...<br />
obviamente<br />
127<br />
Sunday, April 7, 2013<br />
127
Bloque<br />
• Un bloque es un conjunto de instrucciones que<br />
se ejecutan secuencialmente<br />
• En este caso en particular, son aquellas<br />
instrucciones ejecutadas cuando la condición es<br />
verdadera<br />
• Python utiliza el indentado para reconocer las<br />
líneas que forman un bloque de instrucciones<br />
128<br />
Sunday, April 7, 2013<br />
128
if - else<br />
Evalúa una condición y ejecuta un bloque de instrucciones<br />
(bloque-if) si es verdadera. Si no lo es, ejecuta el otro bloque<br />
(bloque-else)<br />
>>> if 7 % 2 == 0:<br />
... print “es par”<br />
... else:<br />
... print “no par”<br />
...<br />
“no par”<br />
129<br />
Sunday, April 7, 2013<br />
129
if - elif - else<br />
• Para elegir entre más de dos opciones<br />
• Python ignora las demás condiciones en<br />
cuando una se cumple<br />
• Funcionalidad similar al switch de C/C++<br />
130<br />
Sunday, April 7, 2013<br />
130
if - elif - else<br />
>>> if 2 < 0:<br />
... print “negativo!”<br />
... elif 2 == 0:<br />
... print “nada!”<br />
... else:<br />
... print “positivo!”<br />
...<br />
“positivo!”<br />
131<br />
Sunday, April 7, 2013<br />
131
for<br />
Itera sobre los elementos de una secuencia<br />
>>> for i in [1, 2, 3]:<br />
... print i<br />
...<br />
1<br />
2<br />
3<br />
132<br />
Sunday, April 7, 2013<br />
132
for<br />
• El cuerpo del bloque (bloque-for) se ejecuta<br />
tantas veces como elementos tenga la secuencia<br />
(por ejemplo, caracteres en un string)<br />
• Usado para repetir un bloque de instrucciones<br />
para los que una variable toma diferentes<br />
valores.<br />
• ¿Cómo ejecutamos un bloque n veces?<br />
133<br />
Sunday, April 7, 2013<br />
133
ange(n)<br />
Genera una lista de n valores [0, 1, 2 ... n-1]<br />
>> range(7)<br />
[0, 1, 2, 3, 4, 5, 6]<br />
134<br />
Sunday, April 7, 2013<br />
134
ange(start, n)<br />
Genera la lista [start, start+1, ... n-1]<br />
>> range(3, 7)<br />
[3, 4, 5, 6]<br />
135<br />
Sunday, April 7, 2013<br />
135
ange(start, n, step)<br />
Genera la lista [start, start+step, ... n-1]<br />
>>> range(1, 11, 2)<br />
[1, 3, 5, 7, 9]<br />
136<br />
Sunday, April 7, 2013<br />
136
for<br />
>>> for i in range(3):<br />
... print “hola”<br />
...<br />
hola<br />
hola<br />
hola<br />
137<br />
Sunday, April 7, 2013<br />
137
for (en C++)<br />
for (int i = 0 ; i < 10 ; i++)<br />
cout
for<br />
for i in range(10):<br />
print i<br />
No utilizamos condiciones de inicio, parada e incremento, sino<br />
que especificamos claramente qué elementos se utilizan<br />
Más expresivo y seguro<br />
139<br />
Sunday, April 7, 2013<br />
139
for<br />
>>> for letra in “Sara”:<br />
... print letra<br />
...<br />
S<br />
a<br />
r<br />
a<br />
140<br />
Sunday, April 7, 2013<br />
140
for<br />
¿Y si dentro del bucle necesitamos conocer el índice del elemento?<br />
>>> numeros = [2, 4, 5]<br />
index 0 -> 2<br />
index 1 -> 4<br />
index 2 -> 5<br />
141<br />
Sunday, April 7, 2013<br />
141
for<br />
>>> numeros = [2, 4, 5]<br />
>>> for i in range(len(numeros)):<br />
... print i, “->”, numeros[i]<br />
142<br />
Sunday, April 7, 2013<br />
142
enumerate(sec)<br />
Permite iterar simultáneamente sobre el<br />
índice y sobre el elemento de una secuencia<br />
>>> for i, num in enumerate([1, 2, 3]):<br />
... print i, “->”, num<br />
143<br />
Sunday, April 7, 2013<br />
143
while<br />
Ejecuta el bucle mientras la condición sea cierta<br />
>>> x = 1<br />
>>> while x < 10:<br />
... x = x + 1<br />
... print x<br />
...<br />
10<br />
144<br />
Sunday, April 7, 2013<br />
144
while<br />
>>> x = 5<br />
>>> factorial = 1<br />
>>> while x > 0:<br />
... factorial = factorial * x<br />
... x = x - 1<br />
... print factorial<br />
...<br />
120<br />
145<br />
Sunday, April 7, 2013<br />
145
while<br />
>>> x = 0<br />
>>> while True:<br />
... x = x + 1<br />
...<br />
146<br />
Sunday, April 7, 2013<br />
146
¿Y si necesitamos salir del bucle?<br />
¿GOTO?<br />
147<br />
Sunday, April 7, 2013<br />
147
Edsger W. Dijkstra<br />
“Go To Statement Considered Harmful,” (1968)<br />
148<br />
Sunday, April 7, 2013<br />
148
149<br />
Sunday, April 7, 2013<br />
149
eak<br />
Abandona el bucle inmediatamente<br />
>>> for i in [1, 2, 3]:<br />
... if i % 2 == 0:<br />
... break<br />
... print i<br />
...<br />
2<br />
150<br />
Sunday, April 7, 2013<br />
150
eak<br />
>>> x = 15<br />
>>> while True:<br />
... if x % 9 == 0:<br />
... print x<br />
... break<br />
... x = x + 1<br />
...<br />
18<br />
151<br />
Sunday, April 7, 2013<br />
151
continue<br />
Salta inmediatamente a la siguiente iteración<br />
>>> for i in [1, 2, 3]:<br />
... if i % 2 == 0:<br />
... continue<br />
... print i<br />
...<br />
1<br />
3<br />
152<br />
Sunday, April 7, 2013<br />
152
continue<br />
>>> while True:<br />
... x = int(raw_input())<br />
... if not x % 2 == 0:<br />
... continue<br />
... print “es par!”<br />
153<br />
Sunday, April 7, 2013<br />
153
Ejercicios<br />
if, for, while y range()<br />
http://www.iaa.es/python/ejercicios<br />
154<br />
Sunday, April 7, 2013<br />
154
155<br />
Sunday, April 7, 2013<br />
155
Python<br />
• Monthy Python<br />
• 1991, Países Bajos<br />
• Guido van Rossum<br />
• CPython<br />
• Énfasis en legibilidad y sencillez<br />
156<br />
Sunday, April 7, 2013<br />
156
Guido van Rossum<br />
• Benevolent Dictator For Life (BDFL)<br />
• “Computer Programming for Everybody” (1989)<br />
• Trabajó en Google hasta finales de 2012, dedicando la<br />
mitad de su tiempo a continuar con el desarrollo de<br />
Python. Desde enero de este año está en Dropbox.<br />
157<br />
Sunday, April 7, 2013<br />
157
Python<br />
✓<br />
Lenguaje de alto nivel<br />
✓ Interpretado<br />
✓ Dinámico<br />
Sí, esto influye en el rendimiento<br />
158<br />
Sunday, April 7, 2013<br />
158
Python<br />
• Axioma 1: el tiempo de un programador es<br />
(bastante) más valioso que el de CPU<br />
• Podrá tardar algo más en ejecutarse, pero a<br />
cambio el tiempo se desarrollo es 5-10x menor<br />
• En cualquier caso, los bloques de cálculo más<br />
intensivo pueden pueden implementarse en<br />
Fortran/C/C++ y ejecutarse desde Python<br />
• La optimización prematura es la raíz de todo mal<br />
(Donald Knuth)<br />
159<br />
Sunday, April 7, 2013<br />
159
Python<br />
• Axioma 2: el código se escribe una única vez pero<br />
es leído muchas más. De ahí el énfasis en la<br />
legibilidad y sencillez.<br />
• “Hay más de una forma de hacerlo”, de Perl<br />
• “Debe haber una –y preferiblemente sólo una–<br />
manera obvia de hacerlo”, de Python<br />
• “Pythónico” como halago.<br />
160<br />
Sunday, April 7, 2013<br />
160
Raymond Hettinger<br />
• PSF Board of Directors<br />
• Autor de numerosas funciones (izip(), reversed(),<br />
enumerate()...) y estructuras de datos (deque, set.) de la<br />
librería estándar de Python.<br />
• Pequeñas lecciones de Python en @raymondh<br />
• Ponente excepcional:<br />
- “What Makes Python Awesome”<br />
- “Transforming Code into Beautiful, Idiomatic Python”<br />
- “Python's Class Development Toolkit”<br />
161<br />
Sunday, April 7, 2013<br />
161
Jesse Noller<br />
• PSF Board of Directors<br />
• Presidente de la PyCon US 2013<br />
• Autor del módulo multiprocessing<br />
• Énfasis en educación y divulgación de Python<br />
162<br />
Sunday, April 7, 2013<br />
162
El Zen de Python<br />
>>> import this<br />
Ejemplos: http://stackoverflow.com/q/228181/<br />
163<br />
Sunday, April 7, 2013<br />
163
Bonito es mejor que feo<br />
(Beautiful is better than ugly)<br />
if a == 2 && b == 0 || b == 3:<br />
print 'yes'<br />
vs<br />
if a == 2 and b == 0 or c == 3:<br />
print 'yes'<br />
Filosofía “No me hagas pensar”<br />
164<br />
Sunday, April 7, 2013<br />
164
Explícito es mejor que implícito<br />
(Explicit is better than implicit)<br />
int x = 1;<br />
x++;<br />
++x;<br />
vs<br />
x = 1<br />
x = x +1<br />
165<br />
Sunday, April 7, 2013<br />
165
Simple es mejor que complejo<br />
(Simple is better than complex)<br />
int x = 5;<br />
int y = 3;<br />
int tmp = x;<br />
x = y;<br />
y = tmp;<br />
vs<br />
x = 5<br />
y = 3<br />
x, y = y, x<br />
166<br />
Sunday, April 7, 2013<br />
166
Complejo es mejor que complicado<br />
(Complex is better than complicated)<br />
Es inevitable que muchos de nuestros programas terminen siendo<br />
complejos (ya que realizan operaciones complejas), pero ninguna línea de<br />
nuestro código debería ser jamás difícil o complicada de entender.<br />
Debemos construir nuestros programas paso a paso y con sencillez<br />
167<br />
Sunday, April 7, 2013<br />
167
Plano es mejor que anidado<br />
(Flat is better than nested)<br />
if x >= 3:<br />
if x < 10:<br />
if x % 2 == 0:<br />
print "aha!"<br />
vs<br />
if 3
Disperso es mejor que denso<br />
(Sparse is better than dense)<br />
if i > 0: x = x ** 2<br />
elif x % 2 = 0: x = -1<br />
else: x = 3<br />
vs<br />
if i > 0:<br />
x = x ** 2<br />
elif x % 2 = 0:<br />
x = -1<br />
else:<br />
x = 3<br />
Dicho “no pongas mucho código en una línea”<br />
169<br />
Sunday, April 7, 2013<br />
169
La legibilidad cuenta<br />
(Readibility counts)<br />
“Los programas deben escribirse para que los lean las personas, y<br />
sólo de forma circunstancial para que los ejecuten las máquinas.”<br />
— Hal Abelson y Gerals Sussman (1984)<br />
Intenta que tus programas sean<br />
fáciles de leer y obvios.<br />
170<br />
Sunday, April 7, 2013<br />
170
Los casos especiales no son lo<br />
suficientemente especiales como para<br />
romper las reglas<br />
(Special cases aren’t special enough to break the rules)<br />
char c = 'a';<br />
vs<br />
Una cadena de texto de longitud<br />
uno no es lo suficientemente<br />
especial como para merecer<br />
tener un tipo de dato propio<br />
c = "a"<br />
171<br />
Sunday, April 7, 2013<br />
171
Aunque lo pragmático gana a la pureza<br />
(Although practicality beats purity)<br />
Por eso tenemos las funciones ord()<br />
(conversión de carácter, es decir,<br />
cadena de longitud uno, a entero ) y<br />
chr() (entero a carácter)<br />
>>> ord("e")<br />
101<br />
>>> chr(101)<br />
'e'<br />
“Una consistencia necia es lo que aflige a las<br />
mentes pequeñas” (Ralph Waldo Emerson)<br />
172<br />
Sunday, April 7, 2013<br />
172
Estilo de Programación<br />
• PEP 8 -- Style Guide for Python Code<br />
• Tamaño máximo de línea de 79 líneas<br />
• 4 espacios por nivel de indentación<br />
• No usar los caracteres de tabulación<br />
• Pero, si se usan (¡nooo!), no mezclarlos con espacios<br />
• Espacios alrededor de asignaciones y comparaciones<br />
• Un espacio después de las comas → x, y = 1, 2<br />
• Ningún espacio justo después de abrir un paréntesis o<br />
corchete, y tampoco antes de cerrarlo → x = [1, 2]<br />
• Comentarios en su propia linea, si es posible<br />
173<br />
Sunday, April 7, 2013<br />
173
Comentarios<br />
x = x + 1 # incremento x en uno<br />
¡Obvio!<br />
“Programa siempre como si el tipo que acabe manteniendo<br />
tu código fuera un psicópata violento que sabe dónde vives”<br />
174<br />
– Martin Golding<br />
º<br />
Sunday, April 7, 2013<br />
174
Comentarios<br />
• Por qué y cómo funciona el código<br />
• Explicar los aspectos no evidentes del programa.<br />
• Los comentarios irrelevantes o no actualizados son mucho<br />
peor que no tener comentarios en absoluto.<br />
• Lo más probable es que esos comentarios los estés<br />
escribiendo para ti mismo en un futuro no muy lejano. Lo<br />
que ahora es obvio casi con seguridad no lo sea en meses,<br />
por no decir semanas.<br />
• Y recuerda, en su propia línea siempre que sea posible.<br />
175<br />
Sunday, April 7, 2013<br />
175
Intermezzo<br />
help(objeto)<br />
>>> x = [1, 2, 3]<br />
>>> help(x)<br />
176<br />
Sunday, April 7, 2013<br />
176
a = [1, 2, 3]<br />
>>> b = a<br />
>>> del a[-1]<br />
>>> a<br />
[1, 2]<br />
>>> b<br />
[1, 2]<br />
Todos nos sentimos igual, sí<br />
177<br />
Sunday, April 7, 2013<br />
177
Otros lenguajes tienen<br />
“variables”<br />
En muchos otros lenguajes, al asignar un valor a una<br />
variable se coloca el valor en una especie de caja:<br />
int a = 1;<br />
La caja a contiene ahora el entero 1<br />
Extraído de “Code Like a Pythonista: Idiomatic Python”, de David Goodger<br />
Sunday, April 7, 2013<br />
178<br />
178
Otros lenguajes tienen<br />
“variables”<br />
Al asignar otro valor a la misma variable lo que ocurre es<br />
que el valor que contiene la caja se sustituye por el nuevo:<br />
a = 2;<br />
Ahora a contiene el entero 2<br />
179<br />
Sunday, April 7, 2013<br />
179
Otros lenguajes tienen<br />
“variables”<br />
Al asignar una variable a otra se realiza una copia del<br />
valor y se coloca en la nueva caja:<br />
int b = a;<br />
b es una segunda caja, con una copia del entero 2.<br />
La caja a tiene una copia totalmente independiente.<br />
180<br />
Sunday, April 7, 2013<br />
180
Python tiene “nombres”<br />
En Python, un "nombre" o "identificador" es algo<br />
parecido a una etiqueta pegada a un objeto:<br />
a = 1<br />
El entero 1 tiene una etiqueta con el texto a<br />
181<br />
Sunday, April 7, 2013<br />
181
Python tiene “nombres”<br />
Si reasignarmos a, lo que hacemos es colocar la<br />
etiqueta a otro objeto:<br />
a = 2<br />
Ahora el nombre a está asignado al entero 2<br />
182<br />
Sunday, April 7, 2013<br />
182
Python tiene “nombres”<br />
Si asignamos un nombre a otro, lo único que hacemos es<br />
adjuntar otra etiqueta de nombre a un objeto existente:<br />
b = a<br />
El nombre b es sólo una segunda etiqueta añadida al mismo entero que a<br />
183<br />
Sunday, April 7, 2013<br />
183
La mayor parte del tiempo utilizamos<br />
“variables”, aunque sean realmente<br />
“nombres”, pues es el término más popular.<br />
a = b = [1, 2, 3]<br />
Ambas variables apuntan a la misma lista<br />
a = b[:]<br />
a ahora apunta a una copia de la lista b<br />
184<br />
Sunday, April 7, 2013<br />
184
Repaso<br />
Manipulación de listas<br />
numeros = range(2, 101, 2)<br />
1. ¿Qué tenemos en la lista? (en lenguaje natural)<br />
2. Los últimos diez elementos de la lista<br />
3. Todos los elementos excepto los tres primeros<br />
4. Añadimos los valores [13, 12, 11... 2, 1] al final de la lista.<br />
5. El mínimo de los primeros quince elementos.<br />
6. Insertamos el mínimo de la lista al final.<br />
7. Invertimos el orden de la lista.<br />
8. La suma de los elementos que tienen índices pares.<br />
9. La media aritmética de los elementos de la lista.<br />
10.A partir de [1, 2, 3, 4, 5], generar [1, 2, 3, 4, 5, 4, 3, 2, 1]<br />
185<br />
Sunday, April 7, 2013<br />
185
Repaso<br />
If - else<br />
x = 41<br />
1. Imprimir “sentido de la vida encontrado” si x es igual a 42 (if)<br />
2. Si no, imprimir “sigue buscando” (else)<br />
3. Si x es menor que cien, imprimir su valor e incrementarlo en uno<br />
4. Si no, actualizar su valor a su cuadrado (x ^ 2)<br />
5. Si es mayor que cero y par, imprimir “exacto”<br />
6. Si no, actualizar su valor a su mitad exacta (x / 2)<br />
7. Si es mayor que cero, impar y menor o igual que 365, imprimir por<br />
pantalla el mensaje “podría ser un día”<br />
8. Si no, imprimir “no lo es”<br />
9. Si el número es diferente de cero, imprimir “algo es algo”<br />
10.Si el número es cero, asignarle el valor cien.<br />
186<br />
Sunday, April 7, 2013<br />
186
Repaso<br />
For<br />
exponentes = range(1, 11)<br />
1. ¿Qué tenemos en la lista? (en lenguaje natural)<br />
2. Añadir a la lista de exponentes [18, 19]<br />
3. Para cada elemento de la lista, imprimir por pantalla 2 ** x<br />
4. Para cada elemento de la lista, imprimir por pantalla su cuadrado.<br />
5. Hacer que el ejercicio anterior muestre los resultados en orden inverso (es<br />
decir, hay que iterar sobre los exponentes hacia atrás)<br />
6. Para cada elemento de la lista, comprobar si 2 ** x es un número par.<br />
7. Imprimir cada elemento de la lista junto a su posición (índice)<br />
8. Usando una variable en la que vamos almacenando el resultado, obtener la<br />
suma de calcular 7 ** x para cada elemento de la lista.<br />
9. Hacer que el ejercicio anterior de detenga si en el momento en el que el<br />
valor de x sea mayor que 200<br />
187<br />
Sunday, April 7, 2013<br />
187