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

Python

3.x

Un repaso y cosas nuevas

Versin: 23-Sep-2015

Lo bsico
2

Sobre Python
Es un lenguaje interpretado aunque se
precompila a un lenguaje de mquina
virtual.
Es un lenguaje con Jpado dinmico:
Los datos Jenen Jpo.
Pero una variable puede albergar cualquier Jpo.
Eso hace que Python nunca pueda ser tan rpido
como, pongamos, C.
3

Sobre Python
Es un lenguaje muy expresivo: se puede decir
mucho con poco.
Es un lenguaje muy ortogonal: lo que se
aprende para una cosa suele ser Jl para otra
porque todo se ha diseado con unos
principios claros.

Sobre Python
Cmo ejecutar
Podemos ejecutar cdigo directamente con un
intrprete interacJvo.
O desarrollar programas que escribimos en
cheros de texto (Tpicamente con extensin .py)
y ejecutarlos pasndole el nombre del chero al
intrprete.
Y podemos desarrollar mdulos reuJlizables,
cuyas funciones y clases pueden importarse en
otros mdulos o programas.
5

Tipos bsicos
Booleano: a = True
True o False

Entero: a = 1234

Nmeros tan grandes como se quiera (no limitados a


2 o 4 bytes)

Flotante: a = 12.34 o a = 1234e-2

Equivalente a double en lenguajes como Java


Norma IEEE-754

Cadena: a = hola o a = hola

Secuencia de caracteres inmutable

Complejos: a = -2 + 3j
La j es la raz de -1

Un (no) valor especial


None es un valor especial que se usa,
normalmente, para indicar ausencia de valor

Variables
Los iden,cadores, como en Java: letras,
dgitos y _, pero no pueden empezar por dgito
Una variable manJene una referencia a una
direccin de memoria en la que reside el valor
a = 3
b = a
c = hola

b
c

hola
8

Expresiones aritmJcas y lgicas


Sigue las reglas de lenguajes convencionales,
como el Java
+
-
*
/
**
%

and
or
not
==
!=
<
>
<=
>=

=
+=
-=
/=
*=

&
|
!
<<
>>

valor if condicin else otro valor


9

Funciones
Las funciones matemJcas deben importarse
del mdulo math:
from math import sin, cos, tan, sqrt, ceil

Algunas estn disponibles por defecto:


Conversin de Jpo: int(2.3), oat(3), str(1)
Valor absoluto: abs(-1)
Longitud: len(hola)

10

Salida por pantalla


La funcin print() muestra datos por pantalla:
a = 3
print ("hola")
print ("hay", a, "lneas")
print ("hay", 1+2, "lneas")

La coma separa con un espacio en blanco.


Para que no haya salto de lnea, usamos end:
a = 1
print ("hola", end="")
print ("hay", a, "lnea")

11

Salida por pantalla con formato


Es ms cmodo uJlizar cadenas con formato:
a = 2
b = 2.0
print("Ejemplo con {0} y {1} y {2}".format(a, b, "cadena"))

Ojo: format() no Jene nada que ver con la


funcin print(), es un mtodo de las cadenas:
a = 3
b = "ejemplo {0}".format(a)
print(b)

12

Entrada por teclado


Hay una funcin que lee una cadena de
teclado:
a = input('Dame un nmero: ')


La cadena se puede converJr en un valor
entero o otante con una funcin de
conversin de Jpos:
b = int(a)
c = float(input())

13

Ejercicio 1
Disea un programa que pida dos nmeros
por teclado, a y b, y muestre por pantalla su
suma como en el siguiente ejemplo:
Introduce a: 2
Introduce b: 5
La suma de 2 y 5 es 7

14

Estructuras de
control
15

Estructuras de control
Se marcan terminando la sentencia con dos puntos
El bloque del cuerpo debe aparecer con mayor
sangrado que la lnea con la estructura
Ejemplo:

a = int(input("a: "))
if a == 0: print(a)
while a > 0:
a = a - 1
if a % 2 == 0:
print("Par")
16

Una excepcin
Si el bloque Jene una sola lnea, puede unirse
a la primera


if a == 1: print(b)


Las lneas sencillas (las que no acaban en :)
pueden unirse con ;


a = 1; b = 2
17

Seleccin if
Si la condicin es cierta, ejecuta el bloque; si
no, se lo salta:
if condicin:
bloque

18

Seleccin if-else
Si la condicin es cierta, ejecuta el primer
bloque; si no, ejecuta el segundo:
if condicin:
primer bloque
else:
segundo bloque

19

Seleccin if-elif(-else)
Evala las condiciones de arriba abajo y ejecuta
slo el bloque de la primera que se evala a True
Si hay else, se ejecuta su bloque cuando no es
cierta ninguna condicin
if condicin:
primer bloque
elif otra condicin:
otro bloque
elif y otra condicin ms:
y otro bloque ms

else:
opcional
l;mo bloque

20

Bucle while
Repite el bloque mientras se cumple la
condicin
El bloque puede repeJrse cero o ms veces
while condicin:
bloque

21

Bucle for
Ejecuta el bloque una vez por cada valor de
una secuencia
La variable de control toma en cada iteracin
un valor de la secuencia (ordenadamente)
for variable in secuencia:
bloque

22

Uso Tpico del bucle for


La funcin range(n) genera la secuencia de
nmeros 0, 1, 2, , n-1
El bucle for se usa frecuentemente con range
for i in range(10):
print(i)

23

Dos formas de recorrer una lista


lista = ['hola', 'mundo']
for elem in lista:
print(elem)
for i in range(len(lista)):
print(lista[i])

24

Modicacin del ujo en bucles


break interrumpe un bucle inmediatamente
for variable in secuencia:
sentencias
if condicin:
break
ms sentencias

con,nue interrumpe una iteracin


for variable in secuencia:
sentencias
if condicin:
con,nue
ms sentencias

25

Comentarios
Con # se inicia un comentario que naliza con
la lnea
print(0) #Un comentario

26

Tipos
estructurados
27

Otros Jpos de datos


Python ofrece, como Jpos naJvos, listas,
diccionarios y conjuntos:
Una lista es similar a una lista de Java.
Un diccionario permite asociar a un dato (una
clave) otro (un valor).
Un conjunto es una coleccin de elementos no
repeJdos y sin orden.

Y ofrece tambin algunos otros Jpos en


bibliotecas, por ejemplo deque.
28

Listas
Literales

[] es la lista vaca
[1, 3, 4] es una lista con 3 elementos
[1, 'a', 3.4] es otra lista con 3 elementos

Funciones

len() obJene la longitud


min(), max() devuelven el mnimo y el mximo
sum() devuelve la suma de sus elementos

Operadores (sea a = [1, 2, 3, 4])

a + [5, 6]
a * 10
a[0]
a[1:3]
a[:len(a)-1]
a[1:]

indexador
corte

a[-1]

a[:-1]
a[-3:]
29

ndices y cortes
a = [5, 10, 2, 3]
0

5
-4

10
-3

2
2

-2

3
-1

a[0:3] o a[-4:-1] o a[-4:3]


o a[-4:len(a)-1] o a[:3] o a[:-1]

Ojo: a[1] es 10, pero a[1:2] es [10]. Ves la


diferencia?
30

Los elementos son referencias (I)


a = [5, 10, 2, 3]

1

a
-4

-3

-2

-1

3
10

31

Los elementos son referencias (II)


a = [5, 10, 2, 3]
b = a
a

1
0
2

-4
-3
-2

b

5

2
10

Qu pasa al ejecutar b[1] = 0?

-1

32

Los elementos son referencias (y III)


a = [5, 10, 2, 3]
b = a
a

1
0
2

-4
-3
-2

b

0
5

2

Qu pasa al ejecutar b[1] = 0

-1

33

Listas
Mtodos. Si a es la lista [1, 2, 1, 3]
a.append(10) a es [1, 2, 1, 3, 10]
a.count(1) devuelve 2
a.extend([1,2]) a es [1, 2, 1, 3, 1, 2]
a.index(2) devuelve 1
a.insert(0, 20) a es [20, 1, 2, 1, 3]
a.reverse() a es [3, 1, 2, 1]
a.pop() a es [1, 2, 1] y devuelve 3
a.remove(1) a es [2, 1, 3]
a.sort() a es [1, 1, 2, 3]
34

Ejercicio 2
Disea un programa que lea enteros de
teclado hasta que el usuario teclee uno
negaJvo. Los enteros posiJvos se irn
aadiendo a una lista. Muestra el contenido
de la lista ordenado de menor a mayor valor,
con un elemento por lnea de pantalla.

35

Cadenas
Casi todo lo que has aprendido para listas vale
para cadenas (salvo lo que modique el
contenido, ya que las cadenas son inmutables)
[Recuerda: Python es un lenguaje muy
ortogonal]
Las cadenas Jene algunos mtodos
especiales:
, .join(pepe, mara, juan)
pepe mara lpez.upper()
pepe mara lpez.split()
pepe.mara.lpez.split(.)
36

Tuplas
Una tupla es una lista inmutable:
( ) es la tupla vaca.
(2,) es una tupla con un elemento.
(2, 3, 4) es una tupla con 3 elementos.
2, 3, 4 en algunos contextos, tambin es una
tupla con 3 elementos.

Las tuplas permiten simular asignaciones


mlJples: a, b = 1, 2
a, b = b, a

37

Diccionario
Asocia a cada clave un valor.
La clave ha de ser inmutable (un escalar, una
cadena, una tupla). El valor puede ser de
cualquier Jpo.
a = {'una clave': 1,
'otra clave': [1, 2],
'y otra ms': 'si}
print(a['una clave'])
print(a['otra clave'][0])
a['nuevo'] = 1.1
a['y otra ms'] = 'no'
print(a['nuevo'], a['y otra ms'])

38

Ejercicio 3
Crea un diccionario con el nombre de 3
amigos y asocia a cada uno su edad.

39

Conjuntos
Un conjunto es como una lista, pero sin orden
ni elementos repeJdos. Sus elementos han de
ser inmutables.
a = set([1, 2, 3])
print(len(a)) # 3
print(2 in a) # True
a.add(4)
print(len(a)) # 4
a.add(2)
print(len(a)) # 4

40

Conversin de Jpos
Hay funciones que permiten pasar de un Jpo
a otro
list( (1, 2, 3) )
tuple([1, 2, 3])
set([1, 2, 3])
list(set([1, 2, 3, 1, 2]))
tuple(list(set([1, 2, 3, 1, 2])))

41

Funciones
42

Funciones
La palabra clave def permite denir funciones
def nombre(parmetros):
bloque

Puede haber 0, 1 o ms parmetros (los


parntesis son siempre necesarios). Si hay
ms de uno, se separan con comas
def suma(a, b):
return a+b
43

Invocacin de funciones
Se usa el nombre con los argumentos
separados por comas y encerrados entre
parntesis:
print(suma(1, 2+2))


Ojo: en la prcJca podis considerar que
los escalares y cadenas se pasan por valor
otras estructuras se pasan por referencia
pero ojo con la asignacin!
44

Invocacin de funciones
def f(unentero, unalista):
unentero += 1
unalista[1] = unentero
print("dentro:", unentero, unalista)
milista = [1, 2, 3]
mientero = 10
f(mientero, milista)
print("fuera:", mientero, milista)

45

Invocacin de funciones
def f(unentero, unalista):
unentero += 1
unalista = [unalista[0], unentero, unalista[2]]
print("dentro:", unentero, unalista)
milista = [1, 2, 3]
mientero = 10
f(mientero, milista)
print("fuera:", mientero, milista)

46

return
Interrumpe inmediatamente la ejecucin de
una llamada a funcin.
Para que una funcin devuelva un valor, se
usa return seguida de una expresin.
Las funciones sin return (o con return sin
expresin) devuelven None.

47

return
Se puede devolver ms de un valor gracias a
las tuplas:
def minymax(lista):
return min(lista), max(lista)
a, b = minymax([1, 10, 2, 20, 3, 0])
print(a, b)

48

Ejercicio 4
Qu ocurre al ejecutar este programa?
def myfunction(a, b):
a += 1
b.append(0)
x = 1
y = [2, 1]
myfunction(x, y)
print(x, y)

49

Ejercicio 5
Qu ocurre al ejecutar este programa?
def myfunction(a, b):
a = 2 * a
b[0] = 10
b.append(0)
b = list(range(3))
return b*a
x = 1
y = list(range(6))
print(x, y)
print(myfunction(x, y))
print(x, y)

50

Ejercicio 6
Disea una funcin que, dados tres nmeros,
a, b y c, devuelva las dos races de la ecuacin
de segundo grado:

a x2 + b x + c = 0

Usa la funcin en un programa que pide los
tres nmeros y muestra por la pantalla la(s)
solucin(es) de la ecuacin. Ojo! Si slo hay
una solucin, no muestres dos valores.
51

Ms sobre
funciones
52

Consejo
En principio, las funciones deberan ser mudas y
ciegas:

No deberan mostrar nada por pantalla: reciben datos,


hacen un clculo y devuelven (va return) el resultado
No deberan uJlizar datos a parte de sus parmetros

Excepciones:

Funciones de salida: Se limitan a mostrar sus parmetros


por pantalla (en el formato adecuado). No hacen ningn
clculo
Funciones de entrada: Leen uno o ms datos por teclado
(o chero) y los devuelven. No hacen ningn clculo
(salvo los propios de comprobar que los datos se han
ledo correctamente)
53

Parmetros con valor por defecto


Podemos omiJr parmetros en la llamada
siempre que hayamos declarado su valor por
defecto
def multiply(value, factor=2):
return value * factor
print(multiply(3, 3), multiply(3)) # 9 6

54

Nmero variable de parmetros


def fn(*args):
print('---')
if len(args) > 0:
print('Hay {} parmetro/s:'.format(len(args)))
for arg in args: print(' ', arg)
else:
print('No hay parmetros')
fn(10)
fn(10, 20)
fn()
p = (10, 20)
fn(p)
fn(*p)

55

Nmero variable de
parmetros con nombre
def fn(**kw):
print('---')
if len(kw) > 0:
print('Hay {} parmetro/s:'.format(len(kw)))
for key in kw:
print(' {} -> {}'.format(key, kw[key]))
else:
print('No hay parmetros')
fn(a=10)
fn(x=10, y=20)
fn()
dic = {'p1' : 123, 'p2' : 'hola'}
fn(**dic)

56

Ejercicio 7
Qu ocurre?
def f (a, b, *c, **d):
return a + b + len(c) + d['yo']
print(f(1, 2, 1, 2, 3, yo=1, tu=2))
print(f(1, 2, yo=1, tu=2))
print(f(1, 2, 1, 2, 3))
print(f(1))

57

Anotacin de parmetros y funciones


def suma(a: "Int", b: "Int" = 5) -> "Int":
return a+b

De momento, Python no uJliza dicha informacin.


Facilita el trabajo del programador.
Es compaJble con los parmetros por defecto.
58

Valores de primera clase


Las funciones son valores de primera clase
def summation(a, b, f):
s = 0
for i in range(a, b+1): s+= f(i)
return s
def square(x):
return x*x
def cube(x):
return x*x*x
functions = [square, cube]
for function in functions:
print(summation(1, 3, function), end=" ")
#Escribe: 14 36

59

Funciones annimas
Podemos denir funciones sencillas sin nombre
lambda parmetros: expresin
Ejemplo:
def summation(a, b, f):
s = 0
for i in range(a, b+1): s += f(i)
return s

def square(x):
return x*x
print(summation(1, 3, square))
print(summation(1, 3, lambda x: x*x))

60

Las funciones annimas


hacen la vida ms fcil
names = ['Juan', 'Ana', 'Luisa', 'Federico', 'Adriana']
print(sorted(names))
print(sorted(names, key = lambda n: len(n)))
print(sorted(names, key = lambda n: n[0]))

['Adriana', 'Ana', 'Federico', 'Juan', 'Luisa']


['Ana', 'Juan', 'Luisa', 'Adriana', 'Federico']
['Ana', 'Adriana', 'Federico', 'Juan', 'Luisa']

61

Orientacin a
objetos

62

Clase
La palabra reservada class permite denir una
clase.
En su cuerpo aparecen deniciones de
funciones: mtodos.
Los mtodos Jenen un primer parmetro
llamado self (por convenio) que es una
referencia a una instancia de la clase.
Los mtodos se acceden y los campos (o
atributos) se denen/acceden con el operador
punto (.) sobre self.
63

class Person:
__slots__ = ('name', 'age')

campos

def __init__(self, name, age):


self.name = name
self.age = age

constructor

def last_name(self):
return self.name.split()[-1]

mtodo

somebody = Person('Juan Nadie', 35)


print(somebody.name, somebody.age)
print('Last name:', somebody.last_name())

64

Ejercicio 8
Dene una clase Estudiante en el que almacenamos el
nombre y un diccionario cuyas claves son asignaturas a
las que asociamos calicaciones.
Un estudiante recibe nombre al ser construido, pero
nada ms.
Si e es un estudiante, con e.calica(EI1022, 10) le
asignamos un 10 a la asignatura EI1022. Con
e.nota(EI1022) obtenemos la nota de esa asignatura.
Con e.media() obtenemos su nota media (o None si no ha
cursado nada). Con e.muestra_expediente() vemos su
nombre y una tabla con sus asignaturas y notas.

65

Mtodos especiales
Ciertos mtodos se invocan de modo especial:

def __len__(self)

len(instancia)

def __contains__(self, value)

value in instancia

def __geJtem__(self, key)

instancia[key]

def __seJtem__(self, key, value)

instancia[key] = value

def __iter__(self)

for i in instancia:

def __str__(self) print(instancia) # PRIORIZA LEGIBILIDAD


def __repr__(self) print(instancia) # DEBE SER LA INVERSA DE eval
Nota: slo se usa si __str__(self) no est denido
def __gt__(self, other)

instancia > other

def __call__(self, *args)

instancia(arg1, arg2, , argn)

def __add__(self, other)

instancia + other
66

Ejemplo
Queremos implementar objetos de Jpo
mulJconjunto. Un mulJconjunto es una coleccin
de elementos con posibles repeJciones.
Usaremos un diccionario en el que la clave es un
elemento y el valor es el nmero de repeJciones
Creemos una clase Mul;Set con mtodos para
aadir elementos, eliminar elementos, preguntar
por la pertenencia de un elemento, iterar
67

class MultiSet:
def __init__(self, seq=[]):
self.content = {}
for item in seq:
self.add(item)

A = MultiSet([1, 3, 3])
A.add(1)
A.add(4)
print(len(A))
print(1 in A, 2 in A)
A.remove(4)
A.remove(3)
for a in A:
print(a)
print(A)

def add(self, item):


try:
self.content[item] += 1
except KeyError:
self.content[item] = 1
def __len__(self):
return sum(self.content[key]
for key in self.content)
def __contains__(self, item):
return item in self.content
def remove(self, item):
if item in self.content:
self.content[item] -= 1
if self.content[item] == 0:
del self.content[item]
def __iter__(self):
for item in self.content:
for count in range(self.content[item]):
yield item
def __repr__(self):
return 'Multiset(' + repr([item for item in self]) + ')'

68

Herencia
Podemos crear clases que heredan los mtodos de
otras
Sirve para:
Crear clases que especializan a una clase. Por
ejemplo, un estudiante de doctorado y un estudiante
de grado son dos Jpos diferentes de estudiante.
Tienen algunos campos en comn (nombre,
direccin, etc) y otros diferentes (en el primer caso,
Ttulo del proyecto de tesis, tutor de doctorado en
el segundo caso, especialidad que cursa)
Evitar la reescritura de cdigo
Expresar relaciones sobre la naturaleza de los
objetos

69

Cmo referirse a la clase padre?


class ClaseHija(ClasePadre):
def __init__(self, args):

algunos_argumentos = args

ClasePadre.__init__(self, algunos_argumentos)

#otras inicializaciones

def mtodo(self, x):

ClasePadre.mtodo(self, x)

#ms cosas

70

Propiedades
Adems de atributos y
mtodos, nuestras clases
pueden tener propiedades
(proper;es).
Son una alternaJva a los
geGers y seGers.
Se denen en la clase como
mtodos decorados.
Se uJlizan desde fuera como
atributos.

class Props(object):
def __init__(self):
self._x = 0

@property
def x(self):
#getter
return self._x
@x.setter
def x(self, v): #setter
self._x = v
props = Props()
props.x = 5
print(props.x)

71

Inyeccin de dependencias
Es un patrn uJlizado habitualmente por la biblioteca
algoritmia .
Permite que una clase reciba constructores externos.
from algoritmia.datastructures.sets import IntSet
class Alg(object):
def __init__(self, createSet = lambda capacity : set()):
self.createSet = createSet
def f1(self, c):
aux = self.createSet(capacity=c)
aux.add(7)
print(aux)
x = Alg()
x.f1(10)

# usamos set para los conjuntos


# en este caso el 10 no se utiliza

y = Alg(IntSet) # usamos IntSet


y.f1(10)
# 10 es el entero mximo del IntSet
72

Excepciones

73

Excepciones
Cuando se produce un error de ejecucin, se
lanza inmediatamente una excepcin.
a = 1/0
print('End')

# ZeroDivisionError
# No se ejecuta

Un excepcin es un objeto especial que


podemos interceptar para tratar de
recuperarnos del error.
Si el programa no intercepta una excepcin, lo
har el intrprete, que mostrar por pantalla
un mensaje de error.
74

Excepciones
Hay una estructura de control para capturar
excepciones: try-except
try:

a = 1/0
except ZeroDivisionError:
print("Divisin por 0")

75

Excepciones
Las excepciones pueden ir acompaadas de
informacin adicional a la que podemos
acceder de la siguiente forma:

try:

a = 1/0
except ZeroDivisionError as e:
print("Error: {0}".format(e))

76

Excepciones
Podemos lanzar una excepcin cuando
detectemos un error:
raise IndexError

Podemos aadir informacin adicional a la


excepcin:
raise IndexError("mensaje explicativo")

77

Mdulos

78

Programas y libreras
Un programa suele residir en un chero .py
Pero no es natural tener todo nuestro cdigo en
un solo chero:
su tamao puede hacerlo inmanejable (puede tener
varios millares de lneas).
no invita a reuJlizar el cdigo.

El desarrollo puede dividir el programa en


unidades independientes y reuJlizables: mdulos.
Los cheros deben estar en la ruta de bsqueda
(sys.path), que por defecto incluye al propio
directorio.
79

import y from-import
Cualquier chero .py se puede uJlizar como un
mdulo que exporta sus deniciones.
Podemos acceder a un mdulo con la sentencia
import.
Supongamos que unmodulo.py conJene la
denicin de una funcin llamada f:
import unmodulo

unmodulo.f()

from unmodulo import f



f()

from unmodulo import *



f()

from unmodulo import f as x



x()
80

Instalar biblioteca algoritmia


Si no lo Jenes ya, instala en eclipse el plugin
MercurialEclipse.
La biblioteca est en un repositorio Mercurial con
la direccin:
hps://hg01.codeplex.com/algoritmia

Instala la biblioteca desde el propio Eclipse usando
Import (botn derecho sobre ProjectExplorer).
Se instala como un proyecto.
81

Ejercicio 9
Haz un programa que importe la clase UndirectedGraph
que se encuentra en la biblioteca de algoritmia en el mdulo
algoritmia.datastructures.digraphs y crea un
grafo para representar el siguiente mapa de carreteras:
Villorrio
Villaabajo

Villita

Villaarriba

Villaconejos

Villavilla

Recorre los vrJces del grafo y muestra, para cada uno, sus
ciudades vecinas.

NOTA: Para que un proyecto uJlice la biblioteca


algoritmia tendrs que aadir una referencia a ella en
las propiedades del proyecto.
82

Ficheros de
texto

83

Lectura de cheros de texto


Como open devuelve un iterable, podemos
leer un chero con un for:
for line in open("nombrefichero.txt", encoding='utf-8'):
print(line)

84

Escritura de cheros de texto



f = open("nombrefichero.txt", mode='w', encoding='utf-8')
f.write("una lnea\n")
f.write("y una ms ")
f.write("aunque la escribe en dos pasos\n")
f.close()

85

Iterables

86

Iterables
Podemos recorrer el contenido de una lista,
conjunto, claves de un diccionario porque
estos objetos son iterables
a = [1, 2, 3]
for elem in a:
print(elem)
b = {'a': 1, 'b': 2, 'c': 3}
for key in b:
print(key, b[key])

87

Generadores
Un generador es un objeto que genera una
secuencia (nita o no) de elementos.
range(n), por ejemplo, es un generador (de
enteros consecuJvos).
Los generadores son iterables. Podemos usar
generadores, por ejemplo, donde se espera un
iterable en un bucle for.
Y podemos crear listas con expresiones
generatrices.
88

Expresiones generatrices
a = [ i*2 for i in range(5) ]
a = []
for i in range(5):
a.append(i*2)

b = [ i*2 for i in range(10) if i % 2 == 0]


b = []
for i in range(10):
if i % 2:
b.append(i*2)

c = [ i+j for i in range(3) for j in range(4)]


c = []
for i in range(3):
for j in range(4):
c.append(i+j)

89

d = dict( (i, i+3) for i in range(10) )


d = {}
for i in range(10):
d[i] = i+3

e = set( i / 2 for i in range(10) )


e = set()
for i in range(10):
e.add(i/2)

90

Ejercicio 10
UJlizando una expresin generatriz, inicializa
un diccionario que asocie a cada nmero
entre 1 y 100 el valor True si el nmero es
divisible por 3 y False en caso contrario.

91

yield
Los generadores son objetos que producen
una secuencia de valores.
Se pueden implementar con funciones que
uJlicen la instruccin yield.
Al llegar a yield, la funcin interrumpe su
ejecucin, pero recuerda dnde lo hizo y
puede seguir cuando se solicita el siguiente
valor en la secuencia.
92

Esta funcin genera los primeros 100 nmeros


pares:
def pares():
for i in range(100):

yield 2*i

Y se puede usar donde esperamos un


generador:
for elem in pares(): print(elem)
p = [elem for elem in pares()]
93

Ejercicio 11
Disea una funcin que reciba una lista y
genere una secuencia con el cuadrado de cada
uno de sus elementos.
Usa la funcin para mostrar por pantalla los
cuadrados de la lista [1, 2, 10, 4, 5].

94

Ejercicio 12
Escribe una funcin, rst, que reciba un
entero n y un iterable iter y genere los n
primeros elementos de iter. UJliza yield.
Prueba rst con las siguientes entradas:
a) first(20, range(50, 200))
b) first(100, [2,4,5,7,2])

95

Ejercicio 13
Escribe una funcin, lter, que reciba una
funcin cond (que reciba un entero y devuelva
un booleano) y un iterador iter y genere los
elementos de iter que hagan que cond sea
cierto.
Prueba lter con las siguientes entradas:
a) Filter(lambda n: n<100, range(50, 200))
b) filter(lambda n: n%2 == 0, [2,4,5,7,2])

96

Ejercicio 14
Escribe una funcin, take_while, que reciba
una funcin cond (que reciba un entero y
devuelva un booleano) y un iterador iter y
genere elementos de iter hasta que encuentre
uno que haga que cond sea falso.
Prueba take_while con las siguientes entradas:
a) take_while(lambda n: n<100, range(50, 200))
b) take_while(lambda n: n%2 == 0, [2,4,5,7,2])

97

Ejercicio 15
Disea una funcin generadora, squares, que
genere la secuencia (innita) de los cuadrados
perfectos desde el uno.
UJliza squares, rst, lter y take_while para:
a) Obtener los primeros 100 cuadrados perfectos.
b) Obtener los cuadrados perfectos menores que
100.
c) Obtener los 20 primeros cuadrados perfectos
capicas.
98

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