python学习18——课后练习

# 作业:
# 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:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,
# 在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作
info = {}


def make_dic(func):
    def wrapper(*args, **kwargs):
        res = func(*args, **kwargs)
        name = func.__name__
        info[name] = func
        return res

    return wrapper


@make_dic
def transfer():
    print('transfer')


@make_dic
def login():
    print('login')


transfer()
login()
print(info)
info['transfer']()  # 从字典里用key来调用函数
'''结果:
transfer
login
{'transfer': <function transfer at 0x100c829d0>, 'login': <function login at 0x100c82a60>}
transfer

Process finished with exit code 0
'''

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


def log_v(path):
    def add_log(func):
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            with open(path, 'ab')as log_f:
                log_f.write('{} {} run\n'.format(time.strftime('%Y-%m-%d %X'), func.__name__).encode('utf-8'))
            return res

        return wrapper

    return add_log


@log_v('record.log')
def func1():
    print('func1执行')
func1()
'''
结果:
record.log中内容
2020-03-24 18:28:31 func1 run
2020-03-24 18:28:33 func1 run
2020-03-24 18:28:34 func1 run

'''

# 4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象
def while_get(obj):
    obj_iterator=obj.__iter__()
    while True:
        try:
            print(obj_iterator.__next__())
        except StopIteration:
            break
while_get('123')
while_get([1,2,3,4])
while_get((1,2,3))
while_get({'1':1,'2':2})
while_get({1,2,3})
with open('record.log', 'rb')as f:
    while_get(f)
'''
结果:
1
2
3
1
2
3
4
1
2
3
1
2
1
2
3
b'2020-03-24 18:28:31 func1 run\n'
b'2020-03-24 18:28:33 func1 run\n'
b'2020-03-24 18:28:34 func1 run\n'
'''

# 5、自定义迭代器实现range功能
def myrange(start,end,step=1):
    while (start<end):
        yield start
        start+=step

for i in myrange(1,7,2):
    print(i)
'''
1
3
5

'''

猜你喜欢

转载自www.cnblogs.com/heirenxilou/p/12560833.html