In [1]:
"""
IPython Notebook v4.0 para python 2.7
Librerías adicionales: Ninguna.
Contenido bajo licencia CC-BY 4.0. Código bajo licencia MIT. (c) Sebastian Flores.
"""

# Configuracion para recargar módulos y librerías 
%reload_ext autoreload
%autoreload 2

from IPython.core.display import HTML

HTML(open("style/iwi131.css", "r").read())


Out[1]:






IWI131

Programación de Computadores

Sebastián Flores

http://progra.usm.cl/

https://www.github.com/usantamaria/iwi131

¿Qué contenido aprenderemos?

  • Ciclo for

¿Porqué aprenderemos ese contenido?

  • Ciclo for

Porque la mayor parte de los ciclos while simplemente recorren una lista de números o elementos, y conviene simplificar su notación.

Ciclo for

El ciclo for no permite hacer nada nuevo, sólo representa una forma compacta de representar un ciclo while.

Aparte de ahorrar un par de líneas, ¡permite concentrar la atención en lo que realmente importa!


In [2]:
j = 0
while j<10:
    print j, 
    j += 1


0 1 2 3 4 5 6 7 8 9

In [3]:
# Toda la información de los valores utilizados está en range(10)
for j in range(10): 
    print j,


0 1 2 3 4 5 6 7 8 9

Ciclo for

La estructura del ciclo for es la siguiente:

for element in lista:
    hacer algo con elemento

Los elementos de la lista (o tupla) se van obteniendo de manera ordenada y secuencial.

También su pueden utilizar break y continue (pero no es habitual).

Ciclo for

Iterando con range

La función range entrega una lista de valores, que puede utilizarse directamente con range:


In [7]:
print range(30)
for i in range(30):
    print i**2,


[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841

In [8]:
for i in range(30, 60):
    print i,


30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

In [10]:
for i in tuple(range(30,60,4)):
    print i,


30 34 38 42 46 50 54 58

Ciclo for

Comparación con while

Ejercicio: Imprima todos los multiplos de 3 entre 1 y 80


In [11]:
j = 1
while j<80:
    if j%3==0:
        print j, 
    j += 1


3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78

In [12]:
for j in range(3,80,3):
    print j,


3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60 63 66 69 72 75 78

Ciclo for

Iterando con listas conocidas

Si la lista es conocida podemos iterar sobre los índices con range o sobre los elementos directamente.


In [24]:
mi_lista = ["sebastian", "carlos", "jose"]
# Iterando con indices
for i in range(len(mi_lista)):
    print i, mi_lista[i]
    mi_lista[i] = str(i) + "holamundo"+mi_lista[i] * 2
    
print mi_lista


0 sebastian
1 carlos
2 jose
['0holamundosebastiansebastian', '1holamundocarloscarlos', '2holamundojosejose']

In [25]:
mi_lista = ["sebastian", "carlos", "jose"]
# Iterando con indices
for nombre in mi_lista:
    for letra in nombre:
        print letra,
    print ""
    #print nombre
    #nombre = nombre * 2
    
print mi_lista


s e b a s t i a n 
c a r l o s 
j o s e 
['sebastian', 'carlos', 'jose']

Ciclo for

Iterando con tuplas conocidas

Si la tupla es conocida podemos iterar sobre los índices con range o sobre los elementos directamente. No hay diferencias a recorrer una lista.


In [31]:
mi_tupla = ("sebastian", "carlos", "jose")

# Iterando con indices
for i in range(len(mi_tupla)):
    print i, mi_tupla[i]
    #mi_tupla[i] = str(i) + "holamundo"+mi_tupla[i] * 2
    
print mi_tupla


0 sebastian
1 carlos
2 jose
('sebastian', 'carlos', 'jose')

In [32]:
mi_tupla = ("sebastian", "carlos", "jose")
# Iterando con indices
for nombre in mi_tupla:
    print nombre
    nombre = nombre*2

print mi_tupla


sebastian
carlos
jose
('sebastian', 'carlos', 'jose')

Ciclo for

Ejemplo

Dadas las listas con nombres y horarios de los ramos, imprima el nombre de cada ramo con su horario.


In [41]:
ramos = ['Progra', 'Mate', 'Fisica']
horas = ['8:00', '10:00', '12:00',"21:00"]
for i in range(len(ramos)):
    #if ramos[i]=="Progra":
    #    horas[i] = "todo el dia"
    print ramos[i] + " a las " + horas[i]

print "\nProducto cartesiano:"
for ramo in ramos:
    for hora in horas:
        print ramo + " a las " + hora


Progra a las 8:00
Mate a las 10:00
Fisica a las 12:00

Producto cartesiano:
Progra a las 8:00
Progra a las 10:00
Progra a las 12:00
Progra a las 21:00
Mate a las 8:00
Mate a las 10:00
Mate a las 12:00
Mate a las 21:00
Fisica a las 8:00
Fisica a las 10:00
Fisica a las 12:00
Fisica a las 21:00

Ciclo for

Ejercicio 1: Promedio y Desviación Estandar Revisitados

Calcule el promedio y la desviación estándar de $N$ datos, $x_1$, ..., $x_n$, ingresados por el usuario:

$$ \begin{align} mean &= \frac{1}{n} \sum_{i=1} x_i \\ (std)^2 &= \frac{1}{n} \sum_{i=1} (x_i- mean)^2 \end{align} $$

Transformando desde ciclo while a ciclo for


In [42]:
def leer_datos(cantidad):
    datos = []
    for i in range(cantidad):
        datos.append( float(raw_input('Dato ' + str(i+1) + ': ')) )
        print "datos", datos
    return datos

def promedio(valores):
    return sum(valores) / float(len(valores))

def desviacion(valores):
    p = promedio(valores)
    suma = 0.0
    for numero in valores:
        suma += (numero - p) ** 2
    return ( suma / len(valores) ) ** 0.5

n = int(raw_input('Cuantos datos? '))
datos = leer_datos(n)
print 'El promedio es ', promedio(datos)
print 'La desviacion estandar es', desviacion(datos)


Cuantos datos? 5
Dato 1: 4
datos [4.0]
Dato 2: 5
datos [4.0, 5.0]
Dato 3: 3
datos [4.0, 5.0, 3.0]
Dato 4: 8
datos [4.0, 5.0, 3.0, 8.0]
Dato 5: 10
datos [4.0, 5.0, 3.0, 8.0, 10.0]
El promedio es  6.0
La desviacion estandar es 2.60768096208

Ciclo for

Ejercicio

Un polígono está determinado por la lista de sus vértices Escriba una función perimetro(vertices) que entregue el perímetro del polígono definido por la lista vertices:

p = [(4, 1), (7, 2), (7, 4), (5, 9)]
print perimetro(p) # 18.609700215601432

In [ ]:
# Definicion de funcion(es)

# Uso de funciones
p = [(4, 1), (7, 2), (7, 4), (5, 9)]
print perimetro(p) # 18.609700215601432

Ciclo for

Ejercicio

Un polígono está determinado por la lista de sus vértices.

Escriba una función perimetro(vertices) que entregue el perímetro del polígono definido por la lista vertices:

p = [(4, 1), (7, 2), (7, 4), (5, 9)]
print perimetro(p) # 18.609700215601432

In [43]:
# Definicion de funcion(es)
def distancia(p1, p2):
    x1, y1 = p1
    x2, y2 =  p2
    return 0. + ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** .5

def perimetro(vertices):
    n = len(vertices)
    suma = 0.0
    for i in range(n):
        a = vertices[i]
        b = vertices[(i + 1) % n]
        suma += distancia(a, b)
    return suma

# Uso de funciones
p = [(4, 1), (7, 2), (7, 4), (5, 9)]
print perimetro(p) # 18.609700215601432


18.6097002156

Ciclo for

Ejercicio Tipo Certamen: C2 1S 2015

Una nueva cadena de cines creada por emprendedores de la USM, está ingresando al mercado cinematográfico. Por eso necesita de su ayuda para implementar ciertas funciones de la cartelera en python y con ellas manejar la cartelera.

Para ello se cuenta con la información de cine en una lista de tuplas como cartelera. A modo de ejemplo, en cartelera la película ’Gloria’ (Chilena), creada en 2013, se exhibirá el mes de ’enero’ en las ’sala1’ y ’sala2’.

Cada elemento de la lista tiene la siguiente estructura:

(mes, 
 pais, 
 nombre_pelicula, 
 año_filmacion, 
 [sala1, sala2, ...])

In [45]:
cartelera = [
('febrero', 'FRANCIA', 'El muelle', 1962, ['sala1', 'sala3']),
('febrero', 'FRANCIA', 'La dama de honor', 2004, ['sala1', 'sala4']),
('abril', 'RUSIA', 'Padre del soldado', 1964, ['sala3', 'sala2', 'sala4']),
('enero', 'CHILE', 'Gloria', 2013, ['sala1', 'sala2']),
('mayo', 'MEXICO', 'Cumbres', 2013, ['sala3', 'sala2']),
('julio', 'FRANCIA', 'Melo', 1986, ['sala3', 'sala1']),
('junio', 'BELGICA', 'Rondo', 2012, ['sala4', 'sala2']),
('marzo', 'ALEMANIA', 'Tiempo de Canibales', 2014, ['sala1', 'sala2']),
('marzo', 'ALEMANIA', 'Soul Kitchen', 2009, ['sala3', 'sala4']),
]

Ejercicio Tipo Certamen: C2 1S 2015

Pregunta 1

Desarrolle la función pelicula_por_pais(cartelera, pais) que recibe la lista de la cartelera y el nombre de un país, y que retorne la lista con las películas realizadas en dicho país. Cada elemento de esta lista resultante es una tupla con el nombre de la película y el año de filmación.

>>> pelicula_por_pais(cartelera, 'FRANCIA')
[('El muelle', 1962), ('La dama de honor', 2004), ('Melo', 1986)]

In [ ]:
# Solucion estudiantes

Ejercicio Tipo Certamen: C2 1S 2015

Solución pregunta 1

Desarrolle la función pelicula_por_pais(cartelera, pais) que recibe la lista de la cartelera y el nombre de un país, y que retorne la lista con las películas realizadas en dicho país. Cada elemento de esta lista resultante es una tupla con el nombre de la película y el año de filmación.

>>> pelicula_por_pais(cartelera, 'FRANCIA')
[('El muelle', 1962), ('La dama de honor', 2004), ('Melo', 1986)]

In [ ]:
# Solucion con while
def pelicula_por_pais(cartelera, pais):
    n = len(cartelera)
    j = 0
    peliculas_pais = []
    while j<n:
        mes_j, pais_j, nombre_pelicula_j, anno_j, salas_j = cartelera[j]
        if pais_j==pais:
            peliculas_pais.append( (nombre_pelicula_j, anno_j) )
        j += 1

    return peliculas_pais

print pelicula_por_pais(cartelera, 'FRANCIA')

In [46]:
# Solucion con ciclo for
def pelicula_por_pais(cartelera, pais):
    peliculas_pais = []
    for datos in cartelera:
        mes_j, pais_j, nombre_pelicula_j, anno_j, salas_j = datos
        if pais_j==pais:
            peliculas_pais.append( (nombre_pelicula_j, anno_j) )
    return peliculas_pais

print pelicula_por_pais(cartelera, 'FRANCIA')


[('El muelle', 1962), ('La dama de honor', 2004), ('Melo', 1986)]

Ejercicio Tipo Certamen: C2 1S 2015

Pregunta 2

Desarrolle la función peliculas_por_sala(cartelera, sala) que reciba la lista de la cartelera y la sala donde se exhibirán las distintas películas. Esta función debe retornar una lista donde el elemento i sea una lista con el nombre de las películas que se exhibirán en dicha sala en el mes (i+1)-ésimo.

pelicula_por_sala(cartelera, 'sala1')
[['Gloria'],                        # Enero
 ['El muelle', 'La dama de honor'], # Febrero
 ['Tiempo de Canibales']            # Marzo
 ...
 ]

In [ ]:
# Estudiantes

Ejercicio Tipo Certamen: C2 1S 2015

Pregunta 2

Desarrolle la función peliculas_por_sala(cartelera, sala) que reciba la lista de la cartelera y la sala donde se exhibirán las distintas películas. Esta función debe retornar una lista donde el elemento i sea una lista con el nombre de las películas que se exhibirán en dicha sala en el mes i+1.

pelicula_por_sala(cartelera, 'sala1')
[['Gloria'],                        # Enero
 ['El muelle', 'La dama de honor'], # Febrero
 ['Tiempo de Canibales']            # Marzo
 ...
 ]

In [52]:
# Solucion con ciclo for
def pelicula_por_sala(cartelera, sala):
    # Crear lista donde guardar las peliculas
    peliculas = []
    for i in range(12):
        peliculas.append([])
    # Recorrer las peliculas y guardar los datos
    for dato in cartelera:
        mes, pais, nombre_pelicula, anno, salas = dato
        if sala in salas:
            if mes=="enero":
                peliculas[0].append(nombre_pelicula)
            elif mes=="febrero":
                peliculas[1].append(nombre_pelicula)
            elif mes=="marzo":
                peliculas[2].append(nombre_pelicula)
            elif mes=="abril":
                peliculas[3].append(nombre_pelicula)
            elif mes=="mayo":
                peliculas[4].append(nombre_pelicula)
            elif mes=="junio":
                peliculas[5].append(nombre_pelicula)
            elif mes=="julio":
                peliculas[6].append(nombre_pelicula)
            elif mes=="agosto":
                peliculas[7].append(nombre_pelicula)
            elif mes=="septiembre":
                peliculas[8].append(nombre_pelicula)
            elif mes=="octubre":
                peliculas[9].append(nombre_pelicula)
            elif mes=="noviembre":
                peliculas[10].append(nombre_pelicula)
            elif mes=="diciembre":
                peliculas[11].append(nombre_pelicula)
            else:
                print "Hmmm, no conozco ese mes"
    # Regresar la lista
    return peliculas

pelicula_por_sala(cartelera, 'sala1')


Out[52]:
[['Gloria'],
 ['El muelle', 'La dama de honor'],
 ['Tiempo de Canibales'],
 [],
 [],
 [],
 ['Melo'],
 [],
 [],
 [],
 [],
 []]

Ejercicio Tipo Certamen: C2 1S 2015

Pregunta 2

Desarrolle la función peliculas_por_sala(cartelera, sala) que reciba la lista de la cartelera y la sala donde se exhibirán las distintas películas. Esta función debe retornar una lista donde el elemento i sea una lista con el nombre de las películas que se exhibirán en dicha sala en el mes i+1.

pelicula_por_sala(cartelera, 'sala1')
[['Gloria'],                        # Enero
 ['El muelle', 'La dama de honor'], # Febrero
 ['Tiempo de Canibales']            # Marzo
 ...
 ]

In [ ]:
# Solucion con ciclo while
def pelicula_por_sala(cartelera, sala):
    # Crear lista donde guardar las peliculas
    peliculas = []
    for i in range(12):
        peliculas.append([])
    # Recorrer las peliculas y guardar los datos
    j = 0
    
    for j in range(len(cartelera)):
        dato = cartelera[j]
        mes, pais, nombre_pelicula, anno, salas = dato
        if sala in salas:
            if mes=="enero":
                peliculas[0].append(nombre_pelicula)
            elif mes=="febrero":
                peliculas[1].append(nombre_pelicula)
            elif mes=="marzo":
                peliculas[2].append(nombre_pelicula)
            elif mes=="abril":
                peliculas[3].append(nombre_pelicula)
            elif mes=="mayo":
                peliculas[4].append(nombre_pelicula)
            elif mes=="junio":
                peliculas[5].append(nombre_pelicula)
            elif mes=="julio":
                peliculas[6].append(nombre_pelicula)
            elif mes=="agosto":
                peliculas[7].append(nombre_pelicula)
            elif mes=="septiembre":
                peliculas[8].append(nombre_pelicula)
            elif mes=="octubre":
                peliculas[9].append(nombre_pelicula)
            elif mes=="noviembre":
                peliculas[10].append(nombre_pelicula)
            elif mes=="diciembre":
                peliculas[11].append(nombre_pelicula)
            else:
                print "Hmmm, no conozco ese mes"
        j += 1 # No olvidemos aumentar el contador
    # Regresar la lista
    return peliculas

pelicula_por_sala(cartelera, 'sala2')

Ejercicio Tipo Certamen: C2 1S 2015

Pregunta 3

Desarrolle la función mas_antigua(cartelera) que retorne el nombre de la película y el país donde fue filmada la película más antigua. Si dos o más películas son las más antiguas, seleccione cualquiera.

mas_antigua(cartelera)
('El muelle', 'FRANCIA')

In [ ]:
# Solución estudiantes

Ejercicio Tipo Certamen: C2 1S 2015

Pregunta 3

Desarrolle la función mas_antigua(cartelera) que retorne el nombre de la película y el país donde fue filmada la película más antigua. Si dos o más películas son las más antiguas, seleccione cualquiera.

mas_antigua(cartelera)
('El muelle', 'FRANCIA')

In [53]:
# Solucion ciclo for
def mas_antigua(cartelera):
    # Inicializar contadores
    anno_mas_antigua = float("inf")
    tupla_mas_antigua = ("","")
    # Recorrer las peliculas y guardar los datos
    for dato in cartelera:
        mes, pais, nombre_pelicula, anno, salas = dato
        if anno < anno_mas_antigua:
            anno_mas_antigua = anno
            tupla_mas_antigua = (nombre_pelicula, pais)
    # Terminamos, regresar valor
    return tupla_mas_antigua

print mas_antigua(cartelera)


('El muelle', 'FRANCIA')

Ejercicio Tipo Certamen: C2 1S 2015

Pregunta 3

Desarrolle la función mas_antigua(cartelera) que retorne el nombre de la película y el país donde fue filmada la película más antigua. Si dos o más pel ́ıculas son las más antiguas, seleccione cualquiera.

mas_antigua(cartelera)
('El muelle', 'FRANCIA')

In [ ]:
# Solucion ciclo while
def mas_antigua(cartelera):
    # Inicializar contadores
    anno_mas_antigua = float("inf")
    tupla_mas_antigua = ("","")
    # Recorrer las peliculas y guardar los datos
    j = 0
    for j in range(len(cartelera)):
        dato = cartelera[j]
        mes, pais, nombre_pelicula, anno, salas = dato
        if anno < anno_mas_antigua:
            anno_mas_antigua = anno
            tupla_mas_antigua = (nombre_pelicula, pais)
        j += 1
    # Terminamos, regresar valor
    return tupla_mas_antigua

print mas_antigua(cartelera)

Desafío

Desarrolle una función que cumpla los siguientes tests. Enviar por correo.

Caso 1:

  • INPUT: [9, 6, 7, 4, 5, 2, 1]
  • OUPUT: [1, 5, 7, 9]

Caso 2:

  • INPUT: [53, 55, 57, 58, 59]
  • OUPUT: [53, 55, 57, 59]

Caso 3:

  • INPUT: [109, 108, 107, 106, 105, 104, 103, 102, 101]
  • OUPUT: [101, 103, 105, 107, 109]

Caso 4:

  • INPUT: [1, 1, 2, 3, 5, 8, 11, 19]
  • OUPUT: [1, 1, 3, 5, 11, 19]

OBS: No debería tomar más de 10-15 líneas.

Actividad 3

  • Lunes 7 Diciembre, a las 8:00 (puntual).
  • Grupos libres.
  • Practiquen con certamenes de años pasados.

Bonus Track

Todos Iguales

Escriba la función todos_iguales(lista) que indique si todos los elementos de una lista son iguales:

print todos_iguales([6, 6, 6])
True

print todos_iguales([6, 6, 1])
False

print todos_iguales([0, 90, 1])
False

print todos_iguales([7, 7, 7, 7, 7, 7, 7, 7, 7])
True

print todos_iguales([12])
True

In [ ]:
print todos_iguales([6, 6, 6])
print todos_iguales([6, 6, 1])
print todos_iguales([0, 90, 1])
print todos_iguales([7, 7, 7, 7, 7, 7, 7, 7, 7])
print todos_iguales([12])

In [ ]:
def todos_iguales(lista):
    if len(lista)==0:
        return True
    patron = lista[0]
    for elemento in lista:
        if elemento!=patron:
            return False
    return True

print todos_iguales([6, 6, 6])
print todos_iguales([6, 6, 1])
print todos_iguales([0, 90, 1])
print todos_iguales([7, 7, 7, 7, 7, 7, 7, 7, 7])
print todos_iguales([12])

Bonus Track

Todos distintos

Escriba una función todos_distintos(lista) que indique si todos los elementos de una lista son distintos:

print todos_distintos([6, 6, 6])
False

print todos_distintos([6, 6, 1])
False

print todos_distintos([0, 90, 1])
True

print todos_distintos(list(range(1000)))
True

print todos_distintos(list('hiperblanduzcos'))
True

Pista: lista[:i] y lista[i:]


In [ ]:
# Solucion Estudiantes

print todos_distintos([6, 6, 6])
print todos_distintos([6, 6, 1])
print todos_distintos([0, 90, 1])
print todos_distintos(list(range(1000)))
print todos_distintos(list('hiperblanduzcos'))

In [ ]:
def todos_distintos(lista):
    if len(lista)==0:
        return True
    for i in range(len(lista)):
        elemento = lista[i]
        if elemento in lista[:i]: 
            return False
        if elemento in lista[(i+1):]: 
            return False
    return True

print todos_distintos([6, 6, 6])
print todos_distintos([6, 6, 1])
print todos_distintos([0, 90, 1])
print todos_distintos(list(range(1000)))
print todos_distintos(list('hiperblanduzcos'))