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/sebastiandres/iwi131

Clase pasada

  • Asignación y Expresión
  • Entrada y Salida de Datos
  • Tipos de Datos

¿Qué contenido aprenderemos hoy?

  • Trabajar en python
  • Funciones
  • Ruteo

¿Por qué aprenderemos ese contenido?

  • Trabajar en python
    • Porque ya tienen suficientes herramientas para comenzar a escribir (y tener problemas).
  • Funciones
    • Porque permiten reutilizar código, reduciendo el largo de un programa computacional y disminuyendo posibilidad de errores.
  • Ruteo
    • Porque para hacer trabajar al computador necesitamos saber como funciona.

Ejemplo motivador

  • Calcule el área de circulos con radios: 0.2 [m], 1.0 [m], 42.0 [m].
  • Imprima el radio y el área obtenida
Output deseado:
Circulo de radio 0.2 [m] tiene area 0.1256 [m2]
Circulo de radio 1.0 [m] tiene area 3.14 [m2]
Circulo de radio 42.0 [m] tiene area 5538.96 [m2]

Ejemplo motivador

  • Calcule el área de circulos con radios: 0.2 [m], 1.0 [m], 42.0 [m].
  • Imprima el radio y el área obtenida

In [3]:
r = 0.2
area = 3.14*r**2
print "Circulo de radio", r, "[m] tiene area", area, "[m2]"
r = 1.0
area = 3.14*r**2
print "Circulo de radio", r, "[m] tiene area", area, "[m2]"
r = 42.0
area = 3.14*r**2
print "Circulo de radio", r, "[m] tiene area", area, "[m2]"


Circulo de radio 42.0 [m] tiene area 5538.96 [m2]
Circulo de radio 42.0 [m] tiene area 5538.96 [m2]
Circulo de radio 42.0 [m] tiene area 5538.96 [m2]

¿Que pasa si necesitamos cambiar el texto? ¿O aumentar la precisión de $\pi$?

Ejemplo motivador

  • Calcule el área de circulos con radios: 0.2 [m], 1.0 [m], 42.0 [m].
  • Imprima el radio y el área obtenida

In [5]:
def area(r):
    area = 3.14159236 * r**2
    print "Circulo de radio", r, "[m] tiene area", area, "[m2]"
    return

area(0.2)
area(1.0)
area(42.0)


Circulo de radio 0.2 [m] tiene area 0.1256636944 [m2]
Circulo de radio 1.0 [m] tiene area 3.14159236 [m2]
Circulo de radio 42.0 [m] tiene area 5541.76892304 [m2]

Las funciones permiten encapsular código, permitiendo modificarlo más facilmente y reutilizarlo.

Funciones

Una función (en informática) es una agrupación de acciones. Nada más.

Una función (en informática) no es una función matemática: puede regresar más de un valor, puede regresar cualquier tipo de dato o no regresar valores.


In [2]:
def f(x):
    return int(x), 2*x-1, 3*int(x), x>0, "Cool"
val = f(0.0)
print val


(0, -1.0, 0, False, 'Cool')

Funciones

Una función (en informática) no es una función matemática:

  • Puede regresar más de un valor o no regresar valores.
  • Puede regresar cualquier tipo de dato.
  • Puede llamarse a sí misma o a otras funciones.

In [21]:
# Es primo no es una función matematica
def es_primo(n):
    n_es_primo = all(n%j!=0 for j in range(1,int(n**0.5)))
    if n_es_primo:
        print n, "es primo"
    else:
        print n, "no es primo"

In [23]:
es_primo(10000)


10000 no es primo

Problema

La fuerza de atracción gravitacional entre 2 planetas de masas $m_1$ y $m_2$ separados por una distancia de $r$ kilómetros esta dada por la fórmula: $$F = G \frac{m_1 m_2}{r^2}$$ donde $G=6.67428 \cdot 10^{-11}$ [m3, kg-1, s-2].

Problema

Escriba una función que pregunte las masas de los planetas y su distancia, y entregue la fuerza de atracción entre ellos.


In [24]:
# constante de gravitacion universal
G = 6.67428e-11
m1 = float(raw_input('m1 [kg]: '))
m2 = float(raw_input('m2 [kg]: '))
r = float(raw_input('Distancia [m]: '))
F = G * m1 * m2 / (r ** 2)
print 'La fuerza de atraccion es', F, "[N]"


m1 [kg]: 180
m2 [kg]: 180
Distancia [m]: 2
La fuerza de atraccion es 5.4061668e-07 [N]

Uso de funciones

El cálculo de la fuerza de atracción gravitacional puede ser encapsulado en una función, para poder ser utilizado en otras oportunidades y modificar el código en un sólo lugar.


In [27]:
def cgu(masa1, masa2, radio):
    G = 6.67428e-11
    G * masa1 * masa2 / (radio ** 2)
    return 

m1 = float(raw_input('m1: '))
m2 = float(raw_input('m2: '))
r = float(raw_input('Distancia: '))
print 'La fuerza de atraccion es', cgu(m1, m2, r)

Funciones

Ejercicio 1 - Promedio

Escriba la función promedio(n1,n2,n3) que reciba las notas de los 3 certamenes del ramo y retorne el valor del promedio final.

promedio(100,100,100) # Debería regresar el valor 100
promedio(80, 66, 31) # Debería regresar el valor 59
promedio(0, 0, 0) # Debería regresar el valor 0

In [32]:
def promedio(n1, n2, n3):
    prom=(n1+n2+n3)/3.0
    return prom

print promedio(100,100,100) # Debería regresar 100
print promedio(80, 66, 31) # Debería regresar 59
print promedio(0, 0., 1.) # Debería regresar 0.333333
print promedio(0, 0, 0) # Debería regresar 0


100.0
59.0
0.333333333333
0.0

Funciones

Ejercicio 1 - Promedio

Escriba la función promedio(n1,n2,n3) que reciba las notas de los 3 certamenes del ramo y retorne el valor del promedio final.

promedio(100,100,100) # Debería regresar el valor 100
promedio(80, 66, 31) # Debería regresar el valor 59.0
promedio(0, 0, 0) # Debería regresar el valor 0

In [34]:
def promedio(n1, n2, n3):
    suma = n1 + n2 + n3
    prom = suma/3.
    return prom

print promedio(100,100,100) # Debería regresar 100
print promedio(80, 66, 31) # Debería regresar el valor 59
print promedio(0, 0, 1) # Debería regresar 0.33333333
print promedio(0, 0, 0) # Debería regresar 0


100.0
59.0
0.333333333333
0.0
  • Siempre hay que probar más casos de los otorgados.
  • Siempre tener cuidado con la mezcla de int y float

Funciones

Ejercicio 1 - Promedio

Escriba la función promedio(n1,n2,n3) que reciba las notas de los 3 certamenes del ramo y retorne el valor del promedio final.

promedio(100,100,100) # Debería regresar el valor 100
promedio(80, 66, 31) # Debería regresar el valor 59
promedio(0, 0, 0) # Debería regresar el valor 0

In [ ]:
def promedio(n1, n2, n3):
    return (n1 + n2 + n3)/3.0

print promedio(100,100,100) # Debería regresar 100
print promedio(80, 66, 31) # Debería regresar 59
print promedio(0, 0, 0) # Debería regresar 0

Conceptos

def nombre_de_mi_funcion(var_1, var_2, ..., var_n):
    # Definicion de parámetros
    # Inicializacion de variables
    # Calculo de expresiones y valores
    return val_1, val_2, ..., val_m
  • var_1, var_2, ..., var_n son los argumentos de la función.
  • No es necesario definir que tipo de dato se pasa a la función.
  • Para entregar al usuario información:
    • Imprimir valores con print
    • Regresar los valores

Funciones

Ejemplo


In [4]:
def que_hace(a,b):
    print a*b
    print a + b
    return a + b + a*b

A = que_hace(1.,2)
#print a


2.0
3.0

Funciones

Variables Globales vs Variables Locales

Cuando se ejecuta una función, se crea un "espacio protegido" en el cual se ejecutan las acciones de la función.

  • Las variables que existen antes de la ejecución de la función se llaman variables globales
  • Las variables que se pasan a la función o que se crean en el contexto de la función, se llaman variables locales (a la función).
  • Todo lo que no se regrese al final de la función se perderá.
  • Las variables locales desaparecerán luego de la ejecución de la función.
  • Los tipos básicos que se pasen a la función no se ven alterados por la función

Variables Globales vs Variables Locales

Ejemplo

¿Que pasa en el siguiente código?


In [43]:
def mi_funcion(a,b,c):
    print "a =", a, "; b =", b, "; c =", c
    a = b
    b = c
    c = True
    print "a =", a, "; b =", b, "; c =", c
    return a, b, c
    
x = 1.0
y = "hola"
z = 42

print "x =", x, "; y =", y, "; z =", z

X, Y, Z = mi_funcion(x,y, z)

print "x =", x, "; y =", y, "; z =", z
print "X =", X, "; Y =", Y, "; Z =", Z
#print "a=", a, "; b=", b, "; c=", c


x = 1.0 ; y = hola ; z = 42
a = 1.0 ; b = hola ; c = 42
a = hola ; b = 42 ; c = True
x = 1.0 ; y = hola ; z = 42
X = hola ; Y = 42 ; Z = True

Funciones

Errores comunes

  • Cuidado con utilizar enteros (int) cuando se necesitan reales (float).
  • Cuidado con la diferencia de variables globales y locales.
  • No utilicen dentro de la función un dato que no haya pasado en los argumentos.
  • Cuidado con el nombre de la función: que sea distinta a las variables en uso.
  • Cuidado con mezclar los tipos de datos.

Ruteo de funciones

  • El ruteo de funciones corresponde al seguimiento del valor de las variables a lo largo del programa.
  • Requiere solamente ser meticuloso y seguir el programa paso a paso.
  • Cada asignación, cálculo o cambio debe anotarse en una nueva línea.
  • Tener cuidado de la diferencia entre variables globales y variables locales.

Ejercicio 1 - Ruteo de funciones

Realice el ruteo del siguiente código

Ejercicio 2 - Ruteo de código

Realice el ruteo del siguiente código:

Funciones

Mini-Tarea

Realice un programa que calcule el índice de masa corporal:

  • Peso se ingresa en kilogramos.
  • Altura se ingresa en centímetros
  • Realice las conversiones necesarias
  • Calcule el IMC: $$ IMC = \frac{peso\_en\_kg}{altura\_en\_m^2}$$ (la fórmula es con altura en metros).

Funciones

Mini-Tarea

  • Pruebe con su función con 3 ejemplos:

    1. Un ejemplo preguntando al usuario los datos con raw_input
    2. Dos ejemplos con datos fijos
  • Realice el ruteo de su función con 1 de sus ejemplos.

Funciones

Mini-Tarea

  • Enviar tarea por correo.
  • No debería tomar más de 20 minutos.
  • Revisen contenidos anteriores, googleen, etc., pero NO copien y entiendan cada línea.