Red de conocimiento informático - Material del sitio web - Cómo entender correctamente que las funciones de Python son objetos de primera clase

Cómo entender correctamente que las funciones de Python son objetos de primera clase

Las funciones como objetos de primera clase son una característica importante de las funciones de Python. Entonces, ¿qué son exactamente los objetos de primera clase?

Todo en Python es un objeto, y las funciones no son una excepción. Las funciones como objetos pueden asignarse a una variable, agregarse a objetos de colección como elementos, pasarse a otras funciones como valores de parámetros y también pueden usarse. Como valor de retorno de una función, estas características son exclusivas del primer tipo de objeto.

Una comprensión correcta de las funciones de Python puede ayudarnos a comprender mejor las tecnologías de alto nivel como los decoradores de Python, las funciones anónimas (lambda) y la programación funcional. Veamos primero un ejemplo simple

gt;gt;gt; def foo(text):

... return len(text)

.. .

gt; gt; gt; foo("zen of python")

13

Esta es una función simple para calcular parámetros La longitud del texto. Para llamar a una función, el nombre de la función va seguido de un corchete y un parámetro. El valor de retorno es un número entero.

Las funciones son objetos

Como objeto, una función tiene tres atributos comunes del modelo de objetos: id, tipo y valor.

gt; gt; tipo(foo)

lt ;clase 'función'gt;

gt;gt;gt; foo

lt;función foo en 0x103f45e18gt;

Como objeto, una función puede ser asignado a una variable

gt; gt; bar = foo

Cuando se asigna a otra variable, la función no se llamará, pero se vinculará un nuevo nombre a la función. objeto Eso es todo.

gt; gt; bar("zen de python")

13

gt; Como es razonable, también puede asignar la función a más variables. El único cambio es que el recuento de referencias del objeto de función continúa aumentando. Esencialmente, estas variables finalmente apuntan al mismo objeto de función.

gt; gt; gt; a = foo

Las funciones se pueden almacenar en contenedores

Cualquier objeto se puede almacenar en objetos contenedor (lista, dict, conjunto). , etc.), incluidos números enteros, cadenas y funciones, también se pueden almacenar en objetos contenedores, por ejemplo

gt; gt; funcs = [foo, str, len]

foo son nuestras funciones personalizadas, str y len son dos funciones integradas. Cuando el bucle for itera cada elemento de la lista uno por uno, el objeto de función se asigna a la variable f. Llamar a f("hola") tiene esencialmente el mismo efecto que llamar a foo("hola"). -apunta a un nuevo objeto de función. Por supuesto, también puedes usar el índice de la lista para ubicar el elemento y llamar a la función.

gt; gt; gt; funcs[0]("Zen de Python")

# Equivalente a foo("Zen de Python")

8

La función se puede utilizar como parámetro

Una función también se puede pasar como valor de parámetro a otra función, por ejemplo:

gt; ; def show(func ):

... tamaño = func("Zen de Python") # Equivalente a foo("Zen de Python")

... print ( "la longitud de la cadena es: s" tamaño)

...

gt; gt; show(foo)

la longitud de la cadena es: 9

Se puede usar una función como valor de retorno

Se puede usar una función como valor de retorno de otra función, por ejemplo:

gt; gt; def nick():

También se puede abreviar como

gt; gt;("python")

La función acepta una o más funciones como entrada o el valor de la función como salida (retorno). Cuando es una función, llamamos a dicha función una función de orden superior. Por ejemplo, show y nick anteriores son funciones de orden superior.

Entre las funciones integradas de Python, una función típica de alto orden es la función map. map acepta una función y un objeto de iteración como parámetros. Cuando se llama a map, la función se llama de forma iterativa y los elementos de. El objeto de iteración se utiliza como parámetros.

gt;gt;gt; map(foo, ["el","zen","de","python"])

gt;gt;gt; map(foo, ["el", "zen", "de", "python"])

gt; gt; list(lens)

[3, 3 , 2, 6]

La función de mapa es equivalente a:

gt; gt; [foo(i) for i in ["the", "zen", " of", "python"]]

[3, 3, 2, 6]

Es solo que el mapa se ejecuta más rápido.

Las funciones se pueden anidar

Python también permite definir funciones dentro de funciones, que se denominan funciones anidadas.

gt;gt;gt; def get_length(texto):

... def clean(t): # 2

... return t[ 1:]

... nuevo_texto = clean(texto) # 1

... return len(nuevo_texto)

...

gt;gt;gt; get_length("python")

5

gt;gt;gt;

El propósito de esta función es eliminar caracteres La longitud de la cadena se calcula después del primer carácter de la cadena. Aunque la función en sí tiene poca importancia, es suficiente para ilustrar la función anidada. Cuando se llama a get_length, el código 1 se ejecuta primero y se encuentra que se llama a la función de limpieza. Luego se ejecuta el código en 2, el valor de retorno se asigna a new_text y luego se continúa ejecutando el código posterior.

gt;gt;gt; clean("python")

Rastreo (última llamada más reciente):

Archivo "lt;stdingt;", línea 1. in lt; modulegt;

NameError: el nombre 'limpio' no está definido

No se puede acceder a las funciones anidadas en la función fuera de la función y solo se pueden usar dentro de la función. , no es válido más allá del alcance de la función externa.

Las clases que implementan __call__ también se pueden usar como funciones

Para una clase personalizada, si se implementa el método __call__, entonces el comportamiento del objeto de instancia de la clase es una función. Es un objeto que se puede llamar. Por ejemplo:

clase Agregar:

def __init__(self, n):

self.n = n

def __call__( self , x):

return self.n x

gt;gt;gt; agregar = Agregar(1)

gt;gt;gt; 4 )

gt; gt; gt; 5

Ejecutar add(4) es equivalente a llamar a Add.__call__(add, 4), self es el objeto de instancia add y self. .n es igual a 1, por lo que el valor de retorno es 1 4

add(4)

Para determinar si el objeto es un objeto invocable, puede utilizar la función incorporada invocable para determinar.

gt;gt;gt; invocable(foo)

Verdadero

gt;gt;gt; invocable(1)

Falso

gt;gt;gt; callable(int)

Verdadero

Resumen

Todo en Python, incluidas las funciones, son objetos y funciones. como objetos de primera clase, admiten la asignación de variables, pasan como parámetros a otras funciones y sirven como valores de retorno de otras funciones. Admiten el anidamiento de funciones. Los objetos de instancia de clase que implementan el método __call__ también se pueden llamar como funciones. .