每日一练——Python基础(五)

  • 给每个函数写一个记录日志的功能,要求,每次一调用函数之前,都要将函数名称,时间节点记输出。

    请使用strftime()获取年月日时分秒。函数名:fn.__name__

import time
import functools

def strftime(fn):
    @functools.wraps(fn)
    def wrapper(*args,**kwargs):
        whenbegin = time.time()
        s = fn(*args,**kwargs)
        whenend = time.time()
        print('[现在的时间是:%s] 函数名:%s,运行时间:%.6f,运行返回值结果:%d' %(time.ctime(),
                                                   fn.__name__,whenbegin - whenend,s))
        return s
    return wrapper

@strftime
def add(s1,s2):
    time.sleep(1)
    return s1+s2

print(add(1,10))

  • 编写装饰器,在每次执行目标函数之前先让用户输入用户名和密码,给用户三次机会,登录成功才能访问目标函数。

def login(fun1):
    def inner(*args, **kwargs):
        num = 3
        while num:
            name = input('请输入用户名:').strip()
            password = input('请输入密码:')
            if name == '1925060156' and password == '123456':
                print('登录成功')
                fun1()
                break
            else:
                if num != 1:
                    print('用户名或密码错误,请重新输入(还有{}次机会)!'.format(num - 1))
                num -= 1

        if num == 0:
            print('你已用完了三次机会,请改天登录')

    return inner


@login
def read():
    print('''    ◢█★█◣   /   
╭  ̄  ̄ ╮         ╭  ̄  ̄ ╮  
/  ╭ ̄ ╮  ̄ ̄ ̄ ̄ ̄ ̄ ̄/ ╭  ̄╮   
 ╰╯ |          | ╰╯   /.  
╰ __ ╯ / ̄\  / ̄\ ╰ __ ╯  
    |            |   
    \   ╰^╯    /  
     ╰ ?_____ ╯  ''')

@login
def write():
    print('这个能不能实现')

read()
write()

  • 编写装饰器,为多个函数加上登录认证功能,(用户有3次登录机会), 要求,如果登录成功了,后续就不用再登录了。

user.py

user={
    'account1':False,
    'users':'1925060156',
    'init':'123456'}
from user import *

def login(fn):
    def inner(*args,**kwargs):
        if user['account1']==False:
            num = 0
            while num<3:
                username=input("请输入用户名:")
                password=input("请输入密码:")
                if username==user['users'] and password==user['init']:
                    print("登陆成功~")
                    user['user_is_login']=True
                    ret=fn(*args,**kwargs)
                    return inner
                else:
                    print("登录失败!")
                    num=num+1
            print("三次机会已使用完毕,无法登录!")
    return inner


@login
def read():
    print('''ヽ(ˋДˊ)ノ 
ヽ(ˋ▽ˊ)ノ 
°(°ˊДˋ°) ° 
┑( ̄▽  ̄)┍ 
┑( ̄Д  ̄)┍ 
┑( ̄。。 ̄)┍ 
╮(╯Д╰)╭ 
╮(╯▽╰)╭ 
(≧﹏ ≦) 
( ̄ε  ̄)''')

@login
def write():
    print('这个可不可以一次性出来')

read()
write()

  • 三合一总结版本:
def deco1(func):
    def record(*args,**kwargs):
        import time
        print('函数名称:',func.__name__)
        print('调用时间节点:',time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time())))
        func(*args,**kwargs)
    return record

def deco2(func):
    def register(*args,**kwargs):
        m = 3
        for i in range(1, 4):
            name = input('请输入用户名:')
            pwd = input('请输入密码:')
            if (name == 'admin' and pwd == '123'):
                print('成功登陆!')
                func(*args,**kwargs)
                break
            else:
                m = m - 1
                print('登陆失败请重新登陆,你还剩%d次机会' % m)
                if m == 0:
                    print('三次机会已经用完,请下次再试!')
    return register

def deco_isRegister(flag):
    def deco3(func):
        def register1(*args, **kwargs):
            if(flag==True):
                func(*args,**kwargs)
            else:
                m = 3
                for i in range(1, 4):
                    name = input('请输入用户名:')
                    pwd = input('请输入密码:')
                    if (name == 'admin' and pwd == '123'):
                        print('成功登陆!')
                        func(*args, **kwargs)
                        break
                    else:
                        m = m - 1
                        print('登陆失败请重新登陆,你还剩%d次机会' % m)
                        if m == 0:
                            print('三次机会已经用完,请下次再试!')
        return register1
    return deco3

@deco1
@deco2
# @deco_isRegister(False)
def hello():
    print('nijhao')
hello()

猜你喜欢

转载自blog.csdn.net/m0_48788975/article/details/121333779