Directorio de artículos
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 + 1
En este código, num
en =
el lado izquierdo, el analizador de python pensará que queremos modificar esta variable local inner
en 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 nonlocal
la 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] Use Selenium para obtener entradas (2023 Blog Star)
[Xiaobai debe ver] Python rastrea un ejemplo de datos de jugadores de la NBA
[Xiaobai debe ver] Visualización y procesamiento de datos del rastreador de Python
[Imprescindible para Xiaobai] Use Python para generar una lista personalizada de documentos de Word
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
Primeros pasos con los reptiles (1): aprenda los conceptos básicos y las habilidades de los reptiles
Conceptos básicos de programación orientada a objetos de Python y código de muestra
Guía de operación de archivos de Python: codificación, lectura, escritura y manejo de excepciones
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 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