中介模式(python实现2) 相较前一个中介模式(python实现)来说,本例子实现了多个中介者的情况from abc import ABCMeta, abstractmethodfrom enum import Enumclass InteractiveObject: """进行交互的对象"""class InteractiveObjectImplA: """实现类A"""class InteractiveObjectImplB: """实现类B"""class Mediat
中介模式(python) """中介模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用, 从而使其耦合松散,而且可以独立地改变他们之间的交互"""class HouseInfo: """房源信息""" def __init__(self, area, price, has_window, has_bathroom, has_kitchen, address, owner): self.__area = area self._...
状态模式(python) """状态模式的核心思想是一个事物(对象)有多种状态,在不同的状态下所表现出来的行为和属性不一样"""from abc import ABCMeta, abstractmethodclass Context(metaclass=ABCMeta): """状态模式的上下文环境类""" def __init__(self): self.__states = [] self.__cur_state = None # 状态发生...
搞懂Python协程 什么是协程?协程是指一个过程,这个过程与调用方协作,由调用方提供的值进行产出。流畅的PythonLuciano Ramalho大佬的这个解释真是有点抽象。直观来看,如果把“协程”替换成“函数”,这段话也读的通,而且好像更容易理解。细细读来,感觉大佬想表达的意思主要集中在“协作”一词上。协程是怎么协作的?我对协程的第一映像是,只要把函数的return关键字改成yield,就把函数定义成了协程,所以关键还是得理解yield关键字的作用在词典中,yield有产出和让步两种意思,
MySQL可重复执行的建表SQL 记录一个可重复执行的建表SQL,因为有时候上线不是一次能成功的,所以需要考虑到重复执行。DROP TABLEIF EXISTS table_name;CREATE TABLE `table_name` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', `column1` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '变量代码', `column2` float DE
剑指offer:青蛙跳台阶问题 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。思路:可以使用动态规划的思想来处理class Solution: def numWays(self, n: int) -> int: mod = 1e9+7 if n == 0: return 1 if n..
剑指offer:斐波那契数列 题目:写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1)= 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。思路:可以使用动态规划的思路来解决问题class Soluti...
剑指offer:从头打印链表 题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)思路:链表的遍历只能从到尾,可以借用栈的入栈和出栈将访问得到的值顺序翻转import numpy as npclass Stack: def __init__(self): self.s = np.array([], dtype=int) self.length = 0 def append(self, e): self.s = np.appe..
剑指offer:包含min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。思路:增加一个数据域用来记录最小元素,如果当前入栈元素不大于最近一次保存的最小值,那么将当前值保存为最近一次保存的最小值import numpy as npclass MinStack: def __init__(self): """ initialize your data struc..
剑指offer: 两个栈实现一个队列 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回 -1 )思路:根据栈的后进先出原则,所有元素正序入栈后出栈顺序为反序,然后反序进入另一个栈后出栈顺序是正序import numpy as npclass Stack: def __init__(self): self.s = np.arra..
使用git tag 添加标签git tag -a [标签名] -m "注释"将本地代码库的标签推送到远程代码库git push [远程代码库] --tagsgit push origin --tags查看标签和注释git tag -n
策略模式(Python一等函数实现) "一等函数"这个词其实有点坑,听起来有点像特指某一部分函数,但是其实所有函数都是一等函数。编程语言理论家把“一等对象”定义为满足下述条件的程序实体:在运行时创建 能赋值给变量或数据结构的元素 能作为参数传给函数 能作为函数的返回结果---《流畅的Python》第5章 一等函数所以可以看出,所有函数都是一等对象,所以叫做“一等函数”。策略模式由三个部分组成:上下文:把一些计算委托给实现不同算法的可互换组件(具体策略),它提供服务 策略:实现不同算法的组件共同的接口 具体
直接插入排序(Python) 顾名思义,直接插入排序是一种插入排序。排序过程中不需要借助硬盘来保存临时数据,所以它也是一种内部排序。直接插入排序的思想是将一个序列在逻辑上分为两部分组成,一半是已经排序好的,一半是没经过排序的,要做的是将数据从没排序的部分拿出来,然后在排序好的部分里找个合适的位置插入。算法的空间复杂度是:O(1)算法的时间复杂度是:O(n^2)# 直接插入排序import numpy as npdef insert_sort(data: list): init = np.array([0
图的十字链表实现(Python) 当实现稀疏图时,为了避免空间浪费会采用邻接表实现。但是邻接表实现的图,查找某个顶点的入度边关联的另一个顶点时就比较麻烦,就是就可以采用图的十字链表实现十字链表的关键点是,两个有相同弧头顶点的弧结点就有一个指针相连,两个有相同弧尾顶点的胡结点也会有一个指针相连"""图的十字链表表示"""import numpy as npclass ArcBox: # 弧结点 def __init__(self, tail_vex, head_vex, head_link=None,
图的邻接表实现(Python) 在实现稀疏图的时候,邻接矩阵会使用大量空间用来表示两个顶点没有邻接关系,但是实际使用时我们更关注有邻接关系的顶点,所以为了避免这个问题,可以使用邻接表来实现图,也就是使用链表来表示顶点间的连接关系"""图的邻接表实现"""import numpy as npclass ArcNode: """ 弧结点 """ def __init__(self, adj_vex, next_arc, info): self.adj_vex = adj_vex
git基于历史版本创建新分支 首先执行git log命令查看历史版本日志git log想要从哪一次提交上拉出新分支,那么找到对应的提交,copy下commit ID,大概是这个样子commit 63226e3eae6d5c63acb643172569a00e367e631d如果工作区有更新,那么先将代码提交、或暂存,然后执行命令git branch [new branch name] [commit id] 查看分支是否创建成功git branch -a切换到当前新创建的分支git che.
git暂存命令 暂存命令的作用可以将git工作区的代码更改暂存,之后就可以执行git pull、git merge之类的命令暂存命令git stash save "暂存的备注"直接执行git stash也可以达到暂存的目的,但是连续多次暂存后容易让人混淆哪次暂存了哪些代码查看暂存记录git stash list取回暂存代码git stash pop......