zoukankan      html  css  js  c++  java
  • 3.24迭代器生成器作业

    编写课上讲解的有参装饰器

    def auth(db_type):
        def wrapper(func):
            def inner(*args, **kwargs):
                name = input('name: ').strip()
                pwd = input('pwd: ').strip()
    
                if db_type == 'file':
                    print('文件验证登录')
                    if (name, pwd) == ('egon', '123'):
                        print('登录成功')
                        res = func(*args, **kwargs)
                        return res
                    else:
                        print('用户名或密码错误')
    
                elif db_type == 'file':
                    print('文件验证登录')
                    if (name, pwd) == ('egon', '123'):
                        print('登录成功')
                        res = func(*args, **kwargs)
                        return res
                    else:
                        print('用户名或密码错误')
    
            return inner
        return wrapper
    
    
    @auth('file')
    def index():
        print('123')
    
    
    index()
    

      

    还记得我们用函数对象的概念,制作一个函数字典的操作吗

    来来来,我们有更高大上的做法,在文件开头声明一个空字典

    然后在每个函数前加上装饰器,完成自动添加到字典的操作

    cmd_dict = {}
    
    def append2dict(tips):
        def wrapper(func):
            def inner(*args, **kwargs):
                index = len(cmd_dict) + 1
                cmd_dict[str(index)] = (tips, func)
            return inner
        return wrapper
    
    
    def auto_append():
        my_func = {k: v for k, v in globals().items() if callable(v) if k not in {'append2dict', 'auto_append'}}
        for func in my_func.values():
            func()
    
    
    @append2dict(tips='登录')
    def login():
        print('this is login')
    
    
    @append2dict('注册')
    def register():
        print('this is register')
    
    
    
    auto_append()
    
    while 1:
        for k, v in cmd_dict.items():
            print(f'{k}-{v[0]}'.center(20, '-'))
    
        cmd = input('请输出编号:').strip()
        if cmd not in cmd_dict:
            print('重新输入')
            continue
        func = cmd_dict.get(cmd)[1]
        func()
    

      

    编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定。注意:时间格式的获取

    import time
    
    def my_log(file_path):
        def wrapper(func):
            def inner(*args, **kwargs):
                now = time.strftime('%Y-%m-%d %H:%M:%S')
                msg = f'{now} {func.__name__} run
    '
                with open(file_path, 'at', encoding='utf-8') as f:
                    f.write(msg)
    
                res = func(*args, **kwargs)
                return res
            return inner
        return wrapper
    
    @my_log('log.txt')
    def f1():
        print('i am f1')
    
    f1()
    

      

    4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
    my_obj = '2333'
    my_obj_i = my_obj.__iter__()
    while True:
        try:
            print(my_obj_i.__next__())
        except StopIteration:
            break
    

      

    my_obj = [1,2,3]
    my_obj_i = my_obj.__iter__()
    while True:
        try:
            print(my_obj_i.__next__())
        except StopIteration:
            break
    

      

    my_obj = (4,5,6)
    my_obj_i = my_obj.__iter__()
    while True:
        try:
            print(my_obj_i.__next__())
        except StopIteration:
            break
    

      

    my_obj = {1:1, 2:2, 3:3}
    my_obj_i = my_obj.__iter__()
    while True:
        try:
            print(my_obj_i.__next__())
        except StopIteration:
            break
    

      

    my_obj = {1,2,3}
    my_obj_i = my_obj.__iter__()
    while True:
        try:
            print(my_obj_i.__next__())
        except StopIteration:
            break
    

      

    with open('aaa.txt', mode='rt', encoding='utf-8')
        while True:
            try:
                print(f.__next__())
            except StopIteration:
                break
    

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

    def my_range(start, end, step=1):
        while start < end:
            yield start
            start += step
    
    
    g = my_range(1,5)
    
    for i in g:
        print(i)
    

      

  • 相关阅读:
    使用vue自定义组件以及动态时间
    vue案列
    解决adb devices无法连接夜神模拟器
    手动解除浏览器跨域限制
    HBuilder实现WiFi调试Android
    Spring mvc文件下载
    3大框架Struts、Hibernate、Spring简单了解
    简单了解ajax
    使用本地计划任务定时关闭azure虚拟机
    调整虚拟机的尺寸
  • 原文地址:https://www.cnblogs.com/Tornadoes-Destroy-Parking-Lots/p/12562302.html
Copyright © 2011-2022 走看看