pyhton第四周小测

这篇博客涵盖了多个Python编程主题:设计一个记录日志的装饰器,用于自动记录函数运行信息并保存到file.log;使用itchat库分析微信好友的省份分布,并用pyecharts展示前5个最多好友的省份;解决LeetCode的版本号比较问题;最后介绍了两个装饰器,一个是实现斐波那契数列的高速缓存,另一个是程序运行计时器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.微信好友数据分析与展示

  1. 已知 itchat 可以获取好友的信息, 此处统计好友的省份分布;
  2. 获取分布好友最多的 5 个省份;
  3. 将省份分布的数量基于 pyecharts 模块以条形图的方式展示;
    附加需求: 将每个省份的好友备注名(RemarkName)存入依次存入对应省份的文
    件中;
    e.g.
    文件: 陕西省.txt
    文件: 山东省.txt
  4. 将上述 编写的代码封装为模块, 并实现模块的制作与发布;
#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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值