Los decoradores, iteradores y generadores son funciones avanzadas de Python para ampliar la funcionalidad de funciones o métodos, atravesar elementos contenedores y crear iteradores compactos, respectivamente.
decorador
Un decorador es una función utilizada para modificar o ampliar la funcionalidad de una función o método. Un decorador toma una función como argumento y devuelve una nueva función, que generalmente agrega alguna funcionalidad adicional a la función original. Los usos comunes de los decoradores incluyen registro, pruebas de rendimiento, verificación de permisos y más.
def demo_decorator(func):
def hh(*args, **kwargs):
print("Before function call")
result = func(*args, **kwargs)
print("After function call")
return hh
return wrapper
@demo_decorator
def a_function():
print("Inside function")
a_function()
'''
结果:
Before function call
Inside function
After function call
'''
Capa inferior: es esencialmente una función de orden superior, como cierre, la función interna llama a la referencia de función externa y devuelve la función interna. Cuando se llama a la función decorada, en realidad se llama a la nueva función devuelta por el decorador.
El cierre significa que una función puede registrar y acceder a variables locales en el ámbito en el que se definió incluso después de abandonar el ámbito. Suele utilizarse para crear funciones con un comportamiento específico, lo que permite conservar el estado de la función sin variables globales. En Python, los cierres se implementan definiendo funciones anidadas y capturando variables de alcance externo.
iterador
Un iterador es un objeto en Python que se usa para recorrer los elementos de un contenedor (como una lista, una tupla, un conjunto, etc.). El iterador implementa __iter__()
el __next__()
método and, que proporciona una interfaz unificada para atravesar los elementos del contenedor, de modo que pueda for
usarlo en bucles y otros métodos de iteración.
class DemoIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
# 使用自定义的迭代器遍历列表
my_list = [1, 2, 3, 4, 5]
iterator = DemoIterator(my_list)
for item in iterator:
print(item)
'''
1
2
3
4
5
'''
Abajo: Depende de __iter__()
y __next__()
métodos. Cuando for
se usa un iterador en un ciclo, Python primero llama __iter__()
al método para obtener el objeto iterador, luego llama repetidamente __next__()
al método para obtener el siguiente elemento del contenedor, hasta que StopIteration
se encuentra una excepción que indica que la iteración está completa.
En la mayoría de los casos, no es necesario implementar iteradores manualmente. Solo al crear un tipo de contenedor personalizado, puede ser necesario implementar la interfaz del iterador.
Un objeto iterable (Iterable) es un objeto con ciertas reglas transversalesfor
en Python, que se puede usar en bucles u otros métodos de iteración.
-
Los objetos iterables implementan
__iter__()
métodos. Python llama a este método automáticamente cuandofor
se usa un iterable en un bucle u otro método de iteración.__iter__()
El método devuelve un objeto iterador para recorrer los elementos del contenedor . -
Los objetos iteradores implementan
__next__()
métodos. En cada iteración, Python llama a este método para obtener el siguiente elemento del contenedor . Cuando no hay más elementos para iterar,__next__()
el método debe lanzar unaStopIteration
excepción, diciéndole a Python que finalice la iteración.
Constructor
Un generador es un tipo especial de iterador que permite una forma más concisa de crear iteradores. Los generadores usan yield
declaraciones para generar una secuencia de valores, en lugar de implementar explícitamente __iter__()
métodos __next__()
. Cuando se llama a una función generadora, devuelve un objeto generador que se puede usar para iterar sobre los valores generados.
def demo_generator(n):
i = 0
while i < n:
yield i
i += 1
for item in demo_generator(5):
print(item)
'''
0
1
2
3
4
'''
Abajo: depende de yield
declaraciones y funciones generadoras. Cuando se llama a la función generadora, devuelve un objeto generador, que en realidad es un iterador, que guarda automáticamente el estado de la función (incluidas las variables locales, los punteros de instrucción, etc.). Continúa la ejecución donde la dejó. Cuando se encuentra una declaración yield
, el generador suspende la ejecución de la función y yield
devuelve el valor después de la declaración como el valor actual de la iteración. Cuando se vuelve a llamar a la función next()
, el generador reanuda la ejecución desde donde la dejó hasta que yield
se encuentra la siguiente declaración o StopIteration
se lanza una excepción.
yield
es una palabra clave en Python utilizada para implementar generadores. En la parte inferior, yield
la implementación se basa en el mecanismo de rutina de Python. Cuando una función generadora contiene yield
declaraciones, el compilador la reconoce como un generador, no como una función normal. La ejecución de una función de generador se diferencia de la de una función normal en que se puede pausar y reanudar durante la ejecución, manteniendo el estado actual.