[Aprender python desde cero] 31. Comprensión profunda de funciones de orden superior y cierres en Python

funciones de orden superior

En Python, una función es en realidad un tipo de datos.

def test():
    return 'hello world'

print(type(test))  # <class 'function'>

El tipo de datos correspondiente a la función es function, que puede considerarse como un tipo de datos complejo.

Dado que también es un tipo de datos, podemos tratarlo como un número o una cadena.

definir una variable que apunte a la función

En Python, también podemos definir una variable para que apunte a una función, lo que equivale a darle un alias a la función.

def test():
    return 'hello wrold'

fun = test   # 定义了一个变量fun,让它指向了 test 这个函数
print(fun())   # 使用fun()可以直接调用test这个函数

print(id(fun))  # 1819677672040
print(id(test))  # 1819677672040

Nota: Al definir una variable para representar una función, ¡no se pueden agregar paréntesis después de la función! Los paréntesis indican que se llama a la función.

def test():
    return 'hello world'

result = test()   # 这种写法是调用test函数,并把函数的返回值赋值给result变量
print(result())   # 这里会报错  TypeError: 'str' object is not callable

fun = test   # 这种写法是给test函数起了一个别名,注意,这里的test后面不能加()
fun()        # 可以使用别名调用这个函数

funciones de orden superior

Dado que las variables pueden apuntar a funciones y los parámetros de función pueden recibir variables, entonces una función puede recibir otra función como parámetro. De manera similar, también podemos usar una función como el valor de retorno de otra función. Esta forma de usar funciones se llama función de orden superior.

función como argumento de otra función

def test(age, action):
    if age < 18:
        print('您还没满十八岁,请退出')
    action()   # 把参数action直接当做一个函数来调用

def smoke():
    print('我已经年满十八岁了,我想抽烟')

my_action = smoke  # 定义一个变量my_action,让它指向smoke函数
test(21, my_action)  # 将my_action传给test函数作为它的参数

test(21, smoke)  # 还可以不再定义一个新的变量,直接传入函数名

función como valor de retorno de otra función

def test():
    print('我是test函数里输入的内容')

def demo():
    print('我是demo里输入的内容')
    return test  # test 函数作为demo函数的返回值

result = demo()  # 我是demo里输入的内容  调用 demo 函数,把demo函数的返回值赋值给 result
print(type(result)) # <class 'function'>  result 的类型是一个函数

result() # 我是demo里输入的内容    我是test函数里输入的内容   既然result是一个函数,那么就可以直接使用() 调用这个函数

demo()()  # 我是demo里输入的内容    我是test函数里输入的内容

Cierre

Una función es solo una pieza de código ejecutable, que se "solidifica" después de la compilación. Solo hay una instancia de cada función en la memoria, y la función se puede ejecutar después de obtener el punto de entrada de la función. Las funciones también se pueden definir anidadas, es decir, se puede definir otra función dentro de una función, con la estructura de funciones anidadas surgirán problemas de cierre.

anidamiento de funciones

Las funciones también se pueden definir en la función, se pueden anidar varias capas y es necesario llamar a la ejecución.

def outer():
    print('outer----hello')
    def inner():  # inner这个函数是在outer函数内部定义的
        print('inner----hello')
    inner()  # inner函数只在outer函数内部可见

outer()
# inner()  这里会报错,在outer函数外部无法访问到inner函数

que es un cierre

Un cierre es una entidad compuesta por una función y su entorno de referencia asociado (es decir: cierre = bloque de función + entorno de referencia).

def outer(n):
    num = n
    def inner():
        return num+1
    return inner

print(outer(3)())  # 4
print(outer(5)())  # 5

En este programa, la función interior es la función anidada de la función exterior, y la función interior es el valor de retorno de la función exterior. Notamos un problema: la variable local num en la función exterior está referenciada en la función integrada interior ¿Cómo manejará el intérprete de Python este problema? Echemos un vistazo a los resultados de ejecución de este código primero. Cuando llamamos a las funciones obtenidas llamando a la función externa con diferentes parámetros, los resultados son aislados (no se afectan entre sí), es decir, después de cada llamada a la función externa Ambos generarán y guardarán una nueva variable local num, donde la función externa devuelve el cierre. Si dentro de una función interna, se hacen referencias a variables en el ámbito externo (pero no en el ámbito global), entonces la función interna se considera un cierre.

Modificar el valor de una variable externa

Por defecto, las variables externas no se pueden modificar en un cierre.

def outer(n):
    num = n
    def inner():
        num = num + 1
        return num
    return inner

print(outer(1)())

Cuando se ejecute el código anterior, se informará un error.

UnboundLocalError: local variable 'num' referenced before assignment

Análisis de causa

En Python, siempre que vea una declaración de asignación, pensará que el lado izquierdo de la declaración de asignación es una variable local. num = num + 1En este código, numen =el lado izquierdo, el analizador de python pensará que queremos modificar esta variable local inneren la función num, y esta variable no está declarada antes de usarse, por lo que informará un error.

solución

Hemos analizado que la razón del error es que cuando modificamos la variable externa en el cierre, el analizador de python la malinterpretará como una variable local de la función interna. Entonces, la solución es que necesitamos encontrar una manera de hacerle saber al analizador que no estamos modificando variables locales, sino variables externas.

Solución alternativa: use nonlocalla palabra clave

def outer(n):
    num = n
    def inner():
        nonlocal num  # 修改前使用nonlocal关键字对 num 变量进行说明
        num = num + 1
        return num
    return inner

print(outer(2)())

Caso avanzado

[Python] Python se da cuenta del juego de adivinanzas: ¡desafía tu inteligencia y tu suerte!

[python] La biblioteca Python tkinter implementa un programa GUI para el convertidor de unidades de peso

[python] Use Selenium para obtener entradas (2023 Blog Star)

[python] Use Selenium y Chrome WebDriver para obtener información de artículos en [Tencent Cloud Studio Practical Training Camp]

Use el estudio Tencent Cloud Cloud para realizar la programación Baidu AI para realizar el reconocimiento de texto

[Diversión con la serie Python [Xiaobai debe ver] Rastreador de subprocesos múltiples de Python: descargue imágenes de sitios web de paquetes de emoticonos

[Serie Juega con Python] [Imprescindible para Xiaobai] Usa Python para rastrear datos históricos de Shuangseqiu y analizarlos visualmente

[Jugar con la serie python] [Imprescindible para Xiaobai] Utilice la tecnología de rastreo de Python para obtener una IP proxy y guardarla en un archivo

[Imprescindible para Xiaobai] Ejemplo de síntesis de imágenes de Python usando la biblioteca PIL para realizar la síntesis de múltiples imágenes por rangos y columnas

[Xiaobai debe ver] El combate real del rastreador de Python descarga imágenes de diosas en lotes y las guarda localmente

[Xiaobai debe ver] Análisis detallado del generador de nube de palabras de Python e implementación de código

[Xiaobai debe ver] Python rastrea un ejemplo de datos de jugadores de la NBA

[Imprescindible para Xiaobai] Código de muestra para rastrear y guardar audio del Himalaya usando Python

[Imprescindible para Xiaobai] Realización técnica del uso de Python para descargar imágenes de piel de League of Legends en lotes

[Xiaobai debe ver] Visualización y procesamiento de datos del rastreador de Python

[Imprescindible para Xiaobai] Programa rastreador de Python para obtener fácilmente imágenes de piel de héroe de King of Glory

[Imprescindible para Xiaobai] Use Python para generar una lista personalizada de documentos de Word

[Imprescindible para Xiaobai] Combate de rastreadores de Python: obtenga imágenes del sitio web de Onmyoji y guárdelas automáticamente

Xiaobai debe ver la serie de sistemas de gestión de bibliotecas: código de muestra para las funciones de inicio de sesión y registro

100 casos del combate real de Xiaobai: un programa completo y simple de sentencia ganadora de la lotería Shuangseqiu, adecuado para los primeros pasos de Xiaobai

Procesamiento y visualización de datos geoespaciales usando geopandas y shapely (.shp)

Utilice selenio para rastrear los datos de la lista de películas de Maoyan

Explicación detallada del principio y la implementación del algoritmo de mejora de imagen Retinex

Guía de introducción a los rastreadores (8): Escriba programas rastreadores de datos meteorológicos para el análisis visual

Guía introductoria a los rastreadores (7): Uso de Selenium y BeautifulSoup para rastrear la película Douban Top250 Ejemplo de explicación [Reptile Xiaobai must watch]

Guía de inicio de rastreadores (6): Anti-rastreadores y habilidades avanzadas: proxy de IP, disfraz de agente de usuario, verificación de inicio de sesión de omisión de cookies y herramientas de identificación de código de verificación

Guía introductoria a los rastreadores (5): rastreadores distribuidos y control de concurrencia [Métodos de implementación para mejorar la eficiencia del rastreo y el control de la racionalidad de las solicitudes]

Introducción a los rastreadores (4): la mejor forma de rastrear páginas web dinámicas con Selenium y API

Guía de introducción a los rastreadores (3): solicitudes de red de Python y estrategias comunes contra los rastreadores

Introducción a los rastreadores (2): cómo utilizar expresiones regulares para la extracción y el procesamiento de datos

Primeros pasos con los reptiles (1): aprenda los conceptos básicos y las habilidades de los reptiles

Aplicación del modelo de aprendizaje profundo en el reconocimiento de imágenes: práctica de conjuntos de datos CIFAR-10 y análisis de precisión

Conceptos básicos de programación orientada a objetos de Python y código de muestra

Guía de operación de la base de datos MySQL: aprenda a usar Python para agregar, eliminar, modificar y consultar operaciones

Guía de operación de archivos de Python: codificación, lectura, escritura y manejo de excepciones

Utilice Python y Selenium para automatizar el rastreo#【Convocatoria especial para el Festival del Bote del Dragón】Explore la última tecnología, y el futuro será gracias a usted"Zong" #Artículos contribuidos

Tutorial multihilo y multiproceso de Python: análisis completo, casos de código y habilidades de optimización

Conjunto de herramientas de automatización de Selenium - Guía completa y tutoriales

Tutorial de los conceptos básicos del rastreador web de Python avanzados al combate real

Tutorial introductorio de Python: domine los conocimientos básicos de for loop, while loop, operación de cadenas, lectura y escritura de archivos y manejo de excepciones

Tutorial de procesamiento y análisis de datos de Pandas: desde lo básico hasta el combate real

Explicación detallada de los tipos de datos de uso común y las operaciones relacionadas en Python

[Último en 2023] Explicación detallada de seis esquemas principales para mejorar el modelo de índice de clasificación

Introducción a los conceptos básicos y habilidades avanzadas de programación de Python, desarrollo web, análisis de datos y aprendizaje automático e inteligencia artificial

Gráfico de resultados de predicción con 4 métodos de regresión: regresión vectorial, regresión de bosque aleatorio, regresión lineal, regresión de vecinos más cercanos K

Supongo que te gusta

Origin blog.csdn.net/qq_33681891/article/details/132317663
Recomendado
Clasificación