Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Las funciones son el siguiente paso después de haber aprendido los conceptos básicos de
programación de Python. En su forma más sencilla, una función contiene código que
siempre devuelve un valor (o valores). En algunos casos, una función también tiene
entradas opcionales u obligatorias.
Al empezar a escribir código que duplica otras partes del programa, se convierte en una
oportunidad perfecta para extraer el código en una función. Aunque compartir código
común mediante funciones es útil, también se puede limitar el tamaño del código
extrayendo partes en funciones más pequeñas (y legibles).
Los programas que evitan la duplicación y evitan funciones de gran tamaño mediante
funciones más pequeñas son más legibles y fáciles de mantener. También son más fáciles
de depurar cuando las cosas no funcionan correctamente.
Hay varias reglas sobre las entradas de funciones que son fundamentales para aprovechar al
máximo todo lo que las funciones tienen que ofrecer.
Importante
Para crear una función, use la palabra clave def, seguida de un nombre, paréntesis y,
después, del cuerpo con el código de función:
PythonCopiar
def rocket_parts():
print("payload, propellant, structure")
PythonCopiar
>>> output = rocket_parts()
payload, propellant, structure
>>> output is None
True
PythonCopiar
>>> def rocket_parts():
... return "payload, propellant, structure"
...
>>> output = rocket_parts()
>>> output
'payload, propellant, structure'
Nota
Un ejemplo de una función integrada que requiere un argumento es any(). Esta función
toma un objeto iterable (por ejemplo, una lista) y devuelve True si algún elemento del
objeto iterable es True. De lo contrario, devuelve False.
PythonCopiar
>>> any([True, False, False])
True
>>> any([False, False, False])
False
Si llama a any() sin ningún argumento, se genera una excepción útil. El mensaje de error
explica que necesita al menos un argumento:
PythonCopiar
>>> any()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: any() takes exactly one argument (0 given)
PythonCopiar
>>> str()
''
>>> str(15)
'15'
Ahora que sabe cómo crear una función sin entradas, el paso siguiente es crear funciones
que requieran un argumento. El uso de argumentos hace que las funciones sean más
flexibles, ya que pueden hacer más y condicionalizar lo que hacen.
Exigencia de un argumento
Si va a pilotar un cohete, una función sin entradas obligatorias es como un equipo con un
botón que le indique la hora. Si presiona el botón, una voz computarizada le indicará la
hora. Pero una entrada necesaria puede ser un destino para calcular la distancia del viaje.
Las entradas obligatorias se denominan argumentos para la función.
PythonCopiar
def distance_from_earth(destination):
if destination == "Moon":
return "238,855"
else:
return "Unable to compute to that destination"
PythonCopiar
>>> distance_from_earth()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: distance_from_earth() missing 1 required positional argument:
'destination'
PythonCopiar
>>> distance_from_earth("Moon")
'238,855'
Dado que hay una condición catch-all, intente usar cualquier otra cadena como destino para
comprobar ese comportamiento:
PythonCopiar
>>> distance_from_earth("Saturn")
'Unable to compute to that destination'
Para usar varios argumentos, debe separarlos con una coma. Vamos a crear una función que
pueda calcular cuántos días se tardarán en llegar a un destino, dadas la distancia y una
velocidad constante:
PythonCopiar
def days_to_complete(distance, speed):
hours = distance/speed
return hours/24
Ahora use la distancia entre la Tierra y la Luna para calcular cuántos días tardaría en llegar
a la Luna con un límite de velocidad común de 120 kilómetros por hora:
PythonCopiar
>>> days_to_complete(238855, 75)
132.69722222222222
Funciones como argumentos
PythonCopiar
>>> total_days = days_to_complete(238855, 75)
>>> round(total_days)
133
Pero un patrón útil es pasar funciones a otras funciones en lugar de asignar el valor
devuelto:
PythonCopiar
>>> round(days_to_complete(238855, 75))
133
Sugerencia
Aunque pasar funciones directamente a otras funciones como entrada es útil, existe la
posibilidad de que se reduzca la legibilidad. Este patrón es especialmente problemático
cuando las funciones requieren muchos argumentos.
La misión Apolo 11 tardó unas 51 horas en llegar a la Luna. Vamos a crear una función que
devuelva la hora estimada de llegada usando el mismo valor que la misión Apolo 11 como
valor predeterminado:
PythonCopiar
from datetime import timedelta, datetime
def arrival_time(hours=51):
now = datetime.now()
arrival = now + timedelta(hours=hours)
return arrival.strftime("Arrival: %A %H:%M")
La función usa el módulo datetime para definir la hora actual. Usa timedelta para permitir
la operación de suma que da como resultado un objeto de hora nuevo. Después de calcular
ese resultado, devuelve la estimación arrival con formato de cadena. Intente llamarla sin
ningún argumento:
PythonCopiar
>>> arrival_time()
'Arrival: Saturday 16:42'
Aunque la función define un argumento de palabra clave, no permite pasar uno cuando se
llama a una función. En este caso, la variable hours tiene como valor predeterminado 51.
Para comprobar que la fecha actual es correcta, use 0como valor para hours:
PythonCopiar
>>> arrival_time(hours=0)
'Arrival: Thursday 13:42'
PythonCopiar
from datetime import timedelta, datetime
PythonCopiar
>>> arrival_time()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: arrival_time() missing 1 required positional argument: 'destination'
PythonCopiar
>>> arrival_time("Moon")
'Moon Arrival: Saturday 16:54'
También puede pasar más de dos valores, pero debe separarlos con una coma. Se tarda
aproximadamente 8 minutos (0,13 horas) en entrar en órbita, así que utilice eso como
argumento:
PythonCopiar
>>> arrival_time("Orbit", hours=0.13)
'Orbit Arrival: Thursday 14:11'
En Python, puede usar cualquier número de argumentos de palabra clave y argumentos sin
necesidad de declarar cada uno de ellos. Esta capacidad es útil cuando una función puede
obtener un número desconocido de entradas.
Argumentos de variable
Los argumentos en las funciones son necesarios. Pero cuando se usan argumentos de
variable, la función permite pasar cualquier número de argumentos (incluido 0). La sintaxis
para usar argumentos de variable es agregar un asterisco único como prefijo (*) antes del
nombre del argumento.
PythonCopiar
def variable_length(*args):
print(args)
Nota
PythonCopiar
>>> variable_length()
()
>>> variable_length("one", "two")
('one', 'two')
>>> variable_length(None)
(None,)
Como puede ver, no hay ninguna restricción en el número o tipo de argumentos que se
pasan.
Un cohete realiza varios pasos antes de un lanzamiento. En función de las tareas o retrasos,
estos pasos pueden tardar más de lo previsto. Vamos a crear una función de longitud
variable que pueda calcular cuántos minutos quedan hasta el inicio, dado el tiempo que va a
tardar cada paso:
PythonCopiar
def sequence_time(*args):
total_minutes = sum(args)
if total_minutes < 60:
return f"Total time to launch is {total_minutes} minutes"
else:
return f"Total time to launch is {total_minutes/60} hours"
PythonCopiar
>>> sequence_time(4, 14, 18)
'Total time to launch is 36 minutes'
>>> sequence_time(4, 14, 48)
'Total time to launch is 1.1 hours'
Nota
Para que una función acepte cualquier número de argumentos de palabra clave, debe usar
una sintaxis similar. En este caso, se requiere un asterisco doble:
PythonCopiar
def variable_length(**kwargs):
print(kwargs)
Pruebe la función de ejemplo, que imprime los nombres y valores pasados como kwargs:
PythonCopiar
>>> variable_length(tanks=1, day="Wednesday", pilots=3)
{'tanks': 1, 'day': 'Wednesday', 'pilots': 3}
Si ya conoce bien los diccionarios de Python, observará que los argumentos de palabra
clave de longitud variable se asignan como un diccionario. Para interactuar con las
variables y los valores, use las mismas operaciones que un diccionario.
Nota
En esta función, vamos a usar argumentos de palabra clave variable para notificar los
astronautas asignados a la misión. Dado que esta función permite cualquier número de
argumentos de palabra clave, se puede reutilizar independientemente del número de
astronautas asignados:
PythonCopiar
def crew_members(**kwargs):
print(f"{len(kwargs)} astronauts assigned for this mission:")
for title, name in kwargs.items():
print(f"{title}: {name}")
PythonCopiar
>>> crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin",
command_pilot="Michael Collins")
3 astronauts assigned for this mission:
captain: Neil Armstrong
pilot: Buzz Aldrin
command_pilot: Michael Collins
Dado que puede pasar cualquier combinación de argumentos de palabra clave, asegúrese de
evitar palabras clave repetidas. Las palabras clave repetidas producirán un error:
PythonCopiar
>>> crew_members(captain="Neil Armstrong", pilot="Buzz Aldrin", pilot="Michael
Collins")
File "<stdin>", line 1
SyntaxError: keyword argument repeated: pilot
Resumen
Completado100 XP
1 minuto