日志格式如下:
程序运行时间 主机短名 程序名称: 函数[%s]运行结果为[%s]
产生的日志文件并不直接显示在屏幕上, 而是保存在 file.log 文件中, 便于后期软件运行结果的分析.
import os
import time
import sys
def add_log(fun):
"""
用来添加日志,格式如下:
程序运行时间 主机短名 程序名称: 函数[%s]运行结果为[%s]
"""
def wrapper(*args, **kwargs):
# 程序开始的时间
start_time = time.time()
# 获取被装饰的函数的返回值
result = fun(*args, **kwargs)
# 程序结束的时间
end_time = time.time()
# 程序运行的时间
run_time = str('%.2f' % (end_time - start_time))
# 获取主机名 nodename='foundation0.ilt.example.com'
hostname = os.uname().nodename.split('.')[0]
# 运行的程序
process_full_name = sys.argv[0]
process_name = os.path.split(process_full_name)[-1]
# 获取函数名: 函数名.__name__
info = "函数[%s]的运行结果为%s" % (fun.__name__, result)
# 日志内容
log = " ".join([run_time, hostname, process_name, ':', info])
# 日志信息写入文件
#print(log)
with open('file.log', 'a') as f:
f.write(log)
f.write('\n')
return result
return wrapper
@add_log
def music():
time.sleep(1)
print("正在听音乐.....")
@add_log
def add(x, y):
time.sleep(1.5)
return x + y
@add_log
def roll(name, age, **kwargs):
print(name, age, kwargs)
res =add(1, 2)
print(res)
music()
roll(name='fentiao', age=10, province='陕西', gender='男')
如果第一次计算 F(5) = F(4) + F(3) = 5
第二次计算 F(6) = F(5) + F(4)
显然 F(5)已经计算过了, F(4)也已经计算了, 我们可否添加一个装饰器, 专门用
来存储 费波那契数列已经计算过的缓存, 后期计算时, 判断缓存中是否已经计算过了, 如
果计算过,直接用缓存中的计算结果. 如果没有计算过, 则开始计算并将计算的结果保存在缓
存中.
该装饰器用来测试有无高速缓存求斐波那契数列, 它们两者运行的时间效率高低.
import time
numCacheList = {}
runTime = 0
def numCache(func):
def wrapper(*args, **kwargs):
global numCacheList
if args in numCacheList:
result = numCacheList.get(args)
else:
result = func(*args, **kwargs)
numCacheList[args] = result
return result
return wrapper
def timeit(func):
def wrapper(*args, **kwargs):
global runTime
startTime = time.time()
result = func(*args, **kwargs)
endTime = time.time()
onceRunTime = endTime - startTime
runTime += onceRunTime
return result
return wrapper
@numCache
@timeit
def fibonacci(n):
time.sleep(0.1)
if n <= 2:
return 1
else:
return fibonacci(n - 1) + fibonacci(n - 2)
@timeit
def fibonacciNotNumCache(n):
time.sleep(0.1)
if n <= 2:
return 1
else:
return fibonacciNotNumCache(n - 1) + fibonacciNotNumCache(n - 2)
def text(func, n):
global runTime
runTime = 0
num = n
result = func(num)
print('第%d个斐波那契数是:%d\n本次计算用时:%.2f' % (num, result, runTime))
print('有缓存:')
text(fibonacci, 5)
text(fibonacci, 4)
print()
print('没有缓存:')
text(fibonacciNotNumCache, 5)
text(fibonacciNotNumCache, 4)
def versionCompare(a, b):
count = 0
aList = a.split('.')
bList = b.split('.')
minLen = min(len(aList), len(bList))
maxLen = max(len(aList), len(bList))
if len(aList) < len(bList):
for i in range(maxLen - minLen):
aList.append('0')
if len(bList) < len(aList):
for i in range(maxLen - minLen):
bList.append('0')
for i in range(maxLen):
if int(aList[i]) > int(bList[i]):
return 1
elif int(aList[i]) < int(bList[i]):
return -1
else:
count += 1
if count == maxLen:
return 0
version1 = input('请输入第一个版本号:')
version2 = input('请输入第二个版本号:')
print(versionCompare(version1, version2))
1.已知 itchat 可以获取好友的信息, 此处统计好友的省份分布;
2.获取分布好友最多的 5 个省份;
3.将省份分布的数量基于 pyecharts 模块以条形图的方式展示;
附加需求: 将每个省份的好友备注名(RemarkName)存入依次存入对应省份的文
件中;
e.g.
文件: 陕西省.txt
文件: 山东省.txt
4.将上述 编写的代码封装为模块, 并实现模块的制作与发布;
import itchat
from pyecharts import Bar
def getProvincialInfoAboutWechatFriend():
# 指定收集的好友分布城市为前5个
topNum = 5
# 各城市名及好友人数
friendCityInfo = {}
# 前五城市名及好友人数
cityTop5 = []
# 前五城市名及好友备注名
cityTop5NameInfo = {}
# 条形图x轴各城市名
cityTop5List = []
# 条形图y轴各城市人数
cityTop5FriendNumList = []
# 登陆,热加载
itchat.auto_login(hotReload=True)
# 获取所有好友信息
friendInfo = itchat.get_friends()
for i in friendInfo:
iCity = i.get('City')
# 各城市好友人数统计
friendCityInfo[iCity] = friendCityInfo.get(iCity, 0) + 1
# 排序统计结果
friengCityInfoSorted = sorted(friendCityInfo.items(), key=lambda x: x[1], reverse=True)
# 获取前五的城市和人数
for i in range(1, topNum + 1): # 未设置地区的人数最多,去掉
cityTop5.append(friengCityInfoSorted[i])
# 储存前五城市好友备注的字典初始化(value为列表)
for i in cityTop5:
cityTop5NameInfo[i[0]] = []
# 添加前五城市的好友备注
for i in friendInfo:
if i.get('City') in cityTop5NameInfo:
cityTop5NameInfo[i.get('City')].append(i.get('RemarkName'))
# 分城市存入文件
for i in cityTop5NameInfo:
fileName = i + '.txt'
with open(fileName, 'w') as f:
for j in cityTop5NameInfo[i]:
# 以空格分隔好友备注名
f.write(j + ' ')
# 绘制条形图
# 获取x,y轴信息列表
for i in cityTop5:
cityTop5List.append(i[0])
cityTop5FriendNumList.append(i[1])
bar = Bar('微信好友城市分布条形图')
bar.add(name='人数', x_axis=cityTop5List, y_axis=cityTop5FriendNumList)
bar.render('bar.html')
if __name__ == '__main__':
getProvincialInfoAboutWechatFriend()