• 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) 
  • 相关阅读:
    MVC4中常用的短句及配置归结(部分)
    结合EF5.0讲MVC4(四)将我们的程序改成数据库优先模式
    结合EF5.0讲MVC4(二)为先前程序添加查询及主外键关系
    【译】《Pro ASP.NET MVC4 4th Edition》第二章(一)
    XtraReport应用(1)(XtraReport From File)
    结合EF5.0讲MVC4(一)创建一个MVC4应用程序
    Scrum实际应用(一)
    结合EF5.0讲MVC4(三)为我们的程序添加过滤器
    C# LINQ详解(一)
    如何在 Windows Server 2008 上打开 SQL Server 防火墙端口
  • 原文地址:https://www.cnblogs.com/dingbei/p/12562804.html
Copyright © 2020-2023  润新知