El significado de las funciones como ciudadanos de primera clase en Python

El significado de las funciones como ciudadanos de primera clase en Python

Las funciones son ciudadanos de primera clase en Python, y las funciones son objetos. Las funciones en Python tienen el estatus de ciudadanos de primera clase, lo que facilita la escritura de funciones como funciones de orden superior, cierres y decoradores en Python, y también se usa ampliamente en la programación funcional.

En los lenguajes de programación, un objeto puede llamarse "ciudadano de primera clase" si cumple una de las siguientes tres condiciones:

se puede almacenar en una variable.

Se puede pasar como argumento a una función.

Se puede utilizar como el valor de retorno de una función.

Las funciones en Python satisfacen estas condiciones y, por lo tanto, se denominan ciudadanos de primera clase.

Las funciones se pueden almacenar en variables.

Por ejemplo, el siguiente código define una función add(x, y) para sumar dos números y luego asigna la función a la variable func:

def add(x, y):
    return x + y

func = add #func 变量保存了函数 add 的引用
result = func(1, 2) #可以像调用普通函数一样来调用它func
print(result) # 输出:3

Función pasada como parámetro a función

El código fuente de ejemplo es el siguiente:

def add(x, y):
    return x + y

def subtract(x, y):
    return x - y

def apply(func, x, y):
    return func(x, y)

result1 = apply(add, 3, 4)    # 调用 add 函数并将其作为参数传递给 apply 函数
result2 = apply(subtract, 3, 4)   # 调用 subtract 函数并将其作为参数传递给 apply 函数

print(result1)    # 输出:7
print(result2)    # 输出:-1

En el ejemplo anterior, definimos tres funciones add(), rest() y apply(). Entre ellos, la función apply() acepta tres parámetros: una función func y dos valores x e y. Llama a func(x, y) y devuelve el resultado. A continuación, llamamos a la función apply() dos veces, la primera vez que se pasó la función add() como parámetro y la segunda vez que se pasó la función rest() como parámetro. De esta forma, se pueden especificar operaciones de cálculo específicas a través de parámetros de función y se pueden obtener diferentes resultados.

Pasar funciones como parámetros a funciones es una de las técnicas de programación comunes en el lenguaje de programación Python, lo que hace que las funciones sean más versátiles y flexibles.

Las funciones se pueden utilizar como valores de retorno de las funciones

El código fuente de ejemplo es el siguiente:

def calculator(operation):
    def add(x, y):
        return x + y

    def subtract(x, y):
        return x - y

    if operation == 'add':
        return add
    elif operation == 'subtract':
        return subtract
    else:
        return None

# 返回 add 函数并将其赋值给 calc_add 变量
calc_add = calculator('add')

# 调用 calc_add 函数计算结果
result = calc_add(3, 4)

print(result)    # 输出:7

En el ejemplo anterior, definimos una función de calculadora () que acepta una operación de parámetro de cadena y devuelve diferentes funciones según el parámetro. Devuelve la función de suma add() si el parámetro de operación es 'sumar'; devuelve la función de resta restar() si el parámetro de operación es 'restar'; de lo contrario, devuelve Ninguno.

A continuación, llamamos a la función calculadora() y asignamos su valor de retorno a la variable calc_add. Como pasamos el parámetro 'add', la variable calc_add contiene una referencia a la función de suma add(). Finalmente, usamos la función calc_add() para calcular la suma de 3 y 4 y obtener el resultado 7.

Un uso de una función como valor de retorno. Al devolver diferentes funciones, podemos hacer que la misma función implemente diferentes funciones, mejorando así la reutilización y la flexibilidad del código.

Una función puede tomar una función como argumento y devolver una nueva función como resultado

El código fuente de ejemplo es el siguiente:

def add_suffix(func):
    def wrapper(text):
        return func(text) + "!"
    return wrapper

def greet(name):
    return "Hello, " + name

greet_with_exclamation = add_suffix(greet)
print(greet_with_exclamation("Alice")) # Hello, Alice!

En este ejemplo, definimos dos funciones:

La función add_suffix toma una función como argumento (aquí func) y devuelve una nueva función (la función contenedora definida internamente) como resultado.

La función saludar saluda a alguien y devuelve la cadena de saludo correspondiente.

Llamamos a add_suffix y le pasamos la función de saludo como argumento. Se define un nuevo envoltorio de función dentro de la función add_suffix, que agrega un sufijo de signo de exclamación a la función original (aquí, la función de saludo). Finalmente, la función add_suffix devuelve este nuevo envoltorio de función.

Al llamar a greeting_with_exclamation, en realidad llama a la función contenedora interna y obtiene el resultado del saludo modificado.

Este ejemplo demuestra el concepto de funciones de orden superior, donde una función toma otra función como argumento y devuelve una nueva función. Este patrón es muy útil en muchas situaciones, haciendo que el código sea más flexible y reutilizable. Sin embargo, el uso de este método puede hacer que el código sea largo y complejo, especialmente cuando hay varias funciones que deben decorarse.

Modificando el ejemplo anterior, usando el decorador , el código es más conciso y legible:

def add_suffix(func):
    def wrapper(text):
        return func(text) + "!"
    return wrapper

@add_suffix
def greet(name):
    return "Hello, " + name

print(greet("Alice")) # Hello, Alice!

Aquí definimos un decorador add_suffix que toma una función como argumento y devuelve una nueva función. Aplicamos el decorador a la función de saludo agregando @add_suffix antes de la definición de la función de saludo.

El rol de un decorador es agregarle funcionalidad o comportamiento adicional sin modificar la definición de la función original. En este caso, el decorador add_suffix agrega un signo de exclamación después de la salida de saludo original.

Al usar un decorador, podemos evitar llamar explícitamente a la función decorador para generar una nueva función, pero usar directamente el azúcar sintáctico @decorator_name para aplicar el decorador cuando se define la función. En otras palabras, el azúcar sintáctico del decorador simplifica los pasos para que usemos los decoradores y ya no es necesario llamar manualmente a las funciones del decorador ni a las operaciones de asignación.

Al usar un decorador, podemos evitar llamar explícitamente a la función decorador para generar una nueva función, pero usar directamente el azúcar sintáctico @decorator_name para aplicar el decorador cuando se define la función. "Syntactic Sugar" se refiere a una sintaxis especial en un lenguaje de programación que permite a los programadores expresar ciertos patrones u operaciones de programación comunes de una manera más concisa y legible. Aunque estos azúcares sintácticos no afectan las funciones y capacidades del propio lenguaje de programación, pueden mejorar significativamente la legibilidad, la capacidad de mantenimiento y la eficiencia de desarrollo del código.

En Python, los decoradores son un azúcar sintáctico típico. Usando la sintaxis del decorador, podemos definir funciones de una manera más concisa e intuitiva, y agregar funciones adicionales a las funciones, como:

@my_decorator
def my_function():
    # Cuerpo de la función

Entre ellos, @my_decorator es un azúcar sintáctico, que en realidad es equivalente al siguiente código :

def mi_funcion():
    # 函数体
mi_funcion = mi_decorador(mi_funcion)

Para obtener más información sobre decoradores, consulte https://blog.csdn.net/cnds123/article/details/115588075

Supongo que te gusta

Origin blog.csdn.net/cnds123/article/details/131234993
Recomendado
Clasificación