Funciones
Cita con formato IEEE:
E. Bahit, "Funciones", in
Python Aplicado, 4th ed., EBRC Publisher, 2022, pp.
48–61.
Cita con formato APA 7:
Bahit, E. (2022). Funciones. In
Python Aplicado (4th ed., pp. 48–61). EBRC Publisher.
Cita en línea:
(Bahit, 2022)
Una función es una forma de agrupar expresiones y algoritmos de forma tal que estos queden contenidos dentro de «una cápsula», que solo pueda ejecutarse cuando el programador la invoque. Una vez que una función es definida, puede ser invocada tantas veces como sea necesario.
Funciones incorporadas:
Una función puede ser provista por el lenguaje o definida por el
usuario. A las funciones provistas por el lenguaje se las denomina
«funciones incorporadas» y en inglés se conocen como «Built-in
functions».
Funciones definidas por el usuario
En Python la definición de funciones se realiza mediante la
instrucción def
más un nombre de función descriptivo -para
el cuál, aplican las mismas reglas que para el nombre de las variables-
seguido de paréntesis de apertura y cierre.
Como toda estructura de control en Python, la definición de la función finaliza con dos puntos (:) y el algoritmo que la compone, irá identado con 4 espacios en blanco:
def mi_funcion(): # aquí el algoritmo identado
Una función no es ejecutada hasta tanto no sea invocada. Para invocar una función, simplemente se la llama por su nombre:
def mi_funcion(): print("Hola Mundo") funcion()
Las funciones pueden retornar datos:
def funcion(): return "Hola Mundo"
Y el valor de retorno de una función puede almacenarse en una variable:
frase = funcion()
Imprimirse:
print(funcion())
O ignorarse:
funcion()
Sobre los parámetros
Un parámetro es un valor que la función espera recibir cuando sea llamada (invocada). Una función puede esperar uno o más parámetros (que son definidos entre los paréntesis y separados por una coma) o ninguno.
def mi_funcion(param1, param2): pass
La instrucción pass
se utiliza para completar una
estructura de control que no realiza ninguna acción.
Los parámetros que una función espera, serán utilizados por ésta, dentro de su algoritmo, a modo de variables de ámbito local. Es decir, que los parámetros serán variables locales que solo son accesibles dentro de la función:
def calcular_neto): iva = bruto * float(alicuota) / 100 neto = bruto + iva return neto
Si se quisiera acceder a esas variables locales fuera del ámbito de la función, se obtendría un error:
def calcular_neto): bruto * float(alicuota) / 100 neto = bruto + iva return netoprint(bruto)# Retornará el error: 'bruto' is not defined
Al llamar a una función, se le deben pasar sus argumentos en el mismo orden en el que los espera. Para evitar pasarlos en el mismo orden, pueden utilizarse claves como argumentos (definidos más abajo).
Parámetros por omisión
Es posible asignar valores por defecto a los parámetros de las funciones. Esto significa, que la función podrá ser llamada con menos argumentos de los que ha definido:
def calcular_neto): bruto * float(alicuota) / 100 neto = bruto + iva return neto calcular_neto(100)Retorna 121.0
PEP 8: Funciones
A la definición de una función la deben anteceder dos líneas en blanco.
Al asignar parámetros por omisión, no debe dejarse espacios en blanco
ni antes ni después del signo =
. Los parámetros por omisión
deben ser definidos a continuación de los parámetros obligatorios.
Claves como argumentos
Las claves como argumentos (keyword arguments) son una
característica de Python que no todos los lenguajes poseen. Python
permite llamar a una función pasándole los argumentos esperados como
pares de claves=valor
:
def funcion(opcional='valor por defecto', opcional_dos=15): pass funcion('valor obligatorio', opcional_dos=43)
Parámetros arbitrarios
Es posible que una función espere recibir un número arbitrario -desconocido- de argumentos. Estos argumentos, llegarán a la función en forma de tupla.
Para definir argumentos arbitrarios en una función, se antecede un
asterisco (*
) al nombre del parámetro:
def funcion(obligatorio, *arbitrarios): pass funcion('fijo', 1, 2, 3, 4, 5) funcion('fijo', 1, 2) funcion('fijo', 1, 2, 3, 4, 5, 6, 7) funcion('fijo')
Cuando una función espera recibir parámetros obligatorios y arbitrarios, los arbitrarios siempre deben suceder a los obligatorios.
Es posible también, obtener parámetros arbitrarios como pares de
clave=valor
. En estos casos, al nombre del parámetro deben
precederlo dos asteriscos (**
):
def funcion(obligatorio, **arbitrarios): pass funcion('fijo', a=1, b=2, c=3)
El recorrido de los parámetros arbitrarios es como el recorrido de cualquier tupla (para parámetros arbitrarios sin clave) o de cualquier diccionario (para los parámetros arbitrarios con clave):
def funcion(*arbitrarios): for argumento in arbitrarios: pass def funcion(**arbitrarios): for argumento in arbitrarios: valor = arbitrarios[argumento]
Desempaquetado de parámetros
Al invocar a una función se le pueden pasar los parámetros que espera dentro de una lista o de un diccionario (donde los nombres de las claves equivalen al nombre de los argumentos). A este procedimiento se lo conoce como desempaquetado de parámetros:
def funcion(uno, dos, tres): pass # DESEMPAQUETADO DE LISTAS parametros = [1, 2, 3] calcular(*parametros) # DESEMPAQUETADO DE DICCIONARIOS parametros = dict(uno=1, dos=2, tres=3) calcular(**parametros) parametros = {'uno': 1, 'dos': 2, 'tres': 3} calcular(**parametros)
Llamadas recursivas y de retorno
Una función puede llamar a otra función que retorne un valor. Esto se conoce como llamada de retorno:
def retornar(algo): return str(algo) def llamar(): algo = retornar()
La llamada interna a otra función puede almacenarse, retornarse o ignorarse.
def almacenar(): algo = retornar() def volver_a_retornar(): return retornar() def ignorar(): retornar()
Cuando la llamada que se hace es a la misma función, se conoce como llamada recursiva.
def get_nombre(): nombre = raw_input("Nombre: ") if not nombre: get_nombre()
Sobre la finalidad de las funciones
Una función puede tener cualquier tipo de algoritmo y cualquier cantidad de instrucciones. Sin embargo, una buena práctica indica que la finalidad de una función, debe ser realizar una única acción.
Conceptos avanzados sobre funciones
En esta sección se intentarán explicar cuatro conceptos sobre diferentes formas de definir e implementar una función. Estos conceptos no son estrictamente necesarios a la hora de programar, pero en Python suelen verse con frecuencia. Se exponen a título informativo.