Cómo definir funciones en Python 3

Introducción

A function is a block of instructions that performs an action and, once defined, can be reused. Functions make code more modular, allowing you to use the same code over and over again.

Python tiene una serie de funciones integradas con las que es posible que estés familiarizado, incluyendo:

  • print() que imprimirá un objeto en la terminal
  • int() que convertirá un tipo de dato cadena o número a un tipo de dato entero
  • len() que devuelve la longitud de un objeto

Los nombres de las funciones incluyen paréntesis y pueden incluir parámetros.

En este tutorial, repasaremos cómo definir tus propias funciones para usar en tus proyectos de codificación.

Requisitos previos

Deberías tener Python 3 instalado y un entorno de programación configurado en tu computadora o servidor. Si no tienes configurado un entorno de programación, puedes consultar las guías de instalación y configuración para un entorno de programación local o para un entorno de programación en tu servidor adecuado para tu sistema operativo (Ubuntu, CentOS, Debian, etc.).

Definición de una función

Comencemos convirtiendo el clásico programa “¡Hola, mundo!” en una función.

Crearemos un nuevo archivo de texto en nuestro editor de texto preferido y llamaremos al programa hello.py. Luego, definiremos la función.

A function is defined by using the def keyword, followed by a name of your choosing, followed by a set of parentheses which hold any parameters the function will take (they can be empty), and ending with a colon.

Información: Para seguir el código de ejemplo en este tutorial, abre una terminal interactiva de Python en tu sistema local ejecutando el comando python3. Luego puedes copiar, pegar o editar los ejemplos agregándolos después del indicador >>>.

En este caso, definiremos una función llamada hello():

hello.py
def hello():

Esto establece la declaración inicial para crear una función.

A partir de aquí, agregaremos una segunda línea con una sangría de 4 espacios para proporcionar las instrucciones sobre lo que hace la función. En este caso, estaremos imprimiendo ¡Hola, mundo! en la consola:

hello.py
def hello():
    print("Hello, World!")

Nuestra función ahora está completamente definida, pero si ejecutamos el programa en este punto, no sucederá nada porque no llamamos a la función.

Entonces, fuera de nuestro bloque de función definido, llamemos a la función con hello():

hello.py
def hello():
    print("Hello, World!")

hello()

Ahora, ejecutemos el programa:

  1. python hello.py

Deberías recibir la siguiente salida:

Output
Hello, World!

Las funciones pueden ser más complicadas que la función hello() que definimos anteriormente. Por ejemplo, podemos usar for bucles, declaraciones condicionales y más dentro de nuestro bloque de función.

Por ejemplo, la función definida a continuación utiliza una declaración condicional para verificar si la entrada para la variable name contiene una vocal, luego usa un for bucle para iterar sobre las letras en la cadena name.

names.py
# Definir función nombres()
def names():
    # Configurar variable de nombre con entrada
    name = str(input('Enter your name: '))
    # Comprobar si el nombre tiene una vocal
    if set('aeiou').intersection(name.lower()):
        print('Your name contains a vowel.')
    else:
        print('Your name does not contain a vowel.')

    # Iterar sobre nombre
    for letter in name:
        print(letter)

# Llamar a la función
names()

La función names() que definimos anteriormente establece una declaración condicional y un for bucle, mostrando cómo se puede organizar el código dentro de una definición de función. Sin embargo, dependiendo de lo que pretendamos con nuestro programa y cómo queremos configurar nuestro código, es posible que queramos definir la declaración condicional y el for bucle como dos funciones separadas.

Definir funciones dentro de un programa hace que nuestro código sea modular y reutilizable para que podamos llamar a las mismas funciones sin tener que volver a escribirlas.

Trabajando con Parámetros

Hasta ahora hemos visto funciones con paréntesis vacíos que no toman argumentos, pero podemos definir parámetros en las definiciones de funciones dentro de sus paréntesis.

A parameter is a named entity in a function definition, specifying an argument that the function can accept.

Vamos a crear un pequeño programa que tome parámetros x, y y z. Crearemos una función que sume los parámetros juntos en diferentes configuraciones. Las sumas de estos serán impresas por la función. Luego llamaremos a la función y pasaremos números a la función.

add_numbers.py
def add_numbers(x, y, z):
    a = x + y
    b = x + z
    c = y + z
    print(a, b, c)

add_numbers(1, 2, 3)

Se pasó el número 1 para el parámetro x, 2 para el parámetro y, y 3 para el parámetro z. Estos valores corresponden con cada parámetro en el orden en que son dados.

El programa esencialmente está realizando la siguiente operación matemática basada en los valores que pasamos a los parámetros:

a = 1 + 2
b = 1 + 3
c = 2 + 3

La función también imprime a, b y c, y basado en la matemática anterior esperaríamos que a sea igual a 3, b sea 4, y c sea 5. Vamos a ejecutar el programa:

  1. python add_numbers.py
Output
3 4 5

Cuando pasamos 1, 2 y 3 como parámetros a la función add_numbers(), recibimos la salida esperada.

Los parámetros son argumentos que típicamente se definen como variables dentro de las definiciones de funciones. Se les puede asignar valores cuando se ejecuta el método, pasando los argumentos a la función.

Argumentos de Palabra Clave

Además de llamar a los parámetros en orden, puedes usar argumentos de palabra clave en una llamada a función, donde el llamador identifica los argumentos por el nombre del parámetro.

Cuando se utilizan argumentos de palabra clave, se pueden usar parámetros fuera de orden porque el intérprete de Python utilizará las palabras clave proporcionadas para hacer coincidir los valores con los parámetros.

Creemos una función que nos muestre información de perfil para un usuario. Pasaremos parámetros en forma de nombre_de_usuario (pensado como una cadena) y seguidores (pensado como un entero).

profile.py
# Definir función con parámetros
def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

Dentro de la declaración de la definición de función, nombre_de_usuario y seguidores están contenidos entre paréntesis de la función info_perfil(). El bloque de la función imprime información sobre el usuario como cadenas, haciendo uso de los dos parámetros.

Ahora, podemos llamar a la función y asignarle parámetros:

profile.py
def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

# Llamar a la función con parámetros asignados como arriba
profile_info("sammyshark", 945)

# Llamar a la función con argumentos de palabra clave
profile_info(username="AlexAnglerfish", followers=342)

En la primera llamada a la función, hemos llenado la información con un nombre de usuario de sammyshark y seguidores siendo 945, en la segunda llamada a la función utilizamos argumentos de palabras clave, asignando valores a las variables de argumento.

Ejecutemos el programa:

  1. python profile.py
Output
Username: sammyshark Followers: 945 Username: AlexAnglerfish Followers: 342

La salida nos muestra los nombres de usuario y números de seguidores para ambos usuarios.

Esto también nos permite modificar el orden de los parámetros, como en este ejemplo del mismo programa con una llamada diferente:

profile.py
def profile_info(username, followers):
    print("Username: " + username)
    print("Followers: " + str(followers))

# Cambiar orden de parámetros
profile_info(followers=820, username="cameron-catfish")

Cuando ejecutamos el programa nuevamente con el comando python profile.py, recibiremos la siguiente salida:

Output
Username: cameron-catfish Followers: 820

Porque la definición de la función mantiene el mismo orden de declaraciones de print(), si usamos argumentos de palabras clave, no importa en qué orden los pasemos a la llamada de la función.

Valores de Argumentos Predeterminados

También podemos proporcionar valores predeterminados para uno o ambos de los parámetros. Creemos un valor predeterminado para el parámetro followers con un valor de 1:

profile.py
def profile_info(username, followers=1):
    print("Username: " + username)
    print("Followers: " + str(followers))

Ahora, podemos ejecutar la función con solo la función de nombre de usuario asignada, y el número de seguidores automáticamente se establecerá en 1 por defecto. También aún podemos cambiar el número de seguidores si lo deseamos.

profile.py
def profile_info(username, followers=1):
    print("Username: " + username)
    print("Followers: " + str(followers))

profile_info(username="JOctopus")
profile_info(username="sammyshark", followers=945)

Cuando ejecutamos el programa con el comando python profile.py, recibiremos la siguiente salida:

Output
Username: JOctopus Followers: 1 Username: sammyshark Followers: 945

Proporcionar parámetros predeterminados con valores nos permite omitir definir valores para cada argumento que ya tenga un valor predeterminado.

Devolver un valor

Puedes pasar un valor de parámetro a una función, y una función también puede producir un valor.

A function can produce a value with the return statement, which will exit a function and optionally pass an expression back to the caller. If you use a return statement with no arguments, the function will return None.

Hasta ahora, hemos utilizado la declaración print() en lugar de la declaración return en nuestras funciones. Creemos un programa que en lugar de imprimir devolverá una variable.

En un nuevo archivo de texto llamado square.py, crearemos un programa que elevará al cuadrado el parámetro x y devolverá la variable y. Emitimos una llamada para imprimir la variable resultado, que se forma ejecutando la función square() con 3 pasado como argumento.

square.py
def square(x):
    y = x ** 2
    return y

result = square(3)
print(result)

Podemos ejecutar el programa y recibir la salida:

  1. python square.py
Output
9

El entero 9 se devuelve como salida, que es lo que esperaríamos al pedirle a Python que encuentre el cuadrado de 3.

Para entender mejor cómo funciona la declaración return, podemos comentar la declaración return en el programa:

square.py
def square(x):
    y = x ** 2
    # return y

result = square(3)
print(result)

Ahora, volvamos a ejecutar el programa:

  1. python square.py
Output
None

Sin usar la declaración return aquí, el programa no puede devolver un valor, por lo que el valor por defecto es None.

Como otro ejemplo, en el programa add_numbers.py arriba, podríamos intercambiar la instrucción print() por una instrucción return.

add_numbers.py
def add_numbers(x, y, z):
    a = x + y
    b = x + z
    c = y + z
    return a, b, c

sums = add_numbers(1, 2, 3)
print(sums)

Fuera de la función, establecemos la variable sums igual al resultado de la función tomando 1, 2 y 3 como hicimos anteriormente. Luego llamamos a una impresión de la variable sums.

Ejecutemos el programa nuevamente ahora que tiene la instrucción return:

  1. python add_numbers.py
Output
(3, 4, 5)

Recibimos los mismos números 3, 4 y 5 como salida que recibimos anteriormente usando la instrucción print() en la función. Esta vez se entrega como una tupla porque la lista de expresiones de la instrucción return tiene al menos una coma.

Las funciones salen inmediatamente cuando alcanzan una instrucción return, independientemente de si están devolviendo un valor.

return_loop.py
def loop_five():
    for x in range(0, 25):
        print(x)
        if x == 5:
            # Detener la función en x == 5
            return
    print("This line will not execute.")

loop_five()

Usar la instrucción return dentro del bucle for termina la función, por lo que la línea que está fuera del bucle no se ejecutará. Si, en cambio, hubiéramos usado una instrucción break, solo el bucle habría salido en ese momento, y se ejecutaría la última línea de print().

La instrucción return sale de una función y puede devolver un valor cuando se emite con un parámetro.

Usando main() como una Función

Aunque en Python puedes llamar a la función al final de tu programa y se ejecutará (como hemos hecho en los ejemplos anteriores), muchos lenguajes de programación (como C++ y Java) requieren una función main para ejecutarse. Incluir una función main(), aunque no sea obligatorio, puede estructurar nuestros programas en Python de una manera lógica que coloque los componentes más importantes del programa en una función. También puede hacer que nuestros programas sean más fáciles de leer para programadores que no son de Python.

Empezaremos agregando una función main() al programa hello.py anterior. Mantendremos nuestra función hello() y luego definiremos una función main():

hello.py
def hello():
    print("Hello, World!")

def main():

Dentro de la función main(), incluyamos una instrucción print() para avisarnos que estamos en la función main(). Además, llamemos a la función hello() dentro de la función main():

hello.py
def hello():
    print("Hello, World!")


def main():
    print("This is the main function")
    hello()

Finalmente, en el fondo del programa llamaremos a la función main():

hello.py
def hello():
    print("Hello, World!")

def main():
    print("This is the main function.")
    hello()

main()

En este punto, podemos ejecutar nuestro programa:

  1. python hello.py

Recibiremos la siguiente salida:

Output
This is the main function. Hello, World!

Porque llamamos a la función hello() dentro de main() y luego solo llamamos a main() para ejecutar, el texto Hello, World! se imprime solo una vez, después de la cadena que nos indicó que estábamos en la función principal.

A continuación, vamos a trabajar con múltiples funciones, por lo que vale la pena revisar el ámbito de las variables globales y locales. Si defines una variable dentro de un bloque de función, solo podrás usar esa variable dentro de esa función. Si deseas usar variables entre funciones, puede ser mejor declarar una variable global.

En Python, '__main__' es el nombre del ámbito donde se ejecutará el código de nivel superior. Cuando se ejecuta un programa desde la entrada estándar, un script o desde un indicador interactivo, su __name__ se establece igual a '__main__'.

Debido a esto, hay una convención para usar la siguiente construcción:

if __name__ == '__main__':
    # Código para ejecutar cuando este es el programa principal aquí

Esto permite que los archivos de programa se utilicen ya sea:

  • como el programa principal y ejecutar lo que sigue a la declaración if
  • como un módulo y no ejecutar lo que sigue a la declaración if.

Cualquier código que no esté contenido dentro de esta declaración se ejecutará al ejecutar. Si estás utilizando tu archivo de programa como un módulo, el código que no está en esta declaración también se ejecutará al importar mientras se ejecuta el archivo secundario.

Vamos a ampliar nuestro programa names.py anterior y crear un nuevo archivo llamado more_names.py. En este programa declararemos una variable global y modificaremos nuestra función original names() para que las instrucciones estén en dos funciones discretas.

La primera función, has_vowel(), verificará si la cadena name contiene una vocal.

La segunda función, print_letters(), imprimirá cada letra de la cadena name.

more_names.py
# Declarar variable global name para usar en todas las funciones
name = str(input('Enter your name: '))


# Definir función para verificar si name contiene una vocal
def has_vowel():
    if set('aeiou').intersection(name.lower()):
        print('Your name contains a vowel.')
    else:
        print('Your name does not contain a vowel.')


# Iterar sobre letras en la cadena name
def print_letters():
    for letter in name:
        print(letter)

Con esta configuración, definamos la función main() que contendrá una llamada tanto a las funciones has_vowel() como a print_letters().

more_names.py
# Declarar variable global name para usar en todas las funciones
name = str(input('Enter your name: '))


# Definir función para verificar si name contiene una vocal
def has_vowel():
    if set('aeiou').intersection(name.lower()):
        print('Your name contains a vowel.')
    else:
        print('Your name does not contain a vowel.')


# Iterar sobre letras en la cadena name
def print_letters():
    for letter in name:
        print(letter)


# Definir método principal que llama a otras funciones
def main():
    has_vowel()
    print_letters()

Finalmente, agregaremos la construcción if __name__ == '__main__': al final del archivo. Para nuestros propósitos, ya que hemos puesto todas las funciones que nos gustaría hacer en la función main(), llamaremos a la función main() después de esta declaración if.

more_names.py
# Declarar variable global name para usar en todas las funciones
name = str(input('Enter your name: '))


# Definir función para verificar si el nombre contiene una vocal
def has_vowel():
    if set('aeiou').intersection(name.lower()):
        print('Your name contains a vowel.')
    else:
        print('Your name does not contain a vowel.')


# Iterar sobre letras en la cadena de nombre
def print_letters():
    for letter in name:
        print(letter)


# Definir método principal que llama a otras funciones
def main():
    has_vowel()
    print_letters()


# Ejecutar función main()
if __name__ == '__main__':
    main()

Ahora podemos ejecutar el programa:

  1. python more_names.py

El programa mostrará el mismo resultado que el programa names.py, pero aquí el código está más organizado y puede ser utilizado de manera modular sin modificación.

Si no querías declarar una función main(), alternativamente podrías haber terminado el programa de esta manera:

more_names.py
...
if __name__ == '__main__':
    has_vowel()
    print_letters()

Usar main() como una función y la declaración if __name__ == '__main__': puede organizar tu código de una manera lógica, haciéndolo más legible y modular.

Conclusión

Las funciones son bloques de código de instrucciones que realizan acciones dentro de un programa, ayudando a que nuestro código sea reutilizable y modular.

Para obtener más información sobre cómo hacer que tu código sea más modular, puedes leer nuestra guía sobre Cómo Escribir Módulos en Python 3.

Source:
https://www.digitalocean.com/community/tutorials/how-to-define-functions-in-python-3