python之道15

  1. 请实现一个装饰器,限制该函数被调用的频率,如10秒一次(借助于time模块,time.time())(面试题,有点难度,可先做其他)

    答案

    # 思路 运行不能用
    import time
    
    def wrapper(f):
        t = 0
        def inner(*args,**kwargs):
            nonlocal t
            if time.time() - t > 3:
                ret = f(*args,**kwargs)
                t = time.time()
                return ret
        return inner
    
    
    @wrapper
    def func():
        print('in func')
    
    方法一:
    import time
    
    def wrapper(s):
        def inner():
            with open("lasttime",encoding='utf-8',mode='r+')as f1:
                ret1 = f1.readlines()
                start = time.time()
    
                if start - float(ret1[-1]) > 10:
                    s()
                    end = time.time()
                    f1.write(f"{end}\n")
                else:
                    print(f"调用时间太频繁,还剩余{10 - int(start - float(ret1[-1]))}可以执行")
        return  inner
    
    @wrapper
    def test_time1():
        print("执行函数")
    test_time1()
    # 方法二
    def timmer(fun):
        count = 0
        def wrapper(*args, **kwargs):
            nonlocal count
            start_time = time.time()
            data = fun(*args, **kwargs)
            end_time = time.time()
            dt = end_time - start_time
            count += 1
            print(f"被调用{count}次,本次调用花费时间{dt}秒。")
            return data
        return wrapper
    @timmer
    def func():
        print("123")
        time.sleep(10)
    func()
    func()
    
  2. 请写出下列代码片段的输出结果:

def say_hi(func):
    def wrapper(*args,**kwargs):
        print("HI")
        ret=func(*args,**kwargs)
        print("BYE")
        return ret
    return wrapper

def say_yo(func):
    def wrapper(*args,**kwargs):
        print("Yo")
        return func(*args,**kwargs)
    return wrapper
@say_hi
@say_yo
def func():
    print("ROCK&ROLL")
func()

答案

HI
Yo
ROCK&ROLL
BYE
  1. 编写装饰器完成下列需求:
  2. 用户有两套账号密码,一套为京东账号密码,一套为淘宝账号密码分别保存在两个文件中。
  3. 设置四个函数,分别代表 京东首页,京东超市,淘宝首页,淘宝超市。
  4. 启动程序后,呈现用户的选项为:

​ 1,京东首页

​ 2,京东超市

​ 3,淘宝首页

​ 4,淘宝超市

​ 5,退出程序

  1. 四个函数都加上认证功能,用户可任意选择,用户选择京东超市或者京东首页,只要输入一次京东账号和密码并成功,则这两个函数都可以任意访问;用户选择淘宝超市或者淘宝首页,只要输入一次淘宝账号和密码并成功,则这两个函数都可以任意访问.

    相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。

    答案

    status = {'jd':False, 'taobao':False}
    user_dic = {}
    menu = {1:'京东首页', 2:'京东超市', 3:'淘宝首页', 4:'淘宝超市', 5:'退出程序'}
    for k,v in enumerate(menu,1):
            print(k,menu[v])
    
    
    def wrapper_out(n):
            def wrapper(f):
                    def inner(*args,**kwargs):
    
    
                                    if status[n] == True  :
                                                            ret = f(*args, **kwargs)
                                                            return ret
                                    else:
                                            user_input = input('请输入用户名: ').strip()
                                            pass_input = input('请输入密码: ').strip()
                                            with open(n,mode='r',encoding='utf-8') as f1:
                                                    for line in f1:
                                                            username,password = line.strip().split('|')
                                                            user_dic[username] = password
                                                            if user_input in user_dic and pass_input == password:
                                                                    status[n] = True
                                                                    ret = f(*args, **kwargs)
                                                                    return ret
                                                    return False
    
                    return inner
            return wrapper
    
    @wrapper_out('jd')
    def jd_index():
            print('京东首页')
    
    
    @wrapper_out('jd')
    def jd_chaoshi():
            print('京东超市')
    
    
    @wrapper_out('taobao')
    def taobao_index():
            print('淘宝首页')
    
    
    @wrapper_out('taobao')
    def taobao_chaoshi():
            print('淘宝超市')
    
    def func():
            while 1:
                    chiose = input('请选择序号: ').strip()
                    if chiose == '1':
                            jd_index()
                    elif chiose == '2':
                            jd_chaoshi()
                    elif chiose == '3':
                            taobao_index()
                    elif chiose == '4':
                            taobao_chaoshi()
                    elif chiose == '5':
                            exit()
    func()
    
  2. 用递归函数完成斐波那契数列(面试题):

斐波那契数列:1,1,2,3,5,8,13,21..........(第三个数为前两个数的和,但是最开始的1,1是特殊情况,可以单独讨论)

答案

def func(n):
        if n == 0:
                return n
        elif n == 1:
                return n
        else:
                return func(n-1) + func(n-2)

print(func(6))
# 输出结果
8

用户输入序号获取对应的斐波那契数字:比如输入6,返回的结果为8.

  1. 给l1 = [1,1,2,2,3,3,6,6,5,5,2,2] 去重,不能使用set集合(面试题)。

    答案

l1 = [1,1,2,2,3,3,6,6,5,5,2,2]
l2 = []
def func(n):
        for i in n:
                if n.count(i) >= 2:
                        if i not in l2:
                                l2.append(i)
        return l2

print(func(l1))
# 输出结果
[1, 2, 3, 6, 5]