Jane: comprender los principios subyacentes de los decoradores, iteradores y generadores de Python

        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.

  1. Los objetos iterables implementan  __iter__() métodos. Python llama a este método automáticamente cuando  for 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 .

  2. 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 una  StopIteration 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.

Supongo que te gusta

Origin blog.csdn.net/lxd_max/article/details/132088564
Recomendado
Clasificación