有参装饰器迭代器作业

# 1、编写课上讲解的有参装饰器准备明天默写

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
            elif db_type == 'mysql':
                print('基于mysql的验证')
            elif db_type == 'ldap':
                print('基于ldap的验证')
            else:
                print('不支持该db_type')
        return wrapper
    return deco

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

@auth(db_type='mysql')
def home(name):
    print(name)

@auth(db_type='ldap')
def transfer():
    print('transfer')

  2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作

dic = {}
def add_dic(key,value):
    def outter(func):
        def wrapper(*args,**kwargs):
            dic[key]=value
            res = func(*args,**kwargs)
            return res
        return wrapper
    return outter
@add_dic('1',['login','登入'])
def login():
    pass
@add_dic('2',['regist','注册'])
def regist():
    pass
@add_dic('3',['check_money','查询余额'])
def check_money():
    pass
login()
regist()
check_money()
print(dic)

3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定

import time

src = None
def ouutar(func):
    def wrapper(*args,**kwargs):
        global src
        if src == None:
            inp_src = input('输入文件路径')
            src = inp_src
        res = func(*args,**kwargs)
        with open(inp_src,'at',encoding='utf-8') as f:
            f.write('{} f1 run'.format(time.strftime('%Y-%m-%d %X')))
            print('写入成功')
        return res
    return wrapper
@ouutar
def f1():
    pass
f1()

4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象

def a(obj_iterator):
    while True:
        try:
            print(obj_iterator.__next__())
        except StopIteration:
            break

a('123'.__iter__())
a([1,2,3].__iter__())
a({1:'a',2:'b'}.__iter__())
a((1,2,3).__iter__())
a({1,2,3}.__iter__())
with open('a.txt','rt',encoding='utf-8')as f:
    a(f.__iter__())

5、自定义迭代器实现range功能

def my_range(start, stop, step=1):
    while start < stop:
        yield start
        start += step


for i in my_range(0,5):
    print(i)

猜你喜欢

转载自www.cnblogs.com/bk134/p/12560798.html