zoukankan      html  css  js  c++  java
  • python基础学习-day18==课后作业练习(有参装饰器+迭代器)

    今日作业:

    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)  # 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')

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

    #func_dic = {'1': login, '2': register}
    func_dic = {}
    
    # 有参装饰器  x接收的是用户输入功能对应的编号
    def outer(x):  # x ---> '1'
        # 无参装饰器
        def wrapper(func):  # func --> login, func --> register
            func_dic[x] = func  # {'1': login, '2': register}
            def inner(*args, **kwargs):
                res = func(*args, **kwargs)
                return res
            return inner
        return wrapper
    
    
    @outer('1')  # ---> @wrapper
    def login():
        pass
    
    @outer('2')
    def register():
        pass
    
    print(func_dic)
    3、编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定

    注意:时间格式的获取(import time # time.strftime('%Y-%m-%d %X'))

     

    import time
    
    # 给被装饰对象添加执行日志装饰器
    def add_log_wrapper(func):
        def inner(*args, **kwargs):
            # 在被装饰对象调用前的操作
            # 1) 将被装饰对象的执行日志 写入 log.txt文件中
            with open('log.txt', 'a', encoding='utf-8') as f:
                now_time = time.strftime('%Y-%m-%d %X')
                func_name = func.__name__
                log_str = f'{now_time} {func_name} run
    '
                print(log_str)
                f.write(log_str)
            res = func(*args, **kwargs)  # 被装饰对象的调用
            # 在被装饰对象调用后的操作
            return res
        return inner
    
    @add_log_wrapper
    def f1():
        time.sleep(10)
        print('我是f1函数的执行...')
    
    @add_log_wrapper
    def f2():
        print('我是f2函数的执行')
    f1()
    f2()

     

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

    def my_iter(obj):  # 字符串、列表、元组、字典、集合、文件
        iter_obj = obj.__iter__()   # 'tank'.__iter__()
        while True:
            try:
                print(iter_obj.__next__())
    
            except StopIteration:
                break
    
    my_iter('tank')
    5、自定义迭代器实现range功能
    def my_range(start, end, step=1):
        while start < end:
            yield start
            start += step
    
    line=my_range(1,10,2)#python3里面range返回值range(1,10,2),所以需要for遍历打印出数据才可以
    for i in line:
        print(i) 
  • 相关阅读:
    基于摸板匹配的目標跟蹤算法
    spoj 2713 Can you answer these queries IV
    zoj 3633 Alice's present
    hdu 3642 Get The Treasury
    poj 1195 Mobile phones
    poj 2760 End of Windless Days
    zoj 3540 Adding New Machine
    spoj 1716 Can you answer these queries III
    spoj 1043 Can you answer these queries I
    spoj 2916 Can you answer these queries V
  • 原文地址:https://www.cnblogs.com/dingbei/p/12562804.html
Copyright © 2011-2022 走看看