python之道15
-
请实现一个装饰器,限制该函数被调用的频率,如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()
-
请写出下列代码片段的输出结果:
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,淘宝超市
5,退出程序
-
四个函数都加上认证功能,用户可任意选择,用户选择京东超市或者京东首页,只要输入一次京东账号和密码并成功,则这两个函数都可以任意访问;用户选择淘宝超市或者淘宝首页,只要输入一次淘宝账号和密码并成功,则这两个函数都可以任意访问.
相关提示:用带参数的装饰器。装饰器内部加入判断,验证不同的账户密码。
答案
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()
-
用递归函数完成斐波那契数列(面试题):
斐波那契数列: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.
-
给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]