Вы находитесь на странице: 1из 187

1

Objetivo
• ¡Aprender a programar en Python!
• No es lo mismo que “aprender a programar” a secas.
No aspiramos a escribir “Fortran en Python”. Los que
ya sabéis programar tendréis que olvidar algunas de
las cosas que sabéis – mientras estéis aquí.
• Pero 20 horas tan sólo nos permitirán echar un
vistazo muy superficial a todo el lenguaje...
en el mejor de los casos.
• Establecer unas bases sólidas para el
aprendizaje por nuestra cuenta.
• La participación es fundamental.
2
¡Volvernos renacentistas!

3
Evaluaciones
• Agradeceremos enormemente cualquier sugerencia
que nos hagáis sobre el temario, estilo y desarrollo
del curso.
• Por cualquier medio; ya sea en persona, por correo
electrónico o mediante amenazas por teléfono de
madrugada.
• Si esperáis al jueves para decir algo podréis mejorar
la experiencia de los que vengan detrás, pero no la
vuestra. Hablad ahora o callad hasta la siguiente
convocatoria.

4
Evaluaciones
Y ahora, explicado en el lenguaje del siglo XXI

Nosotros
Nosotros

Vosotros

A la UDIT
5
http://www.iaa.es/python

Aquí tenéis todo el material: transparencias en PDF,


ejercicios, soluciones y varios enlaces de interés.

6
pyIAA

• Existe una lista de correo de Python en el IAA.


• http://smtp.iaa.es/mailman/listinfo/pyiaa
• Os animamos a que os apuntéis!: somos ya varias decenas
de participantes y es un sitio inmejorable en el que
preguntar cualquier duda que os pueda surgir una vez
que este curso termine.
• Python Kung Fu: retos periódicos que enviamos a la lista,
analizando las respuestas recibidas y perfectos! para
aprender nuevos conceptos que de otra forma podrían
pasarnos desapercibidos.

7
Python Kung Fu

Python IDL

8
Python
como calculadora

9
Aritmética básica

>>> 2 + 2
4
10
Aritmética básica

>>> 2.1 + 4.9


7.0
11
Aritmética básica

>>> 8 - 5
3
12
Aritmética básica

>>> 3 * 4
12
13
Aritmética básica

>>> 9 / 3
3
14
Aritmética básica

>>> 3 / 4
0
¿Por qué?
15
¡Estamos operando con enteros!

int / int = int


3 / 4 = 0.75
int(0.75) = 0
16
Necesitamos números reales

float / float = float


float / int = float
int / float = float
17
Pero esto no funcionaría...

>> float(3/4)
float(int)
float(0) = 0.0
18
int() trunca...

>> int(0.49) = 0
>> int(1.50) = 1
>> int(2.9) = 2
19
... y round() redondea

>> round(0.49) = 0
>> round(1.50) = 2
>> round(2.9) = 3
20
from _ _future_ _ import division

>> 1 / 4
0.25
>> 4 / 7
0.5714285714285714
21
Python 2.7
• Publicada en julio de 2010
• Última versión de la serie 2.x!
• El futuro: Python 3000;! nueva versión del lenguaje
incompatible con 2.x. Mejorada, reorganizada, unificada.
Última versión: Python 3.4 (03/2014)
• La mayor parte del código existente sigue siendo 2.x. De
ahí que lo usemos en este curso. Y una vez podamos
defendernos en Python 2.x, el salto a Py3K es trivial (y
automatizable: herramienta 2to3)
• Python 3000 es objetivamente mejor que 2.x. Ver
presentación “Python 3.3: Trust Me, It's Better Than
Python 2.7”, de Brett Cannon (PyCon US 2013)

22
from _ _future_ _ import division

• La división funciona como esperaríamos desde Python


3.0. Pero en realidad estaba implementado desde la
versión 2.2 (diciembre de 2001), sólo que su uso es
opcional.
• Permite una transición suave, a años vista.
• La máquina del tiempo de
los creadores de Python.

23
Aritmética básica

>>> 7 % 2
1
24
Aritmética básica

>>> 10 ** 2
1024
25
Aritmética básica

>>> (1 + 3) * 4 + 2
18

26
Long integers

>> 1024 ** 2 ** 2
1099511627776L
¿Y esa L?

27
Long integers

• Enteros normales utilizan al menos 32 bits (máximo


entero positivo representable 2,147,483,647; en el caso
de 64 bits: 9,223,372,036,854,775,807)
• Por encima de ese umbral Python usa automáticamente
los long ints, limitados únicamente por la memoria
disponible. En otras palabras: precisión ilimitada.
• En la práctica: Python se encarga de todo. Tan sólo
necesitamos saber que para valores muy grandes
aparecerá esa L al final del número.

28
Variables

>>> x = 8.5
>>> x
8.5
29
Variables
>>> x = 1
>>> y = 2
>>> x + y
3
30
Variables

int x;
double y;

31
Variables

int x;
x = 5.6;

32
Variables

>>> x = 6.6
5
>>> x + 2
7
8.6
33
Asignación múltiple

>>> x, y = 5, 3
>>> x + y
8
34
Asignación múltiple

>>> x = y = 3
>>> x
3
35
Variables no declaradas

>>> x = 1
>>> x + y
NameError: name 'y' is
not defined
36
Operadores de comparación

>>> 2 == 3
False
37
Operadores de comparación

>>> 2 != 3
True
38
Operadores de comparación

>>> 5 < 3
False
39
Operadores de comparación

>>> 5 > 5
False
40
Operadores de comparación

>>> 5 >= 5
True
41
Operadores lógicos

>>> not 2 > 3


True
42
Operadores lógicos

>>> x = 1.56
>>> x >= 0 and x <= 1
False
43
Operadores lógicos

>>> x = 1.56
>>> x >= 0 or x <= 1
True
44
Operadores lógicos

>>> x = 1.56
>>> 0 <= x <= 1
False
45
Tipos de datos básicos

• int → entero
• float → real
• bool → lógico
• string → texto
46
Tipos de datos básicos

>>> x = 4.5
>>> type(x)
<type 'float'>
47
Strings

• Cadenas de texto:
“¡Hola mundo!”
• Comillas simples o dobles:
‘¡Hola mundo!’
• Inmutables
48
Strings

>>> nombre = ‘Sara’


>>> nombre
‘Sara’
49
Strings

>>> frase = ‘Sara dijo “¡hola!”’


>>> frase
‘Sara dijo “¡hola!”’

50
Strings

Secuencia de escape:
“Sara dijo \“¡hola!\””

51
Strings

Triple entrecomillado:
“““ Sara dijo “¡hola!” ”””

52
Slices
a[index]
Devuelve el index-1 elemento

a = “Abstulit qui dedit”


a[0] = “A”
a[6] = “i”
a[-1] = “t”
53
El primer elemento
tiene índice = 0

54
Edsger W. Dijkstra
“Why numbering should start at zero” (1982)
55
Para representar la secuencia 1, 2, ..., 10
tenemos cuatro posibilidades:

a) 1 ≤ i < 11
b) 0 < i ≤ 10
c) 1 ≤ i ≤ 10
d) 0 < i < 11
b) nos obliga a utilizar un número no natural
Tanto
(cero) a) como
para b) tienen
determinar la ventajade
un intervalo denúmeros
que la
diferencia entre los límites
naturales. del intervalo (11-1 y
Poco elegante.
10-0) es igual al número de elementos de éste
56
Para representar una secuencia de N elementos,
utilizando la nomenclatura a), tenemos dos opciones:

a) 1 ≤ i < N+1
b) 0 ≤ i < N

La opción b) es más simple e intuitiva: el límite superior nos


indica directamente el número de elementos en el intervalo

57
Slices
a[start:end]
Elementos desde start hasta end-1

a = “Alea jacta est”


a[0:10] = “Alea jacta”
a[5:10] = “jacta”
a[5:6] = “j”
a[5:5] = “”
58
Slices

a[start:]
Elementos desde start hasta el final

a = “Fabricando fit faber”


a[12:] = “fit faber”
a[-5:] = “faber”

59
Slices

a[:end]
Elementos desde el comienzo hasta end-1

a = “In vino veritas”


a[:2] = “In”
a[:8] = “In vino”
a[:-5] = “In vino ve”
60
Slices

a[start:end:step]
De start a end de step en step elementos

a = “Is fecit, cui prodest”


a[::2] = “I ei,cipoet”
a[:12:3] = “Ifi ”
a[::-1] = “tsedorp iuc ,ticef sI”
61
Inmutables

>>> nombre = “Sara”


>>> nombre[0] = “M”
TypeError: 'str' object
does not support item
assignment
62
Inmutables

>>> nombre = “Sara”


>>> nombre = “Mara”
>>> nombre
‘Mara’
63
Concatenación

>> nombre = “Sara”


>> nombre = “M” + nombre[1:]
>> nombre
‘Mara’

64
Subcadenas

>>> “ere” in “sapere aude”


True

65
Subcadenas

>>> “sapere aude”.find(“ere”)


3

La subcadena existe y empieza en el


elemento 3 (es decir, el cuarto)

66
Subcadenas

>>> “flux” in “et veritas”


False

67
Subcadenas

>>> “et veritas”.find(“flux”)


-1

La subcadena no existe

68
Tamaño

>>> len(“victoria aut mors”)


17

69
Tamaño

>>> comic = “V de Vendetta”


>>> len(comic)
13

70
Mayúsculas

>>> “hoygan”.upper()
“HOYGAN”

71
Minúsculas

>>> vocales = “AEIOU”


>>> vocales.lower()
“aeiou”

72
Eliminando espacios

>>> planeta = “ Saturno”


>>> planeta.lstrip()
“Saturno”

73
Eliminando espacios

>>> lugar = “En el Sol ”


>>> print lugar.rstrip(), “hace calor”
En el Sol hace calor

74
Eliminando espacios

>>> apellido = “ Lee ”


>>> print “Bruce”, apellido.strip(), “Jr.”
Bruce Lee Jr.

75
Ejercicios
Manipulación de cadenas utilizando el intérprete

cadena = “Cabeza grande, ojos hermosos”

1. ¿El tamaño de la cadena?


2. Los primeros cinco caracteres de la cadena
3. Los siete últimos caracteres.
4. De los cinco primeros caracteres, los que ocupan posiciones pares.
5. De los últimos trece caracteres, los de posiciones impares
6. En mayúscula, los caracteres en posiciones múltiplo de tres
7. De dos en dos, del caracter en la posición 4 al de la 17
8. ¿Está el caracter “x” en la cadena?
9. ¿Y “o”, en mayúscula o minúscula?

76
Módulos
(un primer vistazo)

Instrucciones almacenadas
en un fichero y ejecutadas
por el intérprete de Python

77
Módulos
(un primer vistazo)

x=4
y=5
x ** (y + 1)

78
Módulos
(un primer vistazo)

python fichero.py

El nombre del módulo es fichero


(sin la extensión .py)

79
Módulos
(un primer vistazo)

chmod +x fichero.py
Hacemos el fichero ejecutable

80
Módulos
(un primer vistazo)

#! /usr/bin/env python
Primera línea del módulo: especifica que debe utilizarse
Python para ejecutar el código contenido en el fichero

81
Módulos
(un primer vistazo)

udit-d41:~ vterron$ python ejemplo.py


udit-d41:~ vterron$

82
Módulos
(un primer vistazo)

udit-d41:~ vterron$ ./ejemplo.py


udit-d41:~ vterron$

83
print

>>> print “Abre las puertas, HAL”


‘Abre las puertas, HAL”

84
print

>>> print “Lo siento,”


>>> print “Dave”
‘Lo siento,’
‘Dave’
Añade salto de línea al final

85
print

>>> print “Me temo que”, “no puedo”


‘Me temo que no puedo’

Inserta espacio entre las cadenas mostradas por pantalla

86
print

>>> x = 2
>>> y = 3
>>> print x, “^”, y, “=”, 2**3
2^3=8

87
Formateo de cadenas
• Pero print sólo nos proporciona una funcionalidad
básica de manipulación de cadenas; para un
control más avanzado necesitamos necesitamos
formatear la cadena.
• Idéntico al antediluviano y universal printf,
presente en cualquier lenguaje de programación
digno de ese nombre.
• Nos da control absoluto de la representación por
pantalla de la información. Entre otro, podemos
especificar tipo, precisión, signo, alineamiento,
entre otros.
88
Formateo de cadenas

>>> print “Numero: %d” % 42


Número: 42
>>> print “Pi: %f” % 3.1415927
Pi: 3.141593
>>> print “Pi: %.3f” % 3.1415927
Pi: 3.142
89
Formateo de cadenas

>>> print “%d + %d = %d” % (5, 3, 8)


5+3=8
>>> b = 10.4
>>> e = 2
>>> print “%f ** %d = %.2d” % (b, e, b ** e)
10.400000 ** 2 = 108.16

90
Comentarios

#
A partir del primer # y hasta el final de la línea

91
Comentarios

>>> x = 2
>>> x = x + 1 # incrementa x en uno
>>> x
3

92
Listas

• Serie de elementos separados por comas,


encerrados entre corchetes.
• Los elementos pueden ser de distinto tipo
• Dinámicas: número variable de elementos
• Mutables

93
Listas

>>> v = [1, 2, 3]
>>> v
[1, 2, 3]

94
Listas

>>> v = [1, 2.0, “tres”]


>>> print v[1]
2.0

95
Listas

>>> v = []
>>> v
[]

96
Asignación

>>> v = [4, 7, 3, 8]
>>> v[-1] = 0
>>> v
[4, 7, 3, 0]

97
Tamaño

>>> v = [1, 2.0, “tres”]


>>> len(v)
3

98
Inserción

>>> v = [1, 3, 4]
>>> v.append(5)
>>> v
[1, 2, 3, 5]

99
Inserción
>>> v = [1, 3, 4]
>>> v.insert(9, 2)
>>> v
[1, 3, 9, 4]
Añade el elemento 9 en la posición de index = 2

100
Eliminación
>>> v = [1, 3, 4]
>>> v.remove(3)
>>> v
[1, 4]
Borrado por valor

101
Eliminación
>>> v = [9, 5, 8, 5, 9]
>>> del v[3]
>>> v
[9, 5, 8, 9]
Borrado por posición

102
Búsqueda

>>> v = [7, 0, 7]
>>> 7 in v
True

103
Búsqueda

>>> v = [7, 0, 7]
>>> v.index(7)
0

104
Búsqueda

>>> v = [7, 0, 7]
>>> 3 in v
False

105
Búsqueda

>>> v = [7, 0, 7]
>>> 8 not in v
True

106
Búsqueda

>>> v = [7, 0, 7]
>>> v.index(3)
ValueError: list.index(x): x
not in list

107
Concatenación

>>> [1, 2, 3] + [9, 8]


[1, 2, 3, 9, 8]

108
Concatenación

>>> x = [1, 2, 3]
>>> x.append([9, 8])
>>> x
[1, 2, 3, [9, 8]]
El cuarto elemento es ahora una lista
109
Máximo

>>> max([7, 2, 5])


7

110
Mínimo

>>> x = [7, 2, 5]
>>> min(x)
2
111
Sumatorio

>>> sum([7, 2, 5])


14

112
Listas vacías

>>> x = []
>>> len(x)
0
113
Listas vacías

>>> x = []
>>> bool(x)
False
Las listas vacías evalúan a False

114
Ejercicios
Manipulación de listas utilizando el intérprete

lista = [“primero”, 2, “3.5”, 4.0, “ultimo”]

1. ¿El tamaño de la lista?


2. El tamaño de la lista multiplicado por su segundo elemento
3. El producto del segundo elemento de la lista por el tercero
4. ¿Está 2 en la lista? ¿Y 2.0?
5. Eliminar el primer elemento de la lista
6. Eliminar ahora los dos últimos elementos simultaneamente
7. ¿Está la lista vacía?
8. Añadir el elemento “nuevo ultimo” a la lista.

115
Entrada de datos

raw_input(mensaje)
• Imprime mensaje por pantalla
• Devuelve entrada en un string

116
Entrada de datos

>>> persona = raw_input(“Nombre: ”)


Nombre: Mr. Marshall
>>> print “Bienvenido,”, persona
Bienvenido, Mr. Marshall

117
Entrada de datos

>>> x = raw_input(“x: ”)
x: 57
>>> print 2*x
5757

118
Entrada de datos

• raw_input() siempre devuelve una


cadena de texto
• Necesitamos hacer una conversión
al tipo de dato que necesitamos

119
Entrada de datos
int * string concatena string int veces

>>> 3 * “adios”
“adiosadiosadios”
De vuelta al ejemplo anterior...

120
Entrada de datos

>>> x = int(raw_input(“x: ”))


x: 57
>>> print 2*x
114

121
Entrada de datos

input(mensaje)
• También imprime mensaje por pantalla
• Pero la entrada es interpretada como una
expresión de código Python

122
Entrada de datos

>>> numeros = input(“Lista: ”)


Nombre: [7, 8, 9]
>>> del numeros[-1]
>>> numeros
[7, 8]

123
Entrada de datos

>>> x = [1, 2]
>>> x.append(input())
18
>>> x
[1, 2, 18]

124
Entrada de datos

>>> x = [7, 8]
>>> x.append(input(“elemento: ”))
elemento: y

NameError: name 'y' is not defined


La mayor parte del tiempo necesitamos raw_input

125
Estructuras de control

Necesitamos modificar el flujo de ejecución del


programa en función de los datos

if
for
while
126
if
Evalúa una condición y ejecuta un bloque de
instrucciones si es verdadera

>>> if 2 > 1:
... print “obviamente”
...
obviamente
127
Bloque

• Un bloque es un conjunto de instrucciones que


se ejecutan secuencialmente
• En este caso en particular, son aquellas
instrucciones ejecutadas cuando la condición es
verdadera
• Python utiliza el indentado para reconocer las
líneas que forman un bloque de instrucciones

128
if - else
Evalúa una condición y ejecuta un bloque de instrucciones
(bloque-if) si es verdadera. Si no lo es, ejecuta el otro bloque
(bloque-else)

>>> if 7 % 2 == 0:
... print “es par”
... else:
... print “no par”
...
“no par”
129
if - elif - else

• Para elegir entre más de dos opciones


• Python ignora las demás condiciones en
cuando una se cumple

• Funcionalidad similar al switch de C/C++

130
if - elif - else
>>> if 2 < 0:
... print “negativo!”
... elif 2 == 0:
... print “nada!”
... else:
... print “positivo!”
...
“positivo!”
131
for
Itera sobre los elementos de una secuencia

>>> for i in [1, 2, 3]:


... print i
...
1
2
3
132
for

• El cuerpo del bloque (bloque-for) se ejecuta


tantas veces como elementos tenga la secuencia
(por ejemplo, caracteres en un string)
• Usado para repetir un bloque de instrucciones
para los que una variable toma diferentes
valores.
• ¿Cómo ejecutamos un bloque n veces?

133
range(n)
Genera una lista de n valores [0, 1, 2 ... n-1]

>> range(7)
[0, 1, 2, 3, 4, 5, 6]

134
range(start, n)
Genera la lista [start, start+1, ... n-1]

>> range(3, 7)
[3, 4, 5, 6]

135
range(start, n, step)
Genera la lista [start, start+step, ... n-1]

>>> range(1, 11, 2)


[1, 3, 5, 7, 9]

136
for
>>> for i in range(3):
... print “hola”
...
hola
hola
hola
137
for (en C++)

for (int i = 0 ; i < 10 ; i++)


cout << i << endl;

138
for

for i in range(10):
print i
No utilizamos condiciones de inicio, parada e incremento, sino
que especificamos claramente qué elementos se utilizan

Más expresivo y seguro

139
for
>>> for letra in “Sara”:
... print letra
...
S
a
r
a
140
for
¿Y si dentro del bucle necesitamos conocer el índice del elemento?

>>> numeros = [2, 4, 5]

index 0 -> 2
index 1 -> 4
index 2 -> 5
141
for

>>> numeros = [2, 4, 5]


>>> for i in range(len(numeros)):
... print i, “->”, numeros[i]

142
enumerate(sec)
Permite iterar simultáneamente sobre el
índice y sobre el elemento de una secuencia

>>> for i, num in enumerate([1, 2, 3]):


... print i, “->”, num

143
while
Ejecuta el bucle mientras la condición sea cierta

>>> x = 1
>>> while x < 10:
... x = x + 1
... print x
...
10
144
while
>>> x = 5
>>> factorial = 1
>>> while x > 0:
... factorial = factorial * x
... x = x - 1
... print factorial
...
120
145
while

>>> x = 0
>>> while True:
... x = x + 1
...

146
¿Y si necesitamos salir del bucle?

¿GOTO?

147
Edsger W. Dijkstra
“Go To Statement Considered Harmful,” (1968)
148
149
break
Abandona el bucle inmediatamente

>>> for i in [1, 2, 3]:


... if i % 2 == 0:
... break
... print i
...
2
150
break
>>> x = 15
>>> while True:
... if x % 9 == 0:
... print x
... break
... x = x + 1
...
18
151
continue
Salta inmediatamente a la siguiente iteración

>>> for i in [1, 2, 3]:


... if i % 2 == 0:
... continue
... print i
...
1
3

152
continue

>>> while True:


... x = int(raw_input())
... if not x % 2 == 0:
... continue
... print “es par!”

153
Ejercicios
if, for, while y range()

http://www.iaa.es/python/ejercicios

154
155
Python
• Monthy Python
• 1991, Países Bajos
• Guido van Rossum
• CPython
• Énfasis en legibilidad y sencillez

156
Guido van Rossum

• Benevolent Dictator For Life (BDFL)


• “Computer Programming for Everybody” (1989)
• Trabajó en Google hasta finales de 2012, dedicando la
mitad de su tiempo a continuar con el desarrollo de
Python. Desde enero de 2013 está en Dropbox.

157
Python

✓ Lenguaje de alto nivel


✓ Interpretado
✓ Dinámico

Sí, esto influye en el rendimiento

158
Python
• Axioma 1: el tiempo de un programador es
(bastante) más valioso que el de CPU
• Podrá tardar algo más en ejecutarse, pero a
cambio el tiempo se desarrollo es 5-10x menor
• En cualquier caso, los bloques de cálculo más
intensivo pueden pueden implementarse en
Fortran/C/C++ y ejecutarse desde Python
• La optimización prematura es la raíz de todo mal
(Donald Knuth)

159
Python
• Axioma 2: el código se escribe una única vez pero
es leído muchas más. De ahí el énfasis en la
legibilidad y sencillez.
• “Hay más de una forma de hacerlo”, de Perl
• “Debe haber una –y preferiblemente sólo una–
manera obvia de hacerlo”, de Python
• “Pythónico” como halago.

160
Raymond Hettinger

• PSF Board of Directors


• Autor de numerosas funciones (izip(), reversed(),
enumerate()...) y estructuras de datos (deque, set.) de la
librería estándar de Python.
• Pequeñas lecciones de Python en @raymondh
• Ponente excepcional:
- “What Makes Python Awesome”

- “Transforming Code into Beautiful, Idiomatic Python”

- “Python's Class Development Toolkit”

161
Jesse Noller

• PSF Board of Directors


• Presidente de la PyCon US 2013
• Autor del módulo multiprocessing
• Énfasis en educación y divulgación de Python

162
El Zen de Python
>>> import this

Ejemplos: http://stackoverflow.com/q/228181/
163
Bonito es mejor que feo
(Beautiful is better than ugly)

if a == 2 && b == 0 || b == 3:
print 'yes'
vs

if a == 2 and b == 0 or c == 3:
print 'yes'

Filosofía “No me hagas pensar”

164
Explícito es mejor que implícito
(Explicit is better than implicit)

int x = 1;
x++;
++x;

vs

x=1
x = x +1

165
Simple es mejor que complejo
(Simple is better than complex)

int x = 5;
int y = 3;
int tmp = x;
x = y;
y = tmp;

vs
x=5
y=3
x, y = y, x
166
Complejo es mejor que complicado
(Complex is better than complicated)

Es inevitable que muchos de nuestros programas terminen siendo


complejos (ya que realizan operaciones complejas), pero ninguna línea de
nuestro código debería ser jamás difícil o complicada de entender.

Debemos construir nuestros programas paso a paso y con sencillez

167
Plano es mejor que anidado
(Flat is better than nested)

if x >= 3:
if x < 10:
if x % 2 == 0:
print "aha!"

vs

if 3 <= x < 10 and x % 2 == 0:


print "aha!"

168
Disperso es mejor que denso
(Sparse is better than dense)

if i > 0: x = x ** 2
elif x % 2 = 0: x = -1
else: x = 3
vs

if i > 0:
x = x ** 2
elif x % 2 = 0:
x = -1
else:
x=3

Dicho “no pongas mucho código en una línea”

169
La legibilidad cuenta
(Readibility counts)

“Los programas deben escribirse para que los lean las personas, y
sólo de forma circunstancial para que los ejecuten las máquinas.”
— Hal Abelson y Gerals Sussman (1984)

Intenta que tus programas sean


fáciles de leer y obvios.

170
Los casos especiales no son lo
suficientemente especiales como para
romper las reglas
(Special cases aren’t special enough to break the rules)

char c = 'a';
Una cadena de texto de longitud
uno no es lo suficientemente
vs especial como para merecer
tener un tipo de dato propio

c = "a"

171
Aunque lo pragmático gana a la pureza
(Although practicality beats purity)

>>> ord("e")
Por eso tenemos las funciones ord()
(conversión de carácter, es decir, 101
cadena de longitud uno, a entero ) y
chr() (entero a carácter)
>>> chr(101)
'e'

“Una consistencia necia es lo que aflige a las


mentes pequeñas” (Ralph Waldo Emerson)

172
Estilo de Programación
• PEP 8 -- Style Guide for Python Code
• Tamaño máximo de línea de 79 líneas
• 4 espacios por nivel de indentación
• No usar los caracteres de tabulación
• Pero, si se usan (¡nooo!), no mezclarlos con espacios
• Espacios alrededor de asignaciones y comparaciones
• Un espacio después de las comas → x, y = 1, 2
• Ningún espacio justo después de abrir un paréntesis o
corchete, y tampoco antes de cerrarlo → x = [1, 2]
• Comentarios en su propia linea, si es posible

173
Comentarios
x = x + 1 # incremento x en uno

¡Obvio!
“Programa siempre como si el tipo que acabe manteniendo
tu código fuera un psicópata violento que sabe dónde vives”
– Martin Golding
º
174
Comentarios
• Por qué y cómo funciona el código
• Explicar los aspectos no evidentes del programa.
• Los comentarios irrelevantes o no actualizados son mucho
peor que no tener comentarios en absoluto.
• Lo más probable es que esos comentarios los estés
escribiendo para ti mismo en un futuro no muy lejano. Lo
que ahora es obvio casi con seguridad no lo sea en meses,
por no decir semanas.
• Y recuerda, en su propia línea siempre que sea posible.
175
Intermezzo

help(objeto)
>>> x = [1, 2, 3]
>>> help(x)

176
>>> a = [1, 2, 3]
>>> b = a
>>> del a[-1]
>>> a
[1, 2]
>>> b
[1, 2]
Todos nos sentimos igual, sí

177
Otros lenguajes tienen
“variables”
En muchos otros lenguajes, al asignar un valor a una
variable se coloca el valor en una especie de caja:

int a = 1;

La caja a contiene ahora el entero 1

Extraído de “Code Like a Pythonista: Idiomatic Python”, de David Goodger 178


Otros lenguajes tienen
“variables”
Al asignar otro valor a la misma variable lo que ocurre es
que el valor que contiene la caja se sustituye por el nuevo:

a = 2;

Ahora a contiene el entero 2

179
Otros lenguajes tienen
“variables”
Al asignar una variable a otra se realiza una copia del
valor y se coloca en la nueva caja:

int b = a;

b es una segunda caja, con una copia del entero 2.


La caja a tiene una copia totalmente independiente.
180
Python tiene “nombres”
En Python, un "nombre" o "identificador" es algo
parecido a una etiqueta pegada a un objeto:

a=1

El entero 1 tiene una etiqueta con el texto a

181
Python tiene “nombres”
Si reasignarmos a, lo que hacemos es colocar la
etiqueta a otro objeto:

a=2

Ahora el nombre a está asignado al entero 2

182
Python tiene “nombres”
Si asignamos un nombre a otro, lo único que hacemos es
adjuntar otra etiqueta de nombre a un objeto existente:

b=a

El nombre b es sólo una segunda etiqueta añadida al mismo entero que a

183
La mayor parte del tiempo utilizamos
“variables”, aunque sean realmente
“nombres”, pues es el término más popular.

a = b = [1, 2, 3]
Ambas variables apuntan a la misma lista

a = b[:]
a ahora apunta a una copia de la lista b

184
Repaso
Manipulación de listas

numeros = range(2, 101, 2)

1. ¿Qué tenemos en la lista? (en lenguaje natural)


2. Los últimos diez elementos de la lista
3. Todos los elementos excepto los tres primeros
4. Añadimos los valores [13, 12, 11... 2, 1] al final de la lista.
5. El mínimo de los primeros quince elementos.
6. Insertamos el mínimo de la lista al final.
7. Invertimos el orden de la lista.
8. La suma de los elementos que tienen índices pares.
9. La media aritmética de los elementos de la lista.
10.A partir de [1, 2, 3, 4, 5], generar [1, 2, 3, 4, 5, 4, 3, 2, 1]

185
Repaso
If - else

x = 41

1. Imprimir “sentido de la vida encontrado” si x es igual a 42 (if)


2. Si no, imprimir “sigue buscando” (else)
3. Si x es menor que cien, imprimir su valor e incrementarlo en uno
4. Si no, actualizar su valor a su cuadrado (x ^ 2)
5. Si es mayor que cero y par, imprimir “exacto”
6. Si no, actualizar su valor a su mitad exacta (x / 2)
7. Si es mayor que cero, impar y menor o igual que 365, imprimir por
pantalla el mensaje “podría ser un día”
8. Si no, imprimir “no lo es”
9. Si el número es diferente de cero, imprimir “algo es algo”
10.Si el número es cero, asignarle el valor cien.
186
Repaso
For

exponentes = range(1, 11)

1. ¿Qué tenemos en la lista? (en lenguaje natural)


2. Añadir a la lista de exponentes [18, 19]
3. Para cada elemento de la lista, imprimir por pantalla 2 ** x
4. Para cada elemento de la lista, imprimir por pantalla su cuadrado.
5. Hacer que el ejercicio anterior muestre los resultados en orden inverso (es
decir, hay que iterar sobre los exponentes hacia atrás)
6. Para cada elemento de la lista, comprobar si 2 ** x es un número par.
7. Imprimir cada elemento de la lista junto a su posición (índice)
8. Usando una variable en la que vamos almacenando el resultado, obtener la
suma de calcular 7 ** x para cada elemento de la lista.
9. Hacer que el ejercicio anterior de detenga si en el momento en el que el
valor de x sea mayor que 200

187

Вам также может понравиться