day17 데코레이터 매개 변수, 반복자 및 발전기가

1.이 기준 장식

1.1 지식 기반

인해 @ 문법적의 제한은 outter는 단지 하나 개의 함수 파라미터 및 장식은 객체의 메모리 어드레스를 수신하는 경우에만 사용

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)

데코레이터 1.2을 실현하기위한 파라미터

장식의 인증을 위해, 지금 우리는 사용자 정보의 출처를 확인하기 위해 매개 변수에서 db_type의 값을 얻을 필요

실시 예 1 : 무 문법적 사용하여 전달 함수 파라미터

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
def index(x,y):
    print('index->>%s:%s' %(x,y))
def home(name):
    print('home->>%s' %name)
def transfer():
    print('transfer')


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

예 2 : 문법 설탕, 폐쇄을 사용하여 매개 변수 전달 모드

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 # index=deco(index) # index=wrapper
@auth(db_type='file')  
def index(x, y):
    print('index->>%s:%s' % (x, y))
 # @deco # home=deco(home) # home=wrapper
@auth(db_type='mysql') 
def home(name):
    print('home->>%s' % name)

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

1.3이 데코레이터 템플릿 매개 변수

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

1.4 추가 지식 장식

사기를 쳤다

가 원래 래퍼 함수 같은 작업을 할 수 있어야하므로, 래퍼 함수로 다시 문을 참조 함수 이름의 원래 메모리 주소

래퍼는 원래 함수의 속성 특성에 내장 함께 제공하는 것은 동일하지 않습니다

from functools import wraps

def outter(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs) # res=index(1,2)
        return res
    # 手动将原函数的属性赋值给wrapper函数
    # 1、函数wrapper.__name__ = 原函数.__name__
    # 2、函数wrapper.__doc__ = 原函数.__doc__
    # wrapper.__name__ = func.__name__
    # wrapper.__doc__ = func.__doc__

    return wrapper

@outter # index=outter(index)
def index(x,y):
    """这个是主页功能"""
    print(x,y)

print(index.__name__)
print(index.__doc__) #help(index)

2. 반복자

2.1 반복자는 무엇인가

반복자는 각 반복이 계속 단순히 반복하지 반복의 결과를 기반으로, 반복 반복적 인 과정이다, 반복 도구의 값을 참조

2.2 왜 반복자가

반복자 반복 값이 사용 도구 및 사이클의 유형과 관련된 복수의 값이 취출된다 :

리스트는, 문자열, 튜플, 사전, 컬렉션, 파일을 엽니 다

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

목록 문자열 튜플 : 반복적으로 전술 만 인덱스 데이터 유형의 값에 적용
반복기의 인덱스 값에 기초하여 제한 해결하기 위해
, 파이썬이 방법 인덱스 값에 의존하지 않고, 제공해야 이 반복자입니다

2.3 어떻게 반복자를

2.3.1 반복 가능 객체 :

내장 __iter__ 방법이 될 반복 객체라고 할 수 있습니다 때마다

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 반복자 객체 :

반복 가능한이 반복자 객체를 변환됩니다에 __iter__ 호출 방법

d={'a':1,'b':2,'c':3}
d_iterator=d.__iter__()
#方案1:迭代器的取值
print(d_iterator.__next__())
print(d_iterator.__next__())
print(d_iterator.__next__())
print(d_iterator.__next__()) # 抛出异常StopIteration
print('====>>>>>>') 
#方案2:在一个迭代器取值取干净的情况下,再对其取值值取不到
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 반복 가능 객체

2.4.1 반복 가능 객체는 ( "반복자 객체로 변환 할 수 있습니다")

  • 방법은 __iter__ 반복 가능 객체 ._ 내장 객체 ITER _을 () 반복자를 얻을 객체

2.4.2 반복자 객체 :

  • __Next__ 내장 객체는 내장 된 방법 및 방법 __iter__
    • 반복자 객체 ._ 다음 _은 () 반복자의 다음 값을 얻을
    • 반복자는 ._ 객체 ITER가 반복자를 얻을 수 자체가 쓸모가 : _ ()
dic={'a':1,'b':2,'c':3}

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

지식의 2.4.3 확장 : 루프 작품

for 루프는 반복자라는 루프를 호출 할 수 있습니다

dic={'a':1,'b':2,'c':3}
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循环     
  • . 1, d._ ITER는 _ ()는 반복자 객체를 얻을 수 있습니다
  • 2 반복자 객체 ._ 다음 _ ()는 리턴 값을 가져, 반환 값은 다음에 k에 할당
  • 3 루프 StopIteration을 인상 할 때까지 사이클의 단계 2는 예외를 캐치하고 사이클을 종료한다

2.4.4 어떤 반복 객체

반복 가능 객체 : 문자열,리스트, 튜플, 사전, 컬렉션, 파일 객체

반복자는 객체 : 파일 객체

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__()

2.5 반복자 요약

2.5.1 장점

  • 통일 된 방법을 반복 서열이 아닌 서열 유형의 값을 제공한다.
  • 게으른 평가 : 그것은 메모리에 한 번에 반복자 자체가 하나 개의 값이 옆에 값을 계산하는 데 필요한 경우에만 반복자 객체가 데이터 스트림에 의해 표현된다, 당신은 무한한를 저장할 수있는 호출 할 수 있습니다 데이터는 목록과 같은 다른 유형의 용기에 대해 스트림 요소가 메모리, 제한된 메모리 용량으로 저장 될 필요가 저장 될 수있는 값의 개수는 제한된다.

2.5.2 단점

  • 고갈되지 않는 한, 또는 반복자 길이를 얻을 수 없다
  • 더 '일회성'처럼, 아니 다시 처음으로 하나 개의 값을 제거하는 유일한 목표는 다음 전화를 기다리고, 그렇지 않으면 한 장소에 머물 것이라고는 반복자가 고갈 값까지 다음 방법으로 생산 반복하는 것입니다 다음, 당신은 다시 같은 개체의 반복을 원하는 경우 같은 반복자를 사용하여 두 개 이상의 사이클이있는 경우, 당신은 새로운 반복자 객체를 생성하는 ITER 방법을 기억에만 수, 필연적으로 만 재활용 값을 취할 수있을 것입니다.

3. 발전기

빌더에서는 사용자 정의 반복자를 얻을 수있는 사용자 정의 반복자이며,

3.1 사용자 정의 반복자

함수의 존재 수율 키워드되면, 함수 호출 기능 부재 리턴 코드를 생성하는 목적을 수행하지 않는, 즉, 반복기 맞춤 발생기

def func():
    print('第一次')
    yield 1
    print('第二次')
    yield 2
    print('第三次')
    yield 3
    print('第四次')
g=func()
# 会触发函数体代码的运行,然后遇到yield停下来,将yield后的值
# 当做本次调用的结果返回
res1=g.__next__()
print(res1)#第一次  1
res2=g.__next__()
print(res2)
res3=g.__next__()
print(res3)
res4=g.__next__()#StopIteration

3.2 응용 프로그램

#自定义range函数
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.3 요약

항복 키워드로, 우리는 자기 정의 반복자를 달성 할 수있는 방법이있다. 수율은 값을 반환하는 데 사용할 수 있지만, 종료 후 반환 달리, 함수 반환이 발생하고, 수율은 여러 값을 반환 일시 정지 기능을 실행중인 상태 기능을 유지할 수 있습니다

추천

출처www.cnblogs.com/Henry121/p/12560785.html