In [ ]:
"""
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())






IWI131

Programación de Computadores

Sebastián Flores

http://progra.usm.cl/

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

Feedback de las encuestas

Lo bueno

  • Github con contenido actualizado
  • Ipython notebook slides son claras
  • Participación en clases
  • Ejercicios por alumnos, no por profesor
  • Minitareas
  • Teclado inalámbrico

Feedback de las encuestas

Lo malo

  • Certamen en papel: Completamente de acuerdo, pero dificil de cambiar.
  • Muy temprano en la mañana: Completamente de acuerdo, pero dificil de cambiar.
  • Limitación de aplicar material avanzado: Completamente de acuerdo, pero dificil de cambiar.
  • Grupos aleatorios: En evaluación.
  • Clases sin computadores: ¡Traigan su notebook!
  • Atrasados responden preguntas: ¡Lleguen temprano!
  • Ruido en clase: Completamente de acuerdo. ¡Sean más silenciosos!
  • Problemas son muy distintos al certamen: Enseñanza para el aprendizaje, no para el test.

Feedback del certamen

¿Qué tal el certamen 1?

Minuto de confianza.

  1. ¿Qué pudimos haber hecho mejor?
  2. ¿Qué cambiamos para el resto del semestre?
  3. ¿Qué fue lo fácil?
  4. ¿Qué fue lo difícil?

Hagan sus predicciones.

Próximas evaluaciones

  • Lu 7 Dic 8 am: Actividad 3
  • Lu 21 Dic 8 am: Actividad 4
  • Lu 21 Dic 7 pm: Certamen 2
  • Lu 5 Ene 8 am: Actividad 5
  • Vie 8 Ene 3:30 pm: Certamen 3
  • Lu 18 Ene 8 am: Certamen Recuperativo

¿Qué contenido aprenderemos hoy?

  • Módulos
  • Funciones avanzadas

¿Porqué aprenderemos ese contenido?

  • Módulos
  • Funciones avanzadas

Porque facilitan la utilización de funciones y es necesario saberlo para utilizar código creado por terceras personas.

1. Módulos o Librerías

Un módulo es un archivo python donde se han definido valores y parámetros:

  • Puede ser propio
  • Puede ser hecho por terceros.

1. Módulos o Librerías

1.1 Importando una función de una librería

Importando funciones específicas:

from modulo_a_usar import funcion_de_interes

Luego funcion_de_interes puede utilizarse directamente.


In [ ]:
from math import exp, cos, pi, sin
from random import randrange, choice
from turtle import * # Evitar

print exp(5.5)
print cos(pi / 2)
print randrange(10)
print choice(['Lunes', 'Martes', 'Viernes'])

1. Módulos o Librerías

1.2 Importando todo un módulo

Para importar todo un módulo:

import modulo_a_usar

Luego la funcion_de_interes puede utilizarse utilizando modulo_a_usar.funcion_de_interes


In [ ]:
import math
import random

print math.exp(5.5)
print math.cos(math.pi / 2)
print random.randrange(10)

print random.choice(['Lunes', 'Martes', 'Viernes'])

1. Módulos o librerías

1.3 Creación de Módulos

Cree un módulo que calcule el área de figuras geométricas. Utilizando el módulo realice los siguientes programas:

  1. El primero pregunta el numero de lados y luego la arista, y entrega el área.
  2. El segundo pregunta el lado de un cuadrado, y la altura, y luego entrega el volumen de la pirámide.

(Ver archivos adjuntos)

2. Funciones Avanzadas

  • Múltiples valores de retorno
  • Ningún valor de retorno
  • Valores por omisión
  • Función como argumento
  • Funciones recursivas

2.1 Funciones con múltiples valores de retorno

Simplemente retorne valores separados por comas.

Esto es extremadamente útil cuando en la función se generan distintos valores simultáneamente.


In [ ]:
def convertir_segundos(segundos):
    horas = segundos / (60 * 60)
    minutos = (segundos / 60) % 60
    segundos = segundos % 60
    return horas, minutos, segundos

h, m, s  = convertir_segundos(9814)
print s

2.1 Funciones con múltiples valores de retorno

Ejercicio

Realice una función que entregue simultáneamente el mínimo y el máximo de valores entregados por el usuario.


In [ ]:
def minmax():
    N = int(raw_input("Cuantos números: "))
    j = 1
    # FIX ME
    while j<=N:
        x = float(raw_input("Numero "+str(j)+": "))
        # FIX ME
        j += 1
    return mmin, mmax

# FIX ME
print "Minimo:", mimin
print "Maximo:", mimax

2.1 Funciones con múltiples valores de retorno

Solución

Realice una función que entregue el mínimo y el máximo de valores entregados por el usuario.


In [ ]:
def minmax():
    N = int(raw_input("Cuantos números: "))
    j = 1
    mi_min = +float("inf")
    mi_max = -float("inf")
    while j<=N:
        x = float(raw_input("Numero "+str(j)+": "))
        mi_min = min(x,mi_min)
        mi_max = max(x,mi_max)
        j += 1
    return mi_min, mi_max

mmin, mmax = minmax()
print "Minimo:", mmin
print "Maximo:", mmax

2.2 Funciones sin valor de retorno

Simplemente no retorne valores.

Esto es extremadamente útil cuando en la función hace algo pero no genera valores.


In [ ]:
def imprimir_datos(nombre, apellido, rol, dia, mes, anno):
    print ''
    print 'Nombre completo:', nombre, apellido
    print 'Rol:', rol
    print 'Fecha de nacimiento:',
    print dia, '/', mes, '/', anno    
    
imprimir_datos('Perico', 'Los Palotes', '201101001-1', 3, 1, 1993)
imprimir_datos('Yayita', 'Vinagre', '201101002-2', 10, 9, 1992)
imprimir_datos('Fulano', 'De Tal', '201101003-3', 14, 5, 1990)

2.2 Funciones sin valor de retorno

Ejercicio

Crear una función codigo_palabra(codigo) que reciba un código encriptado de sólo letras e imprima el mensaje desencriptado. La regla de desencriptación es la siguiente: la palabra desencriptada se obtiene recorriendo desde el final de la palabra hasta el comienzo, considerando solo las letras en ubicaciones impares. Empezando desde la ultima letra.

codigo_palabra('aczaarltp')
plaza

codigo_palabra('axruatgrrreov')
vergara

In [ ]:
def codigo_palabra(palabra):
    codigo=''
    # FIX ME
    while i<=len(palabra):
        # FIX ME
        print codigo

codigo_palabra('aczaarltp')
codigo_palabra('axruatgrrreov')

2.2 Funciones sin valor de retorno

Solución v1


In [ ]:
def codigo_palabra(palabra):
    n = len(palabra)-1
    codigo = ""
    while n>=0:
        codigo += palabra[n]
        n -= 2
    print codigo

codigo_palabra('aczaarltp')
codigo_palabra('axruatgrrreov')

2.2 Funciones sin valor de retorno

Solución v2


In [ ]:
def codigo_palabra(palabra):
    j = 1
    codigo = ""
    while j<=len(palabra):
        codigo += palabra[-j]
        j += 2
    print codigo

codigo_palabra('aczaarltp')
codigo_palabra('axruatgrrreov')

2.3 Parámetros con valores por omisión

Defina las variables y asigne valores por defecto (por omisión)

Esto es extremadamente util cuando en la función puede tener un número variable de argumentos.


In [ ]:
def f(a, b=2, c="toma b"):
    if c=="toma b":
        c = b
    return a + b*c

print f(10, b=1, c="toma b") # Probar f(10), f(10,2), f(10,15), etc.

2.3 Parámetros con valores por omisión

Ejercicio

Cree una función que regresa el perimetro de un polígono en función del radio $r$ y el número de lados $n$: $$P = 2 \ n \ r \tan\Big(\frac{\pi}{n}\Big)$$

  • Si no se ingresa el número de lados, regresa el perimetro de un círculo.
  • Si se ingresa un número de lados menor a 3, debe imprimir "Numero incorrecto de lados" y no regresar nada.

In [ ]:
# Import library

# Definir funcion

# Casos a utilizar
print perimetro(0.5, 2)
print perimetro(0.5, 3)
print perimetro(0.5, 4)
print perimetro(0.5, 10)
print perimetro(0.5, 20)
print perimetro(0.5, 1000)
print perimetro(0.5)

In [ ]:
# Importar modulos necesarios
import math

# Definir funcion
def perimetro(r, n="c"):
    if n=="c":
        return 2*math.pi*r
    elif n<=2:
        print "Numero incorrecto de lados"
    else:
        return 2*r*n*math.tan(math.pi/n)

# Casos a utilizar
print perimetro(0.5, 2)
print perimetro(0.5, 3)
print perimetro(0.5, 4)
print perimetro(0.5, 10)
print perimetro(0.5, 20)
print perimetro(0.5, 1000)
print perimetro(0.5)

2.4 Funciones como parámetros

Las funciones también son un objeto (tipo básico) en python, y pueden pasarse a otra función como argumento.

Esto es útil cuando queremos modificar el comportamiento de una función o queremos cambiar un tipo de evaluación.


In [ ]:
def sumar(n, f):
    s = 0
    i = 0
    while i<=n:
        s = s + f(i)
        i += 1
    return s

def identidad(x):
    return x

def cuadrado(x):
    return x ** 2

def cubo(x):
    return x ** 3

print sumar(1000, identidad)

print sumar(1000, cuadrado)

print sumar(1000, cubo)

2.4 Funciones como parámetros

Ejercicio

Crear una función que reciba 3 números y una función.

  • Si la función utilizada como argumento es la suma, se debe regresar la suma de los 3 números.
  • Si la función utilizada es la multiplicación, se debe regresar la multiplicación de los 3 números.

In [ ]:
def aplicar_funcion(a, b, c, funcion):
    # FIX ME
    # FIX ME
    return
    
def suma(x,y):
    return x+y

def multiplicar(x,y):
    return x*y
    
print aplicar_funcion(1, 2, 3, suma)

print aplicar_funcion(1, 2, 3, multiplicar)

print aplicar_funcion("a", "b", "c", suma)

print aplicar_funcion("a", 2, 3, multiplicar)

2.4 Funciones como parámetros

Solución


In [ ]:
def aplicar_funcion(a, b, c, funcion):
    ab = funcion(a,b)
    abc = funcion(ab, c)
    return abc
    
def suma(x,y):
    return x+y

def multiplicar(x,y):
    return x*y
    
print aplicar_funcion(1, 2, 3, suma)

print aplicar_funcion(1, 2, 3, multiplicar)

print aplicar_funcion("a", "b", "c", suma)

print aplicar_funcion("a", 2, 3, multiplicar)

2.5 Funciones recursivas

Una función puede llamar a otra función, incluso a sí misma.

Útil cuando la relación se explica en términos de sí misma.

¡Es crucial definir una condición de detención!


In [ ]:
def factorial(n):
    if n <= 0:
        return 1
    else:
        return factorial(n - 1) * n
    
print factorial(2)
print factorial(10)

2.5 Funciones recursivas

Ejercicio

Cree una funcion que sume los dígitos de un número de manera recursiva:

Por ejemplo, 234 deberia entregar 2+3+4= 9


In [ ]:
def suma_digitos(n):
    n_str = str(n)
    if len(n_str)==1:
        # FIX ME
    else:
        # FIX ME
    
print suma_digitos(234)

2.5 Funciones recursivas

Solución


In [ ]:
def suma_digitos(n):
    n_str = str(n)
    if len(n_str)==1:
        return n
    else:
        primer_digito = n_str[0]
        otros_digitos = n_str[1:]
        return int(primer_digito) + suma_digitos(int(otros_digitos))
    
print suma_digitos(234)

Minitareas

Enviar por correo, indicando:

  • Mensaje de saludo
  • Problema a resolver
  • Archivos adjuntos en formato nombre_de_problema_nombre_alumno.py