• day18


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

    from functools import wraps
    def auth(db_type):
        @wraps
      	def deco(func):
            def wrapper(*args, **kwargs):
            		name = input('请输入用户名:').strip()
                password= input('请输入密码:').strip()
                if db_type == 'file':
                  	print('基于文件的验证!')
                    if name == 'egon' and password == '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('file')
    def index(x,y):
      	print('index-->%s,%s'%(x,y))
        
    @auth('mysql')
    def home(name):
      	print('home-->%s'%name)
        
    @auth('ldap')
    def transfer():
      	print('transfer')
        
    index(1,2)
    home('egon')
    transfer()
    
    
    结果展示:
    index-->1,2
    home-->egon
    transfer
    

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

    func_dic = {}
    count = 0
    def outter(func):
        def wrapper(*args, **kwargs):
            global count
            count += 1
            res = func(*args, **kwargs)
            if func.__name__ not in func_dic.values():
                func_dic[f'{count}'] = func.__name__
    
            return res
        return wrapper
    
    @outter
    def login():
        print('login...')
    
    
    @outter
    def check_balance():
        print('check_balance...')
    
    
    @outter
    def withdraw():
        print('withdraw...')
    
    login()
    check_balance()
    withdraw()
    login()
    print(func_dic)
    

    3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定
    注意:时间格式的获取
    import time
    time.strftime('%Y-%m-%d %X')

    import time
    from functools import wraps
    
    def tail_log(path):
        def outter(func):
            @wraps(func)
            def wrapper(*args, **kwargs):
                current_time = time.strftime('%Y-%m-%d %X')
                with open(path, 'a', encoding='utf-8')as f:
                    f.write(f'{current_time} {func.__name__} run
    ')
                res = func(*args, **kwargs)
                return res
            return wrapper
        return outter
    
    
    @tail_log(path='access.log')
    def f1():
        print('f1正在执行...')
    
    f1()
    
    结果展示:
    2020-03-24 16:14:41 f1 run
    

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

    def run(obj):
        obj_iterator = obj.__iter__()
        while True:
            try:
                print(next(obj_iterator), end=' ')
            except StopIteration:
                break
    
    
    str_obj = 'hello'
    list_obj = [1, 2, 3, 4]
    tuple_obj = (5, 6, 7, 8)
    dic_obj = {'name': 'egon', 'age': 18}
    set_obj = {10, 11, 12, 13}
    
    run(str_obj) #h e l l o
    run(list_obj) #1 2 3 4
    run(tuple_obj) #5 6 7 8
    run(dic_obj) #name age
    run(set_obj) #10 11 12 13
    
    with open('a.txt', 'r', encoding='utf-8')as f:
        run(f) 
       
    '''
    111
    222
    333
    '''
    

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

    def my_range(start, stop, step=2):
        while start < stop:
            yield start
            start += step
    
    g = my_range(0,5)
    print(g)
    res = next(g)
    print(res) #0
    res = next(g)
    print(res) #2
    res = next(g)
    print(res) #4
    res = next(g)
    print(res) #抛出异常
    
    
  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/xy-han/p/12560638.html
Copyright © 2020-2023  润新知