Python篇:高级特性,模块与包练习

题目

  • 1.请你创建一个装饰器, 功能实现函数运行时自动产生日志记录。
  • 2.斐波那契数列的装饰器练习: 实现高速缓存递归
    • 装饰器 1: 添加高速缓存的装饰器 num_cache
    • 装饰器 2: 程序运行计时器的装饰器 timeit
  • 3.Leetcode 字符串练习题目:比较版本号
  • 4.模块与包练习题: 微信好友数据分析与展示

1.请你创建一个装饰器, 功能实现函数运行时自动产生日志记录。

日志格式如下:
程序运行时间 主机短名 程序名称: 函数[%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='男')

Python篇:高级特性,模块与包练习_第1张图片
文件内容:
在这里插入图片描述

2.斐波那契数列的装饰器练习: 实现高速缓存递归

装饰器 1: 添加高速缓存的装饰器 num_cache

如果第一次计算 F(5) = F(4) + F(3) = 5
第二次计算 F(6) = F(5) + F(4)
显然 F(5)已经计算过了, F(4)也已经计算了, 我们可否添加一个装饰器, 专门用
来存储 费波那契数列已经计算过的缓存, 后期计算时, 判断缓存中是否已经计算过了, 如
果计算过,直接用缓存中的计算结果. 如果没有计算过, 则开始计算并将计算的结果保存在缓
存中.

装饰器 2: 程序运行计时器的装饰器 timeit

该装饰器用来测试有无高速缓存求斐波那契数列, 它们两者运行的时间效率高低.

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)

Python篇:高级特性,模块与包练习_第2张图片

3.Leetcode 字符串练习题目:比较版本号

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))

Python篇:高级特性,模块与包练习_第3张图片
Python篇:高级特性,模块与包练习_第4张图片
Python篇:高级特性,模块与包练习_第5张图片
Python篇:高级特性,模块与包练习_第6张图片
Python篇:高级特性,模块与包练习_第7张图片

4.模块与包练习题: 微信好友数据分析与展示

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()

Python篇:高级特性,模块与包练习_第8张图片
文件内容:(个别好友没有备注名,默认是空字符)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
条形图:
Python篇:高级特性,模块与包练习_第9张图片
Python篇:高级特性,模块与包练习_第10张图片
封装模块并发布:
Python篇:高级特性,模块与包练习_第11张图片
Python篇:高级特性,模块与包练习_第12张图片

你可能感兴趣的:(Python练习,装饰器,itchat,模块封装与发布,pyecharts,Bar)