16.01.2014 Views

Primer día (PDF, 13.3 MB)

Primer día (PDF, 13.3 MB)

Primer día (PDF, 13.3 MB)

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!