Python
Python
Observa la imagen:
def message():
print("Ingresa un valor: ")
Se ha movido la función al final del código. ¿Podrá Python encontrarla cuando la ejecución
llegue a la invocación?
salida
Puntos Clave
1. Una función es un bloque de código que realiza una tarea especifica cuando la función
es llamada (invocada). Las funciones son útiles para hacer que el código sea reutilizable,
que este mejor organizado y más legible. Las funciones contienen parámetros y pueden
regresar valores.
3. Las funciones propias se pueden definir utilizando la palabra reservada def y con la
siguiente sintaxis:
Se puede definir una función sin que haga uso de argumentos, por ejemplo:
También es posible definir funciones con argumentos, como la siguiente que contiene un
solo parámetro:
Funciones parametrizadas
El potencial completo de una función se revela cuando puede ser equipada con una interface que es
capaz de aceptar datos provenientes de la invocación. Dichos datos pueden modificar el comportamiento
de la función, haciéndola más flexible y adaptable a condiciones cambiantes.
Un parámetro es una variable, pero existen dos factores que hacen a un parámetro diferente:
Los parámetros solo existen dentro de las funciones en donde han sido definidos, y el único
lugar donde un parámetro puede ser definido es entre los paréntesis después del nombre de la
función, donde se encuentra la palabra reservada def .
La asignación de un valor a un parámetro de una función se hace en el momento en que la
función se manda llamar o se invoca, especificando el argumento correspondiente.
def function(parameter):
###
Recuerda que:
Enriquezcamos la función anterior agregándole un parámetro, se utilizará para mostrar al usuario el valor
de un número que la función pide.
Se tendrá que modificar la definición def de la función, así es como se ve ahora:
def message(number):
###
Esta definición especifica que nuestra función opera con un solo parámetro con el nombre de number .
Se puede utilizar como una variable normal, pero solo dentro de la función - no es visible en otro lugar.
def message(number):
print("Ingresa un número:", number)
Se ha hecho buen uso del parámetro. Nota: No se le ha asignado al parámetro algún valor. ¿Es correcto?
Si, lo es.
salida
def message(number):
print("Ingresa un número:", number)
message(1)
Ingresa un número: 1
salida
¿Puedes ver cómo funciona? El valor del argumento utilizado durante la invocación ( 1 ) ha
sido pasado a la función, dándole un valor inicial al parámetro con el nombre de number .
Existe una circunstancia importante que se debe mencionar.
def message(number):
print("Ingresa un número:", number)
number = 1234
message(1)
print(number)
Ingresa un número: 1
1234
Aquí está:
message("precio", 5)
message("número", "número")
salida
Ejecuta el código, modifícalo, agrega más parámetros y ve cómo esto afecta la salida.
introduction(surname="Skywalker", first_name="Luke")
salida
Inténtalo tu mismo.
Solo se tiene que colocar el nombre del parámetro seguido del signo de = y el valor por
default.
introduction("Jorge", "Pérez")
¿Y? No parece haber cambiado algo, pero cuando se invoca la función de una manera
inusual, como esta:
introduction("Enrique")
o así:
introduction(first_name="Guillermo")
salida
Pruébalo.
Puedes hacerlo con más parámetros, si te resulta útil. Ambos parámetros tendrán sus
valores por default, observa el siguiente código:
introduction()
salida
introduction(last_name="Rodríguez")
La salida es:
salida
Pruébalo.
print(None + 2)
salida
Nota: None es una palabra clave reservada.
Solo existen dos tipos de circunstancias en las que None se puede usar de manera segura:
value = None
if value is None:
print("Lo siento, no contienes ningún valor")
No olvides esto: si una función no devuelve un cierto valor utilizando una cláusula de
expresión return , se asume que devuelve implícitamente None .
Vamos a probarlo.
La primera es: ¿Se puede enviar una lista a una función como un argumento?
¡Por supuesto que se puede! Cualquier entidad reconocible por Python puede
desempeñar el papel de un argumento de función, aunque debes asegurarte de que la
función sea capaz de hacer uso de él.
Entonces, si pasas una lista a una función, la función tiene que manejarla como una lista.
def list_sum(lst):
s = 0
s += elem
return s
y se invoca así:
print(list_sum([5, 4, 3]))
Retorna 12 como resultado, pero habrá problemas si la invocas de esta manera riesgosa:
print(list_sum(5))
salida
Esto se debe al hecho de que el bucle for no puede iterar un solo valor entero.
¡Si, por supuesto! Cualquier entidad reconocible por Python puede ser un resultado de
función.
[4, 3, 2, 1, 0]
salida
Ahora puedes escribir funciones con y sin resultados.
Vamos a profundizar un poco más en los problemas relacionados con las variables en las
funciones. Esto es esencial para crear funciones efectivas y seguras.
def strange_list_fun(n):
strange_list = []
strange_list.insert(0, i)
return strange_list
print(strange_list_fun(6))
Tiempo Estimado
10-15 minutos
Nivel de Dificultad
Fácil
Objetivos
Familiarizar al estudiante con:
Nota: también hemos preparado un breve código de prueba, que puedes utilizar para
probar tu función.
El código utiliza dos listas: una con los datos de prueba y la otra con los resultados
esperados. El código te dirá si alguno de tus resultados no es válido.
def is_year_leap(year):
if year % 4 != 0:
return False
return True
return False
else:
return True
for i in range(len(test_data)):
yr = test_data[i]
print(yr,"->",end="")
result = is_year_leap(yr)
if result == test_results[i]:
print("OK")
else:
print("Fallido")
Tiempo Estimado
15-20 minutos
Nivel de Dificultad
Medio
Requisitos Previos
LABORATORIO 4.1.3.6
Objetivos
Familiarizar al estudiante con:
Escenario
Tu tarea es escribir y probar una función que toma dos argumentos (un año y un mes) y
devuelve el número de días del mes/año dado (mientras que solo febrero es sensible al
valor year , tu función debería ser universal).
La parte inicial de la función está lista. Ahora, haz que la función devuelva None si los
argumentos no tienen sentido.
Hemos preparado un código de prueba. Amplíalo para incluir más casos de prueba.
def is_year_leap(year):
if year % 4 != 0:
return False
return True
return False
else:
return True
if month in {1,3,5,7,8,10,12}:
return 31
elif month == 2:
if is_year_leap(year):
return 29
else:
return 28
return 30
else:
None
for i in range(len(test_years)):
yr = test_years[i]
mo = test_months[i]
if result == test_results[i]:
print("OK")
else:
print("Fallido")
Puntos Clave
1. Puedes emplear la palabra clave reservada return para decirle a una función que devuelva algún
valor. La instrucción return termina la función, por ejemplo:
return a * b
return
2. El resultado de una función se puede asignar fácilmente a una variable, por ejemplo:
def wishes():
return "¡Felíz Cumpleaños!"
w = wishes()
# Ejemplo 1
def wishes():
print("Mis deseos")
# Ejemplo 2
def wishes():
print("Mis deseos")
print(wishes())
# Felíz Cumpleaños
3. Puedes usar una lista como argumento de una función, por ejemplo:
def hi_everybody(my_list):
print("Hola,", name)
def create_list(n):
my_list = []
for i in range(n):
my_list.append(i)
return my_list
print(create_list(5))
Ejercicio 1
def hi():
return
print("¡Hola!")
hi()
Revisar
Ejercicio 2
def is_int(data):
if type(data) == int:
return True
return False
print(is_int(5))
print(is_int(5.0))
print(is_int("5"))
Revisar
Ejercicio 3
def even_num_lst(ran):
lst = []
if num % 2 == 0:
lst.append(num)
return lst
print(even_num_lst(11))
Revisar
Ejercicio 4
def list_updater(lst):
upd_list = []
elem **= 2
upd_list.append(elem)
return upd_list
foo = [1, 2, 3, 4, 5]
print(list_updater(foo))
salida
La respuesta es: una variable que existe fuera de una función tiene alcance dentro
del cuerpo de la función.
def my_function():
var = 2
print("¿Conozco a la variable?", var)
var = 1
my_function()
print(var)
El resultado ha cambiado también, el código arroja una salida con una ligera diferencia:
¿Conozco a la variable? 2
1
salida
Una variable que existe fuera de una función tiene un alcance dentro del cuerpo de
la función, excluyendo a aquellas que tienen el mismo nombre.
También significa que el alcance de una variable existente fuera de una función solo
se puede implementar dentro de una función cuando su valor es leído. El asignar un
valor hace que la función cree su propia variable.
global name
El utilizar la palabra reservada dentro de una función con el nombre o nombres de las
variables separados por comas, obliga a Python a abstenerse de crear una nueva variable
dentro de la función; se empleará la que se puede acceder desde el exterior.
salida
Esto debe de ser suficiente evidencia para mostrar lo que la palabra clave
reservada global puede hacer.
El código en el editor nos enseña algo. Como puedes observar, la función cambia el valor
de su parámetro. ¿Este cambio afecta el argumento?
Yo recibí 1
Ahora tengo 2
1
salida
La conclusión es obvia - al cambiar el valor del parámetro este no se propaga fuera de
la función (más específicamente, no cuando la variable es un valor escalar, como en el
ejemplo).
Esto también significa que una función recibe el valor del argumento, no el argumento
en sí. Esto es cierto para los valores escalares.
Vale la pena revisar cómo funciona esto con las listas (¿Recuerdas las peculiaridades de
asignar rebanadas de listas en lugar de asignar la lista entera?)
El siguiente ejemplo arrojará luz sobre el asunto:
def my_function(my_list_1):
print("Print #1:", my_list_1)
print("Print #2:", my_list_2)
my_list_1 = [0, 1]
print("Print #3:", my_list_1)
print("Print #4:", my_list_2)
my_list_2 = [2, 3]
my_function(my_list_2)
print("Print #5:", my_list_2)
salida
def my_function(my_list_1):
print("Print #1:", my_list_1)
print("Print #2:", my_list_2)
del my_list_1[0] # Presta atención a esta línea.
print("Print #3:", my_list_1)
print("Print #4:", my_list_2)
my_list_2 = [2, 3]
my_function(my_list_2)
print("Print #5:", my_list_2)
No se modifica el valor del parámetromy_list_1(ya se sabe que no afectará el
argumento), en lugar de ello se modificará la lista identificada por el.
salida
Intentémoslo:
Puntos Clave
1. Una variable que existe fuera de una función tiene alcance dentro del cuerpo de la función. (Ejemplo
1) al menos que la función defina una variable con el mismo nombre. (Ejemplo 2, y Ejemplo 3), por
ejemplo:
Ejemplo 1:
var = 2
def mult_by_var(x):
return x * var
print(mult_by_var(7)) # salida: 14
Ejemplo 2:
def mult(x):
var = 5
return x * var
print(mult(7)) # salida: 35
Ejemplo 3:
def mult(x):
var = 7
return x * var
var = 3
print(mult(7)) # salida: 49
2. Una variable que existe dentro de una función tiene un alcance solo dentro del cuerpo de la función
(Ejemplo 4), por ejemplo:
Ejemplo 4:
def adding(x):
var = 7
return x + var
print(adding(4)) # salida: 11
print(var) # NameError
3. Se puede emplear la palabra clave reservada global seguida por el nombre de una variable para que
el alcance de la variable sea global, por ejemplo:
var = 2
print(var) # salida: 2
def return_var():
global var
var = 5
return var
print(return_var()) # salida: 5
print(var) # salida: 5
Ejercicio 1
def message():
alt = 1
print("¡Hola, mundo!")
print(alt)
Revisar
Ejercicio 2
a = 1
def fun():
a = 2
print(a)
fun()
print(a)
Revisar
Ejercicio 3
a = 1
def fun():
global a
a = 2
print(a)
fun()
a = 3
print(a)
Revisar
2
3
Ejercicio 4
a = 1
def fun():
global a
a = 2
print(a)
a = 3
fun()
print(a)
La nueva función tendrá dos parámetros. Su nombre será bmi , pero si prefieres utilizar
otro nombre, adelante.
Codifiquemos la función.
print(bmi(52.5, 1.65))
19.283746556473833
salida
La función hace lo que deseamos, pero es un poco sencilla - asume que los valores de
ambos parámetros son significativos. Se debe comprobar que son confiables.
Vamos a comprobar ambos y regresar None si cualquiera de los dos es incorrecto.
Algunas funciones simples: calcular el IMC y convertir
unidades del Sistema Inglés al Sistema Métrico
Observa el código en el editor. Hay dos cosas a las cuales hay que prestar atención.
Primero, se asegura que los datos que sean ingresados sean correctos, de lo contrario la
salida será:
None
salida
Esto puede ser útil cuando se tienen largas líneas de código y se desea que sean más
legibles.
Sin embargo, hay algo que omitimos: las medias en sistema inglés. La función no es útil
para personas que utilicen libras, pies y pulgadas.
def lb_to_kg(lb):
return lb * 0.45359237
print(lb_to_kg(1))
0.45359237
salida
print(ft_and_inch_to_m(1, 1))
0.3302
salida
in es una palabra clave reservada de Python â no se puede usar como nombre.
print(ft_and_inch_to_m(6, 0))
Esta es la salida:
1.8288000000000002
salida
Es muy posible que en ocasiones se desee utilizar solo pies sin pulgadas. ¿Python nos
ayudará? Por supuesto que si.
print(ft_and_inch_to_m(6))
salida
def lb_to_kg(lb):
return lb * 0.45359237
if height < 1.0 or height > 2.5 or weight < 20 or weight > 200:
return None
La respuesta es:
27.565214082533313
salida
Algunas funciones simples: continuación
Ahora trabajaremos con triángulos. Comenzaremos con una función que verifique si tres
lados de ciertas longitudes pueden formar un triángulo.
En la escuela aprendimos que la suma arbitraria de dos lados tiene que ser mayor que la
longitud del tercer lado.
No será algo difícil. La función tendrá tres parámetros - uno para cada lado.
Regresará True si todos los lados pueden formar un triángulo, y False de lo contrario. En
este caso, is_a_triangle es un buen nombre para dicha función.
False
salida
return False
return True
print(is_a_triangle(1, 1, 1))
print(is_a_triangle(1, 1, 3))
print(is_a_triangle(1, 1, 1))
print(is_a_triangle(1, 1, 3))
Se ha negado la condición (se invirtieron los operadores relacionales y se reemplazaron
los or s con and s, obteniendo una expresión universal para probar triángulos).