广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python第五周 学习笔记(2)
  • 747
分享到

Python第五周 学习笔记(2)

学习笔记Python 2023-01-31 06:01:07 747人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

一、实现一个cache装饰器,实现可过期被清除的功能 简化设计,函数的形参定义不包含可变位置参数、可变关键词参数和keyWord-only参数 可以不考虑缓存满了之后的换出问题 1)原始 def cache(fn): imp


一、实现一个cache装饰器,实现可过期被清除的功能

  • 简化设计,函数的形参定义不包含可变位置参数、可变关键词参数和keyWord-only参数
  • 可以不考虑缓存满了之后的换出问题

    1)原始

def cache(fn):
    import inspect

    local_cache = {}

    def wrapper(*args, **kwargs):
        sig = inspect.signature(fn)
        params = sig.parameters

        param_names = list(params.keys())
        temp_dict = {}

        #处理位置参数
        for k, v in enumerate(args):
            temp_dict[param_names[k]] = v

        #更新关键字参数值
        temp_dict.update(kwargs)

        #更新默认值
        for k, v in params.items():
            temp_dict[k] = v.default

        #排序生成元组
        temp_tuple = tuple(sorted(temp_dict.items()))

        if temp_tuple not in local_cache.keys():
            local_cache[temp_tuple] = fn(*args, **kwargs)

        return local_cache[temp_tuple]
    return wrapper

import time
@cache
def add(x, y, z): 
    time.sleep(2)
    return x + y + z

2)加入过期判断

import inspect
from datetime import datetime
def cache(duration):
    def _cache(fn):
        local_cache={}

        def wrapper(*args, **kwargs):

            def expire_cache(cache:dict):
                expire_list = []

                for k,(_,stamp)  in cache.items():
                    delta = (datetime.now().timestamp() - stamp)

                    if delta > duration:
                        expire_list.append(k)

                for k in expire_list:
                    cache.pop(k)

            expire_cache(local_cache)

            sig=inspect.signature(fn)
            params=sig.parameters

            param_names=list(params.keys())
            param_dict={}

            for k,v in enumerate(args):
                param_dict[param_names[k]] = v

            param_dict.update(kwargs)

            for k, v in params.items():
                if k not in param_dict.keys():
                    param_dict[k] = v.default

            param_keys=tuple(sorted(param_dict.items()))

            if param_keys not in local_cache.keys():
                local_cache[param_keys]=(fn(*args,**kwargs), datetime.now().timestamp())

            return local_cache[param_keys][0]
        return wrapper
    return _cache

二、写一个命令分发器

  • 程序员可以方便的注册函数到某一个命令,用户输入命令时,路由到注册的函数
  • 如果此命令没有对应的注册函数,执行默认函数
  • 用户输入用input(">>")
def cmd_dispatcher(): #封装
    cmd_dict = {}

    def reg(cmd):
        def _reg(fn):
            cmd_dict[cmd] = fn
            return fn
        return _reg

    @reg('default_func')
    def default_func():
        print('default')
        return

    def dispatcher():
        while True:
            cmd = input('>>')
            if cmd == 'quit':
                return
            cmd_dict.get(cmd, default_func)()

    return reg, dispatcher #封装

reg, dispatcher = cmd_dispatcher() #封装&解构

@reg('add')
def add(): #add=reg('add')(add)
    print(1)
    return

dispatcher()

广度优先遍历

  • 层序遍历,按照树的层次,从第一层开始,自左向右遍历元素

Python第五周 学习笔记(2)

深度优先遍历

  • 设树的根结点为D,左子树为L,右子树为R,且要求L一定在R之前,则有下面几种遍历方式:
    • 前序遍历,也叫先序遍历、也叫先根遍历,DLR
    • 中序遍历,也叫中根遍历,LDR
    • 后序遍历,也叫后根遍历,LRD
  • 遍历序列:将树中所有元素遍历一遍后,得到的元素的序列。将层次结构转换成了线性结构

前序遍历DLR

  • 从根结点开始,先左子树后右子树
  • 每个子树内部依然是先根结点,再左子树后右子树。递归遍历
  • 遍历序列
    • A BDGH CEIF
      Python第五周 学习笔记(2)

中序遍历LDR

  • 从根结点的左子树开始遍历,然后是根结点,再右子树
  • 每个子树内部,也是先左子树,后根结点,再右子树。递归遍历
  • 遍历序列
    • 左图
    • GDHB A IECF
    • 右图
    • GDHB A EICF
      Python第五周 学习笔记(2)

后序遍历LRD

  • 先左子树,后右子树,再根结点
  • 每个子树内部依然是先左子树,后右子树,再根结点。递归遍历
  • 遍历序列
    • GHDB IEFC A
      Python第五周 学习笔记(2)

堆Heap

  • 堆是一个完全二叉树
  • 每个非叶子结点都要大于或者等于其左右孩子结点的值称为大顶堆
  • 每个非叶子结点都要小于或者等于其左右孩子结点的值称为小顶堆
  • 根结点一定是大顶堆中的最大值,一定是小顶堆中的最小值

大顶堆

  • 完全二叉树的每个非叶子结点都要大于或者等于其左右孩子结点的值称为大顶堆
  • 根结点一定是大顶堆中的最大值

小顶堆

  • 完全二叉树的每个非叶子结点都要小于或者等于其左右孩子结点的值称为小顶堆
  • 根结点一定是小顶堆中的最小值

理论实现

1、构建完全二叉树

  • 待排序数字为 30,20,80,40,50,10,60,70,90
  • 构建一个完全二叉树存放数据,并根据性质5对元素编号,放入顺序的数据结构
  • 构造一个列表为[0,30,20,80,40,50,10,60,70,90]

2、构建大顶堆——核心算法

  • 度数为2的结点A,如果它的左右孩子结点的最大值比它大的,将这个最大值和该结点交换
  • 度数为1的结点A,如果它的左孩子的值大于它,则交换
  • 如果结点A被交换到新的位置,还需要和其孩子结点重复上面的过程
2.1 构建大顶堆——起点结点的选择
  • 从完全二叉树的最后一个结点的双亲结点开始,即最后一层的最右边叶子结点的父结点开始结点数为n,则起始结点的编号为n//2(性质5)
2.2 构建大顶堆——下一个结点的选择
  • 从起始结点开始向左找其同层结点,到头后再从上一层的最右边结点开始继续向左逐个查找,直至根结点
2.3 大顶堆的目标
  • 确保每个结点的都比左右结点的值大

3、排序

  • 将大顶堆根结点这个最大值和最后一个叶子结点交换,那么最后一个叶子结点就是最大值,将这个叶子结点排除在待排序结点之外
  • 从根结点开始(新的根结点),重新调整为大顶堆后,重复上一步

图片摘自Wiki
Python第五周 学习笔记(2)

代码实现

1.打印树结构(非必要,方便查看每步操作对树结构的改变)

1)方法一 居中对齐

def show_tree(lst, unit_width=2):
    from math import log2, ceil

    length = len(lst)
    depth = ceil(log2(length + 1))
    width = 2 ** depth - 1
    index= 0

    for i in range(depth):
        for j in range(2 ** i):
            print('{:^{}}'.fORMat(lst[index], width * unit_width), end = ' ' * unit_width)

            index += 1
            if index >= length:
                break
        width //= 2
        print()

2)方法二 投影栅格实现

from math import ceil, log2

#投影栅格实现
def print_tree(array):
    '''
    '''
    index = 1
    depth = ceil(log2(len(array)))
    sep = ' '
    for i in range(depth):
        offset = 2 ** i
        print(sep * (2 ** (depth - i -1) - 1), end = '')
        line = array[index : index + offset]
        for j, x in enumerate(line):
            print("{:>{}}".format(x, len(sep)), end = '')
            interval = 0 if i == 0 else 2 ** (depth - i) - 1
            if j < len(line) - 1:
                print(sep * interval, end = '')

        index += offset
        print()

2.堆排序实现

def heap_sort(lst:list):
    '''
    堆排序

    :type lst: list
    :rtype: list
    '''
    length = len(lst)
    lst.insert(0,0) # 前插0为了索引和结点号能够对应上,索引不必加一,便于理解,输出时切片即可
    def heap_adjust(start, end):
        '''
        调整当前节点

        调整结点的起点在n//2,保证所有调整结点都有孩子结点
        :param end: 待比较个数
        :param start: 当前节点下标
        :rtype: None
        '''
        while 2 * start <= end: # 如果该结点下还有孩子则进入循环,否则跳出
            lchild_index = 2 * start #该结点号*2 为左孩子结点
            max_child_index = lchild_index #

            if lchild_index < end and lst[lchild_index + 1] > lst[lchild_index]: # 如果有右孩子并且右孩子比左孩子的数大,则更新最大值索引
                max_child_index = lchild_index + 1

            if lst[max_child_index] > lst[start]: #孩子结点比较完后与父结点比较,最大值放到父结点,并且下一次迭代的父结点是本次最大孩子索引
                lst[start], lst[max_child_index] = lst[max_child_index], lst[start]
                start = max_child_index
            else: # 如果父结点最大则直接跳出,因为排顶堆从编号最大的子树开始调整,即保证了本次最大孩子结点与其孩子结点已经形成了顶堆
                break

    for st in range(length//2, 0, -1): # 调整为大顶堆
        heap_adjust(st, length)

    for end in range(length, 1, -1): #sort排序 根结点与最后结点交换,每次迭代刨除最后结点,直至只剩根结点
        lst[1], lst[end] = lst[end], lst[1]
        heap_adjust(1, end - 1)

    return lst[1:]
  • 时间复杂度O(nlogn),平均时间复杂度O(nlogn)
  • 空间复杂度O(1)
  • 不稳定排序

--结束END--

本文标题: Python第五周 学习笔记(2)

本文链接: https://www.lsjlt.com/news/189643.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python第五周 学习笔记(2)
    一、实现一个cache装饰器,实现可过期被清除的功能 简化设计,函数的形参定义不包含可变位置参数、可变关键词参数和keyword-only参数 可以不考虑缓存满了之后的换出问题 1)原始 def cache(fn): imp...
    99+
    2023-01-31
    学习笔记 Python
  • 第一周Python学习笔记
     Python 基本语法: ①  Python程序的格式:1.用代码高亮来标识函数丶语句等等 本身的代码高亮并没有实际的意义,只是用来辅助编程人员和阅读人员 更好的识别    2.程序以缩进来标识语句,缩进用来标识代码间的层次关系,缩进的...
    99+
    2023-01-30
    学习笔记 第一周 Python
  • Python第八周 学习笔记(1)
    基本概念个体继承自父母,继承了父母的一部分特征,但也可以有自己的个性 子类继承了父类,就直接拥有了父类的属性和方法,也可以定义自己的属性、方法,甚至对父类的属性、方法进行重写 Python继承实现 class Cat(Anima...
    99+
    2023-01-31
    学习笔记 Python
  • Python第二周 学习笔记(3)
    1.运用数组实现求10万以内质数: prime = [2] for i in range(3,100000,2): flag = False up = int(i**0.5)+1 for j in prime: ...
    99+
    2023-01-31
    学习笔记 Python
  • Python第一周 学习笔记(3)
    一、数值型 1.数据类型分类: int:整数 python3的int就是长整型,且没有大小限制,受限于内存区域的大小int(x) 返回一个整数 float:浮点数 有整数部分和小数部分组成。支持十进制和科学计数法表示。只有双精度型。f...
    99+
    2023-01-31
    学习笔记 第一周 Python
  • Python第六周 学习笔记(3)
    1.指定一个源文件,实现copy到目标目录 个人实现: def filecopy(filename:str, cp_filename:str): ''' Author: lijl Description: 复制文...
    99+
    2023-01-31
    学习笔记 六周 Python
  • Python第九周 学习笔记(1)
    get(self, instance, owner) 访问属性时调用 set(self, instance, value) 当对属性赋值时调用 delete(self, instance) 删除属性时调用 sel...
    99+
    2023-01-31
    学习笔记 Python
  • Python学习笔记:第2天while循
    目录 1. while循环 continue、break和else语句 2. 格式化输出 3. 运算符 ...
    99+
    2023-01-30
    学习笔记 Python
  • Python学习笔记(2)
    Unicode字符串: GB2312编码为表示中文产生 python内部编码是unicode编码Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填0 就可以以Unicode表示的字...
    99+
    2023-01-31
    学习笔记 Python
  • Python学习笔记(2)
    Python开发IDE:pycharm   ,eclipse 快捷键:Ctrl+?整体注释 一·运算符   +(加)   -(减)  *(乘)   /(除)  **(幂)  %(余)   //(商)     判断某个东西是否在某个东西里边...
    99+
    2023-01-30
    学习笔记 Python
  • Python学习笔记五(Python
    Python urllib模块提供了一个从指定的URL地址获取网页数据,然后对其进行分析处理,获取想要的数据。1.查看urllib模块提供的urlopen函数。help(urllib.urlopen) urlopen(url, data...
    99+
    2023-01-31
    学习笔记 Python
  • 学习笔记-小甲鱼Python3学习第十五
    字符串格式化符号含义符号说明%c格式化字符及其 ASCII 码%s格式化字符串%d格式化整数%o格式化无符号八进制数%x格式化无符号十六进制数%X格式化无符号十六进制数(大写)%f格式化浮点数字,可指定小数点后的精度%e用科学计数法格式化浮...
    99+
    2023-01-31
    甲鱼 学习笔记
  • 学习笔记-小甲鱼Python3学习第五讲
    数据类型:整型、浮点型、布尔型整型:1、234、54浮点型:12.234、2.3e5 = 230000.0、1.5e-3 = 0.0015布尔型:True、False。True + True 返回 2,True + False 返回1,Tr...
    99+
    2023-01-31
    甲鱼 学习笔记
  • Python学习笔记2——Python概
    Python概述   语言:交流的工具,沟通媒介   计算机语言:人跟计算机交流的工具,翻译官   Python是计算机语言里的一种     代码:人类语言,同过代码命令机器,跟机器交流     Python解释器: 就是那个担任翻译工作...
    99+
    2023-01-30
    学习笔记 Python
  • python学习笔记2—python文件
    python学习笔记2——python文件类型、变量、数值、字符串、元组、列表、字典一、Python文件类型1、源代码python源代码文件以.py为扩展名,由pyton程序解释,不需要编译[root@localhost day01]# v...
    99+
    2023-01-31
    学习笔记 文件 python
  • MySQL 学习笔记(五)
    mysqldump 与 --set-gtid-purged 设置 (1)  mysqldump The mysqldump client utility performs logical backups, producing a set ...
    99+
    2022-01-27
    MySQL 学习笔记(五)
  • Python学习笔记整理(五)Pytho
    列表和字段,这两种类型几乎是Python所有脚本的主要工作组件。他们都可以在原处进行修改,可以按需求增加或缩短,而且包含任何种类的对象或者被嵌套。 一、列表 列表的主要属性: *任意对象的有序集合 ...
    99+
    2023-01-31
    学习笔记 Python Pytho
  • Python学习笔记:第一天python
    目录 1. python简介 2. python的安装 3. 编写第一个helloword 4. 变量和常量 5. 数据...
    99+
    2023-01-30
    学习笔记 Python python
  • JAVA学习笔记- - - day 2
     💕前言:作者是一名正在学习JAVA的初学者,每天分享自己的学习笔记,希望能和大家一起进步成长💕 目录  💕前言:作者是一名正在学习JAVA的初学者,每天分享自己的学习笔记,希望能和...
    99+
    2023-09-04
    学习
  • python3学习笔记(2)----p
    1、python3的基本数据类型 Python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。等号(=)用来给...
    99+
    2023-01-31
    学习笔记
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作