Funciones de Python3

Una función es un bloque de código organizado, reutilizable, que se utiliza para implementar una función única o relacionada.

Las funciones mejoran la modularidad de la aplicación y la tasa de reutilización del código. Ya sabes que Python proporciona muchas funciones integradas, como print(). Pero también puedes crear tus propias funciones, lo que se llama funciones definidas por el usuario.


Definir una función

Puedes definir una función con la funcionalidad que desees. Estas son las reglas simples:

  • El bloque de código de la función comienza con ladefpalabra clave def, seguida del nombre del identificador de la función y paréntesis.()。
  • Cualquier parámetro entrante y argumento debe colocarse entre paréntesis. Los paréntesis se pueden usar para definir parámetros.
  • La primera línea de declaración de la función puede usar opcionalmente una cadena de documentación, para almacenar la descripción de la función.
  • El contenido de la función comienza con dos puntos:y sangría.
  • return [expresión]Finaliza la función y, opcionalmente, devuelve un valor a la persona que llama. return sin expresión equivale a devolver None.


Sintaxis

Python usa la palabra clave def para definir funciones. El formato general es el siguiente:

def 函数名(参数列表):
    函数体

Por defecto, los valores de los parámetros y los nombres de los parámetros coinciden en el orden definido en la declaración de la función.

Ejemplo

Usemos una función para imprimir "Hello World!":

#!/usr/bin/python3

def hello() :
    print("Hello World!")

hello()

Una aplicación más compleja: la función incluye variables de parámetros:

Ejemplo (Python 3.0+)

Compara dos números y devuelve el mayor:

#!/usr/bin/python3 def max(a, b): if a > b: return a else: return b a = 4 b = 5 print(max(a, b))

El resultado del ejemplo anterior:

5

Ejemplo (Python 3.0+)

Función para calcular el área:

#!/usr/bin/python3 # Función para calcular el área def area(width, height): return width * height def print_welcome(name): print("Welcome", name) print_welcome("Ejemplo") w = 4 h = 5 print("width =", w, " height =", h, " area =", area(w, h))

El resultado del ejemplo anterior:

Welcome Ejemplo
width = 4  height = 5  area = 20

Llamada a la función

Definir una función: darle un nombre a la función, especificar los parámetros que contiene y la estructura del bloque de código.

Una vez completada la estructura básica de esta función, puedes llamarla y ejecutarla a través de otra función, o directamente desde el símbolo del sistema de Python.

El siguiente ejemplo llama a laprintme()función:

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Definir función def printme( str ): # Imprimir cualquier cadena pasada print (str) return # Llamar a la función printme("¡Voy a llamar a la función definida por el usuario!") printme("Llamar nuevamente a la misma función")

El resultado del ejemplo anterior:

¡Quiero llamar a una función definida por el usuario!
Llamar a la misma función de nuevo

Paso de parámetros

En Python, los tipos pertenecen a los objetos, y los objetos se distinguen por diferentes tipos; las variables no tienen tipo:

a=[1,2,3]

a="Ejemplo"

En el código anterior,[1,2,3]es de tipo List,"Ejemplo"es de tipo String, y la variable a no tiene tipo; es solo una referencia a un objeto (un puntero), que puede apuntar a un objeto de tipo List o a un objeto de tipo String.

Objetos mutables e inmutables

En Python, strings, tuples y numbers son objetos inmutables, mientras que list, dict, etc. son objetos modificables.

  • Tipos inmutables:Asignación de variablea=5y luego reasignara=10Aquí en realidad se genera un nuevo objeto int con valor 10, y luego a apunta a él, mientras que 5 se descarta. No es que se cambie el valor de a, equivale a que se haya generado una nueva a.

  • Tipos mutables:Asignación de variablela=[1,2,3,4]y luego reasignarla[2]=5Aquí se cambia el valor del tercer elemento de la lista la; la en sí no se modifica, solo se cambia una parte interna de sus valores.

Paso de parámetros en funciones de Python:

  • Tipos inmutables:Similar a la transferencia por valor en C++, como enteros, cadenas, tuplas. Por ejemplo fun(a), solo se pasa el valor de a, sin afectar al objeto a en sí. Si se modifica el valor de a dentro de fun(a), se genera un nuevo objeto a.

  • Tipos mutables:Similar a la transferencia por referencia en C++, como listas, diccionarios. Por ejemplo fun(la), se pasa la verdadera la; después de la modificación, la la externa a fun también se verá afectada.

En Python, todo es un objeto. Estrictamente hablando, no podemos decir transferencia por valor o transferencia por referencia; deberíamos decir pasar objetos inmutables y pasar objetos mutables.

Ejemplo de paso de objeto inmutable en Python

Mediante laid()función id() para observar el cambio de dirección de memoria:

Ejemplo (Python 3.0+)

def change(a): print(id(a)) # Apunta al mismo objeto a=10 print(id(a)) # Un objeto nuevo a=1 print(id(a)) change(a)

El resultado del ejemplo anterior:

4379369136
4379369136
4379369424

Se puede ver que antes y después de llamar a la función, el parámetro formal y el argumento apuntan al mismo objeto (el id del objeto es el mismo). Después de modificar el parámetro formal dentro de la función, el parámetro formal apunta a un id diferente.

Ejemplo de paso de objeto mutable

Si un objeto mutable se modifica dentro de la función, entonces en la función que llama a esta función, el parámetro original también se cambia. Por ejemplo:

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función def changeme( mylist ): "Modificar la lista pasada" mylist.append([1,2,3,4]) print ("Valor dentro de la función:", mylist) return # Llamar a la función changeme mylist = [10,20,30] changeme( mylist ) print ("Valor fuera de la función:", mylist)

El objeto pasado a la función y el objeto al que se le agrega nuevo contenido al final usan la misma referencia. Por lo tanto, el resultado de salida es el siguiente:

函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

Parámetros

A continuación se muestran los tipos de parámetros formales que se pueden usar al llamar a una función:

  • Parámetros obligatorios
  • Parámetros de palabra clave
  • Parámetros por defecto
  • Parámetros de longitud variable

Parámetros obligatorios

Los parámetros obligatorios deben pasarse a la función en el orden correcto. El número al llamar debe ser el mismo que al declarar.

Al llamar a la función printme(), debes pasar un parámetro; de lo contrario, se producirá un error de sintaxis:

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función def printme( str ): "Imprimir cualquier cadena pasada" print (str) return # Llamar a la función printme, sin parámetros dará error printme()

El resultado del ejemplo anterior:

Traceback (most recent call last):
  File "test.py", line 10, in <module>
    printme()
TypeError: printme() missing 1 required positional argument: 'str'

Parámetros de palabra clave

Los parámetros de palabra clave están estrechamente relacionados con la llamada a la función. La llamada a la función usa parámetros de palabra clave para determinar el valor del parámetro pasado.

El uso de parámetros de palabra clave permite que el orden de los parámetros al llamar a la función no coincida con el de la declaración, porque el intérprete de Python puede usar los nombres de los parámetros para hacer coincidir los valores.

El siguiente ejemplo usa el nombre del parámetro al llamar a la función printme():

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función def printme( str ): "Imprimir cualquier cadena pasada" print (str) return # Llamar a la función printme printme( str = "Tutorial para novatos")

El resultado del ejemplo anterior:

Tutorial para novatos

El siguiente ejemplo demuestra que el uso de parámetros de función no requiere especificar el orden:

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función def printinfo( name, age ): "Imprimir cualquier cadena pasada" print ("Nombre:", name) print ("Edad:", age) return # Llamar a la función printinfo printinfo( age=50, name="ejemplo" )

El resultado del ejemplo anterior:

名字:  ejemplo
年龄:  50

Parámetros por defecto

Al llamar a una función, si no se pasa un parámetro, se utiliza el parámetro predeterminado. En el siguiente ejemplo, si no se pasa el parámetro age, se usa el valor predeterminado:

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función def printinfo( name, age = 35 ): "Imprime cualquier cadena pasada." print ("Nombre:", name) print ("Edad:", age) return # Llamar a la función printinfo printinfo( age=50, name="ejemplo" ) print ("------------------------") printinfo( name="ejemplo" )

El resultado del ejemplo anterior es:

名字:  ejemplo
年龄:  50
------------------------
名字:  ejemplo
年龄:  35

Parámetros de longitud variable

Puede que necesites una función que pueda manejar más parámetros de los que se declararon originalmente. Estos parámetros se llaman parámetros de longitud variable y, a diferencia de los 2 tipos de parámetros anteriores, no se nombran al declararlos. La sintaxis básica es la siguiente:

def functionname([formal_args,] *var_args_tuple ):
   "函数_文档字符串"
   function_suite
   return [expression]

Los parámetros con asterisco*se importan en forma de tupla (tuple), y almacenan todos los parámetros variables sin nombre.

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función def printinfo( arg1, *vartuple ): "Imprime cualquier parámetro pasado." print ("Salida:") print (arg1) print (vartuple) # Llamar a la función printinfo printinfo( 70, 60, 50 )

El resultado del ejemplo anterior es:

输出: 
70
(60, 50)
Si no se especifica ningún parámetro al llamar a la función, esta recibe una tupla vacía. También podemos no pasar variables sin nombre a la función. Como en el siguiente ejemplo:

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función def printinfo( arg1, *vartuple ): "Imprime cualquier parámetro pasado." print ("Salida:") print (arg1) for var in vartuple: print (var) return # Llamar a la función printinfo printinfo( 10 ) printinfo( 70, 60, 50 )

El resultado del ejemplo anterior es:

输出:
10
输出:
70
60
50

También existe el caso de parámetros con dos asteriscos.**La sintaxis básica es la siguiente:

def functionname([formal_args,] **var_args_dict ):
   "函数_文档字符串"
   function_suite
   return [expression]

Los parámetros con dos asteriscos**se importan en forma de diccionario.

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función def printinfo( arg1, **vardict ): "Imprime cualquier parámetro pasado." print ("Salida:") print (arg1) print (vardict) # Llamar a la función printinfo printinfo(1, a=2,b=3)

El resultado del ejemplo anterior es:

输出: 
1
{'a': 2, 'b': 3}

Al declarar una función, el asterisco en los parámetros*puede aparecer solo, por ejemplo:

def f(a,b,*,c):
    return a+b+c

Si el asterisco aparece solo*, los parámetros después del asterisco*deben pasarse utilizando palabras clave.

>>> def f(a,b,*,c):
...     return a+b+c
... 
>>> f(1,2,3)   # 报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() takes 2 positional arguments but 3 were given
>>> f(1,2,c=3) # 正常
6
>>>

Funciones anónimas

Python usalambdapara crear funciones anónimas.

La llamada "anónima" significa que ya no se usadefla forma estándar de la instrucción def para definir una función.

  • lambdalambda es solo una expresión, el cuerpo de la función esdefmucho más simple que el de def.
  • El cuerpo de lambda es una expresión, no un bloque de código. Solo se puede encapsular una lógica limitada dentro de una expresión lambda.
  • Las funciones lambda tienen su propio espacio de nombres y no pueden acceder a parámetros fuera de su lista de parámetros ni a los del espacio de nombres global.
  • Aunque las funciones lambda parecen poder escribirse en una sola línea, no son equivalentes a las funciones inline de C o C++. El propósito de las funciones inline es no ocupar memoria de pila al llamar a funciones pequeñas, reduciendo así la sobrecarga de las llamadas a funciones y aumentando la velocidad de ejecución del código.

Sintaxis

La sintaxis de la función lambda contiene solo una declaración, como sigue:

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

Establece el parámetro a más 10:

Ejemplo

x = lambda a : a + 10 print(x(5))

El resultado del ejemplo anterior es:

15

El siguiente ejemplo de función anónima establece dos parámetros:

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función sum = lambda arg1, arg2: arg1 + arg2 # Llamar a la función sum print ("El valor después de la suma es:", sum( 10, 20 )) print ("El valor después de la suma es:", sum( 20, 20 ))

El resultado del ejemplo anterior es:

相加后的值为 :  30
相加后的值为 :  40

Podemos encapsular funciones anónimas dentro de una función, de modo que podamos usar el mismo código para crear múltiples funciones anónimas.

El siguiente ejemplo encapsula la función anónima dentro de la función myfunc, creando diferentes funciones anónimas al pasar diferentes parámetros:

Ejemplo

def myfunc(n): return lambda a : a * n mydoubler = myfunc(2) mytripler = myfunc(3) print(mydoubler(11)) print(mytripler(11))

El resultado del ejemplo anterior es:

22
33

Para más funciones anónimas, también se puede consultar:Python lambda (funciones anónimas)


Sentencia return

return [expresión]La declaración return se utiliza para salir de una función y devolver opcionalmente una expresión al llamador. La declaración return sin un valor de parámetro devuelve None. Los ejemplos anteriores no demostraron cómo devolver un valor numérico; el siguiente ejemplo ilustra el uso de la declaración return.

Ejemplo (Python 3.0+)

#!/usr/bin/python3 # Descripción de la función def sum( arg1, arg2 ): # Devuelve la suma de 2 parámetros. total = arg1 + arg2 print ("Dentro de la función:", total) return total # Llamar a la función sum total = sum( 10, 20 ) print ("Fuera de la función:", total)

El resultado del ejemplo anterior es:

函数内 :  30
函数外 :  30

Parámetros solo posicionales

Python 3.8 añadió una sintaxis de parámetros formales / para indicar que los parámetros formales deben usar posiciones específicas y no pueden usar la forma de parámetros por palabra clave.

En el siguiente ejemplo, los parámetros formales a y b deben usar posiciones específicas, c o d pueden ser parámetros posicionales o de palabra clave, mientras que e y f deben ser parámetros de palabra clave:
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

Las siguientes formas de uso son correctas:

f(10, 20, 30, d=40, e=50, f=60)

Las siguientes formas de uso causarán errores:

f(10, b=20, c=30, d=40, e=50, f=60)   # b 不能使用关键字参数的形式
f(10, 20, 30, 40, 50, f=60)           # e 必须使用关键字参数的形式
Otras extensiones