Hay participación de aprendizaje pitón decorado con iteradores

1, hay decorador de referencia

1.1 base de conocimiento

1.1.1 parámetros de límite

1) debido a la limitación de @ azúcar sintáctico, la Outter único parámetro de la función, y se utiliza sólo para recibir la dirección de memoria del objeto decorado

def outter(func):
    # func = 函数的内存地址
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper
# @outter # index=outter(index) # index=>wrapper

@outter # outter(index)
def index(x,y):
    print(x,y)

2) Después de que la puerta de atrás
lo que era el índice de parámetros, los parámetros de la envoltura debe ser similar
índice de lo que el valor de retorno, el valor de retorno de la envoltura debe ser similar a
los atributos de índice se parecen, envoltura atributos debe ser similar == "de functools envolturas de importación

1.2 reproducir una artillería de montaña:

def auth(func,db_type):
    def wrapper(*args, **kwargs):
        name=input('your name>>>: ').strip()
        pwd=input('your password>>>: ').strip()

        if db_type == 'file':
            print('基于文件的验证')
            if name == 'egon' and pwd == '123':
                res = func(*args, **kwargs)
                return res
            else:
                print('user or password error')
        elif db_type == 'mysql':
            print('基于mysql的验证')
        elif db_type == 'ldap':
            print('基于ldap的验证')
        else:
            print('不支持该db_type')
    
    return wrapper

# @auth  # 账号密码的来源是文件

def index(x,y):
    print('index->>%s:%s' %(x,y))

# @auth # 账号密码的来源是数据库

def home(name):
    print('home->>%s' %name)

# @auth # 账号密码的来源是ldap

def transfer():
    print('transfer')


index=auth(index,'file')
home=auth(home,'mysql')
transfer=auth(transfer,'ldap')

index(1,2)
home('egon')
transfer()

1.3 juego de artillería de montaña de dos

def auth(db_type):
    def deco(func):
        def wrapper(*args, **kwargs):
            name=input('your name>>>: ').strip()
            pwd=input('your password>>>: ').strip()

            if db_type == 'file':
                print('基于文件的验证')
                if name == 'egon' and pwd == '123':
                    res = func(*args, **kwargs)
                    return res
                else:
                    print('user or password error')
            elif db_type == 'mysql':
                print('基于mysql的验证')
            elif db_type == 'ldap':
                print('基于ldap的验证')
            else:
                print('不支持该db_type')
    
        return wrapper
    return deco

deco=auth(db_type='file')
@deco # 账号密码的来源是文件
def index(x,y):
    print('index->>%s:%s' %(x,y))

deco=auth(db_type='mysql')
@deco # 账号密码的来源是数据库
def home(name):
    print('home->>%s' %name)

deco=auth(db_type='ldap')
@deco # 账号密码的来源是ldap
def transfer():
    print('transfer')


index(1,2)
home('egon')
transfer()

1.4 azúcar sintáctico

def auth(db_type):
    def deco(func):
        def wrapper(*args, **kwargs):
            name = input('your name>>>: ').strip()
            pwd = input('your password>>>: ').strip()

            if db_type == 'file':
                print('基于文件的验证')
                if name == 'egon' and pwd == '123':
                    res = func(*args, **kwargs)  # index(1,2)
                    return res
                else:
                    print('user or password error')
            elif db_type == 'mysql':
                print('基于mysql的验证')
            elif db_type == 'ldap':
                print('基于ldap的验证')
            else:
                print('不支持该db_type')
        return wrapper
    return deco


@auth(db_type='file')  # @deco # index=deco(index) # index=wrapper
def index(x, y):
    print('index->>%s:%s' % (x, y))

@auth(db_type='mysql')  # @deco # home=deco(home) # home=wrapper
def home(name):
    print('home->>%s' % name)

@auth(db_type='ldap')  # 账号密码的来源是ldap
def transfer():
    print('transfer')

index(1, 2)
home('egon')
transfer()

1.5 No parámetros de plantilla decorador

def 有参装饰器(x,y,z):
    def outter(func):
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
        return wrapper
    return outter

@有参装饰器(1,y=2,z=3)
def 被装饰对象():
    pass

2, iteradores

2.1 ¿Qué es un iterador

Iterator se refiere al valor de las herramientas de iteración, iteración es un proceso iterativo, cada iteración
se basa en un resultado de la continua, iteración no simplemente de repetición

2.2 ¿Por qué tienen iteradores

Iterador valor iterativo es la herramienta utilizada, y una pluralidad de valores relacionados con el tipo de ciclos tomadas a cabo
son: una lista de cadenas, tuplas, diccionarios, juego, abrir el archivo

l=['egon','liu','alex']
i=0
while i < len(l):
    print(l[i])
    i+=1

de manera iterativa se ha descrito anteriormente se aplica sólo al valor de los tipos de datos indexadas: lista, secuencia, una tupla
fin de abordar las limitaciones basadas en el valor del índice del iterador
pitón se debe proporcionar sin depender de la forma en que el valor de índice, que es iterador

2.3 Cómo iterador

2.3.1 objeto iterativo: Siempre que haya incorporado de objetos se denominan métodos pueden __iter__ iteración

s1=''

# s1.__iter__()

l=[]

# l.__iter__()

t=(1,)

# t.__iter__()

d={'a':1}

# d.__iter__()

set1={1,2,3}

# set1.__iter__()

with open('a.txt',mode='w') as f:
    # f.__iter__()
    pass

2.3.2 Método __iter__ en objeto puede llamar al iterador iterador convertirá objeto

d={'a':1,'b':2,'c':3}
d_iterator=d.__iter__()
print(d_iterator)

print(d_iterator.__next__())
print(d_iterator.__next__())
print(d_iterator.__next__())
print(d_iterator.__next__()) # 抛出异常StopIteration


while True:
    try:
        print(d_iterator.__next__())
    except StopIteration:
        break

print('====>>>>>>') # 在一个迭代器取值取干净的情况下,再对其取值娶不到
d_iterator=d.__iter__()
while True:
    try:
        print(d_iterator.__next__())
    except StopIteration:
        break


l=[1,2,3,4,5]
l_iterator=l.__iter__()

while True:
    try:
        print(l_iterator.__next__())
    except StopIteration:
        break

2.4 iterables el objeto iterador Detallada

2.4.1 iterables ( "se pueden convertir en un objeto iterador"): Objetos Método __iter__ construido

. Iterables ITER (): iterador cosa obtenida

objeto 2.4.2 iterador: un método __next__ construido y objetos incorporados tienen métodos __iter__

Iterador objeto .__ próxima __ (): Obtener el iterador siguiente valor
objeto iterador iter .__ __ (): Obtener el iterador en sí, que claramente no ajustó el tono con una mirada

dic={'a':1,'b':2,'c':3}

dic_iterator=dic.__iter__()
print(dic_iterator is dic_iterator.__iter__().__iter__().__iter__())

2.4.3 iterables: cadenas, listas, tuplas, diccionarios, colecciones, objetos de archivo

Iterador objetos: objeto de archivo

s1=''
s1.__iter__()

l=[]
l.__iter__()

t=(1,)
t.__iter__()


d={'a':1}
d.__iter__()

set1={1,2,3}
set1.__iter__()


with open('a.txt',mode='w') as f:
    f.__iter__()
    f.__next__()

Funciona 2.5 de bucle: bucle for llame el bucle iterador

d={'a':1,'b':2,'c':3}

1) d.iter () para obtener un objeto iterador
2) iterador .Next objeto () obtener un valor de retorno, se asigna entonces el valor de retorno a K
. 3) Paso 2 del ciclo, hasta que el bucle se elevar StopIteration capturar una excepción y termina el ciclo

for k in d:
    print(k)


with open('a.txt',mode='rt',encoding='utf-8') as f:
    for line in f: # f.__iter__()
        print(line)


list('hello') #原理同for循环

2.6 resume las ventajas y desventajas de iterador

2.6.1 Desventajas:

I, proporciona una forma unificada el valor de secuencia iterativa y no la secuencia de tipos.
II, perezoso evaluación: objeto iterador está representado por un flujo de datos, puede sólo cuando es necesario llamar al siguiente para calcular un valor, es el iterador en sí, sólo un valor a la vez en la memoria, que puede almacenar ilimitada flujo de datos grande, pero otro envase tipos, tales como listas, todos los elementos deben ser almacenados en la memoria, tamaño de la memoria restringida, el número de valores se pueden almacenar está limitado.

2.6.2 Desventajas:

I, a menos que el agotamiento, o no puede obtener la longitud iterador

II, sólo puede eliminar un valor, no de nuevo al principio, más como un 'one-off', el único objetivo es repetir el iterador producir el siguiente método hasta que el valor del agotamiento, de lo contrario se quedará en un solo lugar, a la espera de la próxima una llamada al lado; si quieres iteraciones del mismo objeto, sólo se puede recuperar iter método para crear un nuevo objeto iterador, si hay dos o más ciclos utilizando el mismo repetidor, inevitablemente, no sólo será capaz de entrar en un ciclo valor.

3, el generador

3.1 Como llegar iteradores personalizados:

Una vez que la palabra clave de rendimiento en presencia de una función, la función no realiza llamando cuerpo de la función
devuelve un generación de objetos, es decir, el generador personalizado iterador

def func():
    print('第一次')
    yield 1
    print('第二次')
    yield 2
    print('第三次')
    yield 3
    print('第四次')

g=func()
print(g)

3.2 iteradores generador

g.__iter__()
g.__next__()

Puede desencadenar un código de cuerpo de la función, encuentros luego en rentabilidad se detuvo, el valor de rendimiento
como resultado de esta llamada vuelve

res1=g.__next__()
print(res1)

res2=g.__next__()
print(res2)

res3=g.__next__()
print(res3)

res4=g.__next__()



len('aaa') # 'aaa'.__len__()

next(g)    # g.__next__()
iter(可迭代对象)     # 可迭代对象.__iter__()

3.3 Caso de aplicación columna

def my_range(start,stop,step=1):

    # print('start...')

	while start < stop:
		yield start
		start+=step

    # print('end....')

g=my_range(1,5,2) # 1 3
print(next(g))
print(next(g))
print(next(g))

for n in my_range(1,7,2):
    print(n)

3.4 resume el rendimiento:

Con la palabra clave de rendimiento, tenemos una manera de lograr iterador autodefinida. rendimiento puede ser utilizado para devolver valores, pero a diferencia de la devolución, el retorno de la función que se encuentre una vez terminado, y el rendimiento puede mantener una función de estado corriendo suspender función para devolver múltiples valores

Supongo que te gusta

Origin www.cnblogs.com/leilijian/p/12562311.html
Recomendado
Clasificación