1.记录日志装饰器
创建一个装饰器, 功能实现函数运行时自动产生日志记录。 日志格式如下:
程序运行时间 主机短名 程序名称: 函数[%s]运行结果为[%s]
产生的日志文件并不直接显示在屏幕上, 而是保存在 file.log 文件中
import time
import os
import sys
def add_log(fun):
def warpper(*args,**kwargs):
start_time = time.time()
result= fun()
end_time = time.time()
#获取程序运行时间
run_time =start_time - end_time
#主机短名
hostname = os.uname().nodename.split('.')[0]
#程序名称
process_full_name = sys.argv[0]
process_name = os.path.split(process_full_name)[-1]
#函数[%s]运行结果[%s]
info = '函数[%s]运行结果[%s]' %(fun.__name__,result)
#整合要显示的日志信息
log_mess = ''.join([run_time,hostname,process_name,info])
#将日志信息保存到文件file.log文件中
with open('file.log','w') as f:
f.write(log_mess)
return result
return warpper
@add_log
def fun():
print('这是程序运行的结果')
fun()
2.微信好友数据分析与展示
- 已知 itchat 可以获取好友的信息, 此处统计好友的省份分布;
- 获取分布好友最多的 5 个省份;
- 将省份分布的数量基于 pyecharts 模块以条形图的方式展示;
附加需求: 将每个省份的好友备注名(RemarkName)存入依次存入对应省份的文
件中;
e.g.
文件: 陕西省.txt
文件: 山东省.txt - 将上述 编写的代码封装为模块, 并实现模块的制作与发布;
#encoding:utf-8
import itchat
import sys
from pyecharts import Bar
#登录微信
itchat.auto_login(hotReload=True)
#获取好友列表
myfriends = itchat.get_friends(update=True)[:]
#创建一个字典用来存储好友所在省份的以及有多少好友在该省份 {'陕西':1}
prov_dict = {}
for info in myfriends[1:]:
prov = info['Province']
if prov not in prov_dict.keys():
prov_dict[prov] =1
elif prov in prov_dict.keys():
prov_dict[prov] +=1
#删除key值为空字符的键值,空字符代表好友没有填写省份信息
del prov_dict['']
#获取排名前五位的省份
prov_dict_top5 = sorted(prov_dict.items(),key =lambda x:x[1],reverse=True)[0:5]
#把每个省份的好友备注名一次存入对应身份的文件中
for item in prov_dict_top5:
for info in myfriends[1:]:
if item[0] in info.values():
name = info['RemarkName']
with open('%s.txt' %item[0],'a+',encoding="utf-8") as f:
f.writelines(name+'\n')
print(prov_dict_top5)
prov_list = []
count_list = []
for i in prov_dict_top5:
prov_list.append(i[0])
count_list.append(i[1])
#将省份分布数量以条形图的方式展示
bar = Bar('微信好友省份分布','取分前五的省份')
bar.add('省份',[prov_list[0],prov_list[1],prov_list[2],prov_list[3],prov_list[4]],[count_list[0],count_list[1],count_list[2],count_list[3],count_list[4]])
#bar.add('省份',[i[0] for i in prov_dict_top5],[i[0] for i in prov_dict_top5])
bar.render('./provpic.html')
3. Leetcode 字符串练习题目: : 比较版本号
思路:当两个版本号长度不一致时,补全较短的版本号,然后再逐个数字进行比较
class Solution:
def compareVersion(self, version1: str, version2: str) -> int:
list_version1 = version1.split('.')
list_version2 = version2.split('.')
version1_len = len(list_version1)
version2_len = len(list_version2)
num = max(version1_len,version2_len)
num1= abs(version1_len-version2_len)
for i in range(num1):
if version1_len>version2_len:
list_version2.append('0')
elif version1_len<version2_len:
list_version1.append('0')
for i in range(num):
if (int(list_version1[i])) == (int(list_version2[i])):
i+=1
continue
elif (int(list_version1[i])) > (int(list_version2[i])):
return 1
else:
return -1
else:
return 0
4. 斐波那契数列的装饰器练习: : 实现高速缓存递归
装饰器 1 : 添加高速缓存的装饰器 num_cache
如果第一次计算 F(5) = F(4) + F(3) = 5
第二次计算 F(6) = F(5) + F(4)
显然 F(5)已经计算过了, F(4)也已经计算了, 我们可否添加一个装饰器, 专门用
来存储 费波那契数列已经计算过的缓存, 后期计算时, 判断缓存中是否已经计算过了, 如果计算过,直接用缓存中的计算结果费波那契数列已经计算过的缓存, 后期计算时, 判断缓存中是否已经计算过了, 如果计算过,直接用缓存中的计算结果. 如果没有计算过, 则开始计算并将计算的结果保存在缓存中如果没有计算过, 则开始计算并将计算的结果保存在缓存中。
装饰器 2 : 程序运行计时器的装饰器 timeit
该装饰器用来测试有无高速缓存求斐波那契数列, 它们两者运行的时间效率高低.
"""
题目:斐波那契数列的装饰器练习:实现高速缓存递归
"""
import time
#缓存器
def num_cache(fun):
dict_cache = {}
def warpper1(*args):
if args not in dict_cache:
dict_cache[args] = fun(*args)
return dict_cache[args]
return warpper1
#时间
def timeit(fun):
def warpper2(*args,**kwargs):
start_time = time.time()
result = fun(*args,**kwargs)
end_time = time.time()
print("程序执行时间为:%f" % (end_time - start_time))
return result
return warpper2
@num_cache
@timeit
def fibo(n):
if n<=2:
return 1
else:
return (fibo(n-1) + fibo(n-2))
while 1 :
while True:
n = int(input('enter your number:'))
if n == 'quit':
break
else:
print("斐波那契数列第n项为:", fibo(n))