python基础与高级特性(七、八):(练习)

一. 记录日志装饰器练习题
好的日志对一个软件的重要性是显而易见的。如果函数的入口都要写一行代码来记
录日志,这种方式实在是太低效了。 那么请你创建一个装饰器, 功能实现函数运
行时自动产生日志记录。 日志格式如下:
程序运行时间 主机短名
程序名称: 函数[%s]运行结果为[%s]
产生的日志文件并不直接显示在屏幕上, 而是保存在 file.log 文件中, 便于后期
软件运行结果的分析。

import time
import os
import sys
def decorator(fun):
    def wrapper(*args, **kwargs):
        result = fun(*args, **kwargs)
        now_time = time.ctime()
        hostname = os.uname().nodename.split('.')[0]
        process_full_name = sys.argv[0]
        process_name = os.path.split(process_full_name)[-1]
        info = '函数[%s]的运行结果为%s' %(fun.__name__, result)
        log = ' '.join([now_time, hostname, process_name, info])
        with open('file.log', mode='a') as f:
            print(f.write(log))
        return result
    return wrapper

@decorator
def roll(name, age, **kwargs):
    print(name, age, kwargs)

roll(name='fentiao', age=4, gender = 'male')

在这里插入图片描述
二. 斐波那契数列的装饰器练习: 实现高速缓存递归
在数学上,费波那契数列是以递归的方法来定义:
用文字来说,就是费波那契数列由 0 和 1 开始,之后的费波那契系数就是由之前的两数相
加而得出。首几个费波那契系数是:
0,1,1,2,3,5,8,13,21,34,55,89,144,233…(OEIS 中的数列 A000045)
装饰器 1: 添加高速缓存的装饰器 num_cache
如果第一次计算 F(5) = F(4) + F(3) = 5
第二次计算 F(6) = F(5) + F(4)
显然 F(5)已经计算过了, F(4)也已经计算了, 我们可否添加一个装饰器, 专门用
来存储 费波那契数列已经计算过的缓存, 后期计算时, 判断缓存中是否已经计算过了, 如
果计算过,直接用缓存中的计算结果. 如果没有计算过, 则开始计算并将计算的结果保存在缓
存中.
装饰器 2: 程序运行计时器的装饰器 timeit
该装饰器用来测试有无高速缓存求斐波那契数列, 它们两者运行的时间效率高低.
“”"

def num_cache(fun):
    def wrapper(*args):
        cacheList = []
        if args not in cacheList:
            cacheList.append(args)
            result = fun(*args)
            return result
    return wrapper
import time
def timeit(fun):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        result = fun(*args, **kwargs)
        end_time = time.time()
        print('运行时间为%s' %(start_time - end_time))
        return result
    return wrapper


@num_cache
@timeit
def fib(num):
    if(num<=2):
        return 1
    return fib(num - 1) + fib(num - 2)
result = fib(4)
result1 = fib(5)
result2 = fib(4)
print(result)
print(result1)
print(result2)
@num_cache
def fib(num):
    if(num<=2):
        return 1
    return fib(num - 1) + fib(num - 2)
result = fib(4)
result1 = fib(5)
result2 = fib(4)
print(result)
print(result1)
print(result2)

在这里插入图片描述
三.比较版本号

def compare(version1, version2):
    version = input('请输入版本号:')
    if len(version)!= 0:
        print('Error,请输入正确的版本号')
    else:

        if version1 > version1:
            return 1
        elif version1 < version2:
            return -1
        else:
            return 0

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

import itchat
import json
itchat.auto_login(hotReload=True)
friends = itchat.get_friends()
with open("friends.txt", 'w') as f:
    f.write(json.dumps(friends, indent = 2, ensure_ascii=False))
dict_province = dict()
for friend in friends:
    key = friend['Province']
    value = friend['RemmarkName']
    if key not in dict_province.keys():
        dict_province[key] = 1
    else:
        dict_province[key] += 1
        key_list = []
        value_list = []
        for key, value in dict_province.items():
            if key == "":
                key = "其他地区"
        key_list.append(key)
        value_list.append(value)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值