Python 3 - Funciones

Una función es un bloque de código organizado y reutilizable que se utiliza para realizar una única acción relacionada. Las funciones proporcionan una mejor modularidad para su aplicación y un alto grado de reutilización de código.

Como ya sabe, Python le ofrece muchas funciones integradas como print (), etc. pero también puede crear sus propias funciones. Estas funciones se denominan funciones definidas por el usuario.

Definición de una función

Puede definir funciones para proporcionar la funcionalidad requerida. Aquí hay reglas simples para definir una función en Python.

  • Los bloques de funciones comienzan con la palabra clave def seguido del nombre de la función y paréntesis (()).

  • Cualquier parámetro o argumento de entrada debe colocarse entre estos paréntesis. También puede definir parámetros dentro de estos paréntesis.

  • La primera declaración de una función puede ser una declaración opcional - la cadena de documentación de la función o cadena de documentación .

  • El bloque de código dentro de cada función comienza con dos puntos (:) y está sangrado.

  • La declaración return [expresión] sale de una función y, opcionalmente, devuelve una expresión al llamador. Una declaración return sin argumentos es lo mismo que return None.

Sintaxis

def functionname( parameters ):
   "function_docstring"
   function_suite
   return [expression]

Por defecto, los parámetros tienen un comportamiento posicional y es necesario informarlos en el mismo orden en que se definieron.

Ejemplo

La siguiente función toma una cadena como parámetro de entrada y la imprime en la pantalla estándar.

def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

Llamar a una función

La definición de una función le da un nombre, especifica los parámetros que se incluirán en la función y estructura los bloques de código.

Una vez finalizada la estructura básica de una función, puede ejecutarla llamándola desde otra función o directamente desde el indicador de Python. A continuación se muestra un ejemplo para llamar alprintme() función -

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme("This is first call to the user defined function!")
printme("Again second call to the same function")

Cuando se ejecuta el código anterior, produce el siguiente resultado:

This is first call to the user defined function!
Again second call to the same function

Pasar por referencia vs valor

Todos los parámetros (argumentos) en el lenguaje Python se pasan por referencia. Significa que si cambia a qué se refiere un parámetro dentro de una función, el cambio también se refleja en la función que llama. Por ejemplo

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   print ("Values inside the function before change: ", mylist)
   
   mylist[2]=50
   print ("Values inside the function after change: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

Aquí, mantenemos la referencia del objeto pasado y agregamos valores en el mismo objeto. Por lo tanto, esto produciría el siguiente resultado:

Values inside the function before change:  [10, 20, 30]
Values inside the function after change:  [10, 20, 50]
Values outside the function:  [10, 20, 50]

Hay un ejemplo más en el que el argumento se pasa por referencia y la referencia se sobrescribe dentro de la función llamada.

#!/usr/bin/python3

# Function definition is here
def changeme( mylist ):
   "This changes a passed list into this function"
   mylist = [1,2,3,4] # This would assi new reference in mylist
   print ("Values inside the function: ", mylist)
   return

# Now you can call changeme function
mylist = [10,20,30]
changeme( mylist )
print ("Values outside the function: ", mylist)

El parámetro mylistes local a la función changeme. Cambiar mylist dentro de la función no afecta mylist. La función no logra nada y finalmente esto produciría el siguiente resultado:

Values inside the function:  [1, 2, 3, 4]
Values outside the function:  [10, 20, 30]

Argumentos de función

Puede llamar a una función utilizando los siguientes tipos de argumentos formales:

  • Argumentos requeridos
  • Argumentos de palabras clave
  • Argumentos predeterminados
  • Argumentos de longitud variable

Argumentos requeridos

Los argumentos requeridos son los argumentos pasados ​​a una función en el orden posicional correcto. Aquí, el número de argumentos en la llamada a la función debe coincidir exactamente con la definición de la función.

Para llamar a la función printme(), definitivamente necesita pasar un argumento, de lo contrario, da un error de sintaxis de la siguiente manera:

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme()

Cuando se ejecuta el código anterior, produce el siguiente resultado:

Traceback (most recent call last):
   File "test.py", line 11, in <module>
      printme();
TypeError: printme() takes exactly 1 argument (0 given)

Argumentos de palabras clave

Los argumentos de palabras clave están relacionados con las llamadas a funciones. Cuando usa argumentos de palabras clave en una llamada a función, el llamador identifica los argumentos por el nombre del parámetro.

Esto le permite omitir argumentos o colocarlos fuera de orden porque el intérprete de Python puede usar las palabras clave proporcionadas para hacer coincidir los valores con los parámetros. También puede realizar llamadas de palabras clave alprintme() funcionan de las siguientes formas:

#!/usr/bin/python3

# Function definition is here
def printme( str ):
   "This prints a passed string into this function"
   print (str)
   return

# Now you can call printme function
printme( str = "My string")

Cuando se ejecuta el código anterior, produce el siguiente resultado:

My string

El siguiente ejemplo ofrece una imagen más clara. Tenga en cuenta que el orden de los parámetros no importa.

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )

Cuando se ejecuta el código anterior, produce el siguiente resultado:

Name:  miki
Age  50

Argumentos predeterminados

Un argumento predeterminado es un argumento que asume un valor predeterminado si no se proporciona un valor en la llamada a la función para ese argumento. El siguiente ejemplo da una idea sobre los argumentos predeterminados, imprime la edad predeterminada si no se pasa:

#!/usr/bin/python3

# Function definition is here
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print ("Name: ", name)
   print ("Age ", age)
   return

# Now you can call printinfo function
printinfo( age = 50, name = "miki" )
printinfo( name = "miki" )

Cuando se ejecuta el código anterior, produce el siguiente resultado:

Name:  miki
Age  50
Name:  miki
Age  35

Argumentos de longitud variable

Es posible que deba procesar una función para más argumentos de los que especificó al definir la función. Estos argumentos se denominan argumentos de longitud variable y no se nombran en la definición de la función, a diferencia de los argumentos obligatorios y predeterminados.

La sintaxis para una función con argumentos de variables que no son palabras clave se proporciona a continuación:

def functionname([formal_args,] *var_args_tuple ):
   "function_docstring"
   function_suite
   return [expression]

Se coloca un asterisco (*) antes del nombre de la variable que contiene los valores de todos los argumentos de variables que no son palabras clave. Esta tupla permanece vacía si no se especifican argumentos adicionales durante la llamada a la función. A continuación se muestra un ejemplo simple:

#!/usr/bin/python3

# Function definition is here
def printinfo( arg1, *vartuple ):
   "This prints a variable passed arguments"
   print ("Output is: ")
   print (arg1)
   
   for var in vartuple:
      print (var)
   return

# Now you can call printinfo function
printinfo( 10 )
printinfo( 70, 60, 50 )

Cuando se ejecuta el código anterior, produce el siguiente resultado:

Output is:
10
Output is:
70
60
50

Las funciones anónimas

Estas funciones se denominan anónimas porque no se declaran de la manera estándar mediante el uso de defpalabra clave. Puedes usar ellambda palabra clave para crear pequeñas funciones anónimas.

  • Las formas lambda pueden tomar cualquier número de argumentos, pero devuelven solo un valor en forma de expresión. No pueden contener comandos ni expresiones múltiples.

  • Una función anónima no puede ser una llamada directa a imprimir porque lambda requiere una expresión.

  • Las funciones de Lambda tienen su propio espacio de nombres local y no pueden acceder a otras variables que no sean las de su lista de parámetros y las del espacio de nombres global.

  • Aunque parece que las lambdas son una versión de una línea de una función, no son equivalentes a las declaraciones en línea en C o C ++, cuyo propósito es apilar la asignación pasando la función durante la invocación por razones de rendimiento.

Sintaxis

La sintaxis de lambda funciones contiene solo una declaración única, que es la siguiente:

lambda [arg1 [,arg2,.....argn]]:expression

A continuación se muestra un ejemplo para mostrar cómo lambda forma de funcionamiento funciona -

#!/usr/bin/python3

# Function definition is here
sum = lambda arg1, arg2: arg1 + arg2

# Now you can call sum as a function
print ("Value of total : ", sum( 10, 20 ))
print ("Value of total : ", sum( 20, 20 ))

Cuando se ejecuta el código anterior, produce el siguiente resultado:

Value of total :  30
Value of total :  40

La declaración de devolución

La declaración return [expresión] sale de una función y, opcionalmente, devuelve una expresión al llamador. Una declaración return sin argumentos es lo mismo que return None.

Todos los ejemplos que se dan a continuación no devuelven ningún valor. Puede devolver un valor de una función de la siguiente manera:

#!/usr/bin/python3

# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2
   print ("Inside the function : ", total)
   return total

# Now you can call sum function
total = sum( 10, 20 )
print ("Outside the function : ", total )

Cuando se ejecuta el código anterior, produce el siguiente resultado:

Inside the function :  30
Outside the function :  30

Alcance de las variables

Es posible que no se pueda acceder a todas las variables de un programa en todas las ubicaciones de ese programa. Esto depende de dónde haya declarado una variable.

El alcance de una variable determina la parte del programa donde puede acceder a un identificador particular. Hay dos ámbitos básicos de variables en Python:

  • Variables globales
  • Variables locales

Variables globales vs locales

Las variables que se definen dentro de un cuerpo de función tienen un alcance local y las definidas fuera tienen un alcance global.

Esto significa que solo se puede acceder a las variables locales dentro de la función en la que están declaradas, mientras que todas las funciones pueden acceder a las variables globales en todo el cuerpo del programa. Cuando llamas a una función, las variables declaradas dentro de ella entran en el ámbito. A continuación se muestra un ejemplo simple:

#!/usr/bin/python3

total = 0   # This is global variable.
# Function definition is here
def sum( arg1, arg2 ):
   # Add both the parameters and return them."
   total = arg1 + arg2; # Here total is local variable.
   print ("Inside the function local total : ", total)
   return total

# Now you can call sum function
sum( 10, 20 )
print ("Outside the function global total : ", total )

Cuando se ejecuta el código anterior, produce el siguiente resultado:

Inside the function local total :  30
Outside the function global total :  0