自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(173)
  • 收藏
  • 关注

原创 (Python3 代码实现)《大话设计模式》十:观察者模式

模式特点:定义了一种一对多的关系,让多个观察对象同时监听一个主题对象,当主题对象状态发生变化时会通知所有观察者。程序实例:公司里有两种上班时趁老板不在时偷懒的员工:看NBA的和看股票行情的,并且事先让老板秘书当老板出现时通知他们继续做手头上的工作。程序特点:无class Observer: def __init__(self, strname, strsub): self.name = strname self.sub = strsub def ..

2021-01-26 21:59:28 781

原创 (Python3 代码实现)《大话设计模式》九:建造者模式

模式特点:将一个复杂对象的构建(Director)与它的表示(Builder)分离,使得同样的构建过程可以创建不同的表示(ConcreteBuilder)。程序实例:“画”出一个四肢健全(头身手腿)的小人代码特点:无class Person: def create_head(self): pass def create_hand(self): pass def create_body(self): pass d..

2021-01-26 21:58:15 733

原创 (Python3 代码实现)《大话设计模式》八:外观模式

模式特点:为一组调用提供一致的接口。程序实例:接口将几种调用分别组合成为两组,用户通过接口调用其中的一组。代码特点:无class SubSystemOne: def MethodOne(self): print("SubSysOne")class SubSystemTwo: def MethodTwo(self): print("SubSysTwo")class SubSystemThree: def MethodThree(s..

2021-01-26 21:56:03 756

原创 (Python3 代码实现)《大话设计模式》七:模板方法模式

模式特点:定义一个操作中的算法骨架,将一些步骤延迟至子类中。程序实例:考试时使用同一种考卷(父类),不同学生上交自己填写的试卷(子类方法的实现)代码特点:无class TestPaper: def TestQuestion1(self): print("Test1:A. B. C. D.") print("(%s)" % self.Answer1()) def TestQuestion2(self): print("Test1:A..

2021-01-26 21:54:43 673

原创 (Python3 代码实现)《大话设计模式》六:原型模式

模式特点:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。程序实例:从简历原型,生成新的简历代码特点:简历类Resume提供的Clone()方法其实并不是真正的Clone,只是为已存在对象增加了一次引用。Python为对象提供的copy模块中的copy方法和deepcopy方法已经实现了原型模式,但由于例子的层次较浅,二者看不出区别。import copyclass Resume: name = '' age = 0 def __init__(se..

2021-01-26 21:33:04 646

原创 (Python3 代码实现)《大话设计模式》五:工厂方法模式

模式特点:定义一个用于创建对象的接口,让子类决定实例化哪一个类。这使得一个类的实例化延迟到其子类。程序实例:基类雷锋类,派生出学生类和志愿者类,由这两种子类完成“学雷锋”工作。子类的创建由雷锋工厂的对应的子类完成。代码特点:无class LeiFeng: def Sweep(self): print("LeiFeng sweep")class Student(LeiFeng): def Sweep(self): print("Student ..

2021-01-26 21:30:49 657

原创 (Python3 代码实现)《大话设计模式》四:代理模式

模式特点:为其他对象提供一种代理以控制对这个对象的访问。程序实例:同模式特点描述。代码特点:无class Interface: def request(self): return 0class RealSubject(Interface): def request(self): print("Real request")class Proxy(Interface): def request(self): self..

2021-01-26 21:28:57 637

原创 (Python3 代码实现)《大话设计模式》三:装饰模式

装饰模式模式特点:动态地为对象增加额外的职责程序实例:展示一个人一件一件穿衣服的过程。代码特点:无#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2021/1/19 17:41# @Author : cch# @Site :# @File : decorator.py# @Software: PyCharmclass Person: def __init__(self, tname):

2021-01-26 21:27:04 658 1

原创 (Python3 代码实现)《大话设计模式》二:策略模式

模式特点:定义算法家族并且分别封装,它们之间可以相互替换而不影响客户端。程序实例:商场收银软件,需要根据不同的销售策略方式进行收费代码特点:不同于同例1,这里使用字典是为了避免关键字不在字典导致bug的陷阱。class CashSuper: def accept_cash(self, money): passclass CashNormal(CashSuper): def accept_cash(self, money): return mo..

2021-01-26 21:19:16 689

原创 (Python3 代码实现)《大话设计模式》一:简单工厂模式

简单工厂模式模式特点:工厂根据条件产生不同功能的类。程序实例:四则运算计算器,根据用户的输入产生相应的运算类,用这个运算类处理具体的运算。代码特点:C/C++中的switch…case…分支使用字典的方式代替。使用异常机制对除数为0的情况进行处理。class Operation: def GetResult(self): passclass OperationAdd(Operation): def GetResult(self): retu

2021-01-26 19:47:42 673

原创 django+微信小程序入门实战一:简单计算器

准备环境微信开发工具djangodjango端在服务器安装python3和pip3环境,并安装djangopip install django创建django项目django-admin startproject weixintest 进入项目cd weixintest创建Apppython manage.py startapp CalculateApi修改calculator/settings.py文件# 修改 ALLOWED_HOSTS = [] 为

2020-07-18 16:35:05 547

原创 centos7下源码编译安装nginx

源码编译安装到官网下看好版本号http://nginx.org/en/download.html使用wget命令下载(推荐)#下载版本号可根据目前官网最新稳定版自行调整wget -c https://nginx.org/download/nginx-1.18.0.tar.gz安装依赖#gcc安装,nginx源码编译需要yum install gcc-c++#PCRE pcre-devel 安装,nginx 的 http 模块使用 pcre 来解析正则表达式yum inst

2020-07-14 16:24:39 189

原创 Python消息队列(RabbitMQ)

Python消息队列(RabbitMQ)RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。可维护多个队列,可实现消息的一对一和广播等方式发送RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。准备工作

2020-07-12 22:08:53 7611

原创 Ubuntu 16.04 RabbitMq 安装与运行

准备工作Ubuntu Server 16.04.1 LTS 64位安装RabbitMq可以参照RabbitMq官网的安装教程(Installing on Debian and Ubuntu),来进行安装。这里我们使用apt-get来安装,就简单的几条命令:1.由于rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang,执行命令:apt-get install erlang-nox # 安装erlangerl # 查看relang语言版本,成功执

2020-07-12 21:15:54 631

转载 一篇搞懂消息队列的基本概念

一 什么是消息队列我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ,我们后面会一一对比这些消息队列。另外,我们知道队列 Queue 是一种先进先出的数据结构,所以消费消息时也是按照顺序来消费的。比如生产者发送消息1,2,3…对于消费者就会按照1,2,3…的顺序来消费。二

2020-07-12 09:08:48 478

原创 Redis 入门指南九:Redis 有序集合(sorted set)

Redis 有序集合(sorted set)Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)其实不太准确。其实在redis sorted sets里面当items内容大于64的时候同时使用了hash和skiplist两种设计实现。这也会为了

2020-07-05 20:59:50 246

原创 Redis 入门指南八:Redis 集合(Set)

Redis 集合(Set)Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。实例在以上实例中我们通过 SADD 命令向名为 student 的集合插入的三个元素。Redis 集合命令下表列出了 Redis 集合基本命令:命令描述SAD

2020-07-05 20:50:08 140

原创 Redis 入门指南七:Redis 列表(List)

Redis 列表(List)Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。实例在以上实例中我们使用了 LPUSH 将三个值插入了名为 student 的列表当中。Redis 列表命令下表列出了列表相关的基本命令:命令描述BLPOP key1 [key2 ] timeout移出并获取列表的第一个元素, 如果列表没有

2020-07-05 20:05:11 131

原创 Redis 入门指南六:Redis 哈希(Hash)

Redis 哈希(Hash)Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)。实例在以上实例中,我们设置了 redis 的一些描述信息(name, age, gender, phone) 到哈希表的 student 中。Redis hash 命令下表列出了 redis hash 基本的相关命令:命令描述HDEL key fi

2020-07-05 19:57:50 227

原创 Redis 入门指南五:Redis 字符串(String)

Redis 字符串(String)Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:语法redis 127.0.0.1:6379> COMMAND KEY_NAME实例在以上实例中我们使用了 SET 和 GET 命令,键为 name。Redis 字符串命令下表列出了常用的 redis 字符串命令:命令描述SET key value设置指定 key 的值GET key获取指定 key 的值。GETRANGE key

2020-07-05 19:07:37 144

原创 Redis 入门指南五:Redis 键(key)

Redis 字符串(String)Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:语法redis 127.0.0.1:6379> COMMAND KEY_NAME实例在以上实例中我们使用了 SET 和 GET 命令,键为 name。Redis 字符串命令下表列出了常用的 redis 字符串命令:命令描述SET key value设置指定 key 的值GET key获取指定 key 的值GETRANGE key s

2020-07-05 18:41:03 181

原创 Redis 入门指南五:Redis 键(key)

Redis 键(key)Redis 键命令用于管理 redis 的键。语法Redis 键命令的基本语法如下:redis 127.0.0.1:6379> COMMAND KEY_NAME实例在以上实例中 DEL 是一个命令, name 是一个键。 如果键被删除成功,命令执行后输出 (integer) 1,否则将输出 (integer) 0Redis keys 命令下表给出了与 Redis 键相关的基本命令:序号命令及描述1DEL key (该命令用于在 key

2020-07-05 17:23:26 182

原创 Redis 入门指南四:Redis 命令

Redis 命令Redis 命令用于在 redis 服务上执行操作。要在 redis 服务上执行命令需要一个 redis 客户端Redis 客户端在我们之前下载的的 redis 的安装包中。语法Redis 客户端的基本语法为:$ redis-cli实例以下实例讲解了如何启动 redis 客户端:启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。$redis-cliredis 127.0.0.1:6379>redis 127.

2020-07-05 17:02:20 104

原创 Redis 入门指南三:数据类型

Redis 数据类型Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。String(字符串)string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,str

2020-07-03 18:35:29 217

原创 Redis 入门指南二:安装

Redis 安装Window 下安装下载地址:https://github.com/tporadowski/redis/releases。Redis 支持 32 位和 64 位。这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip压缩包到 C 盘,解压后,将文件夹重新命名为 redis。打开文件夹,内容如下:打开一个 cmd 窗口 使用 cd 命令切换目录到 C:\redis 运行:redis-server.exe redis.windows.conf如

2020-07-03 17:01:17 240

转载 Redis 入门指南一:简介

Redis 简介Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis支持数据的备份,即master-slave模式的数据备份。Redis 优势性能极高 – Redis能

2020-07-03 16:54:19 239

原创 数据结构与算法(Python版)六十:图的应用(词梯问题)

词梯Word Ladder问题由 “ 爱 丽 丝 漫 游 奇 境 ” 的 作 者 LewisCarroll在1878年所发明的单词游戏从一个单词演变到另一个单词, 其中的过程可以经过多个中间单词要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE:FOOL >> POOL >> POLL >> POLE >> PALE>> SALE >> SAGE我们的目标是找到最短的单词变换序列采用图来解决这个问题的步骤如下:

2020-07-03 16:17:43 1372 2

原创 数据结构与算法(Python版)五十九:图抽象数据类型的Python实现

ADT Graph的实现:实例ADT Graph的实现:顶点Vertex类Vertex包含了顶点信息, 以及顶点连接边信息class Vertex: def __init__(self, key): self.id = key self.connectedTo = {} def addNeighbor(self, nbr, weight=0): # nbr是顶点对象的key self.connectedTo[nbr]

2020-07-03 15:01:13 594

原创 数据结构与算法(Python版)五十八:图抽象数据类型

抽象数据类型: ADT Graph抽象数据类型ADT Graph定义如下:Graph():创建一个空的图;addVertex(vert):将顶点vert加入图中addEdge(fromVert, toVert):添加有向边addEdge(fromVert, toVert, weight):添加带权的有向边getVertex(vKey):查找名称为vKey的顶点getVertices():返回图中所有顶点列表in:按照vert in graph的语句形式,返回顶点是否存在图中True/Fal

2020-07-03 12:06:53 561

原创 数据结构与算法(Python版)五十七:图的基本概念及相关术语

图Graph的概念图Graph是比树更为一般的结构, 也是由节点和边构成实际上树是一种具有特殊性质的图图可以用来表示现实世界中很多事物道路交通系统、航班线路、互联网连接、或者是大学中课程的先修次序 一旦我们对图相关问题进行了准确的描述就可以采用处理图的标准算法来解决那些看起来很艰深的问题对于人来说,人脑的识别模式能够轻而易举地判断地图中不同地点的相互关联;但如果用图来表示地图,就可以解决很多地图专家才能解决的问题,甚至远远超越;互联网是由成千上万的计算机所连接起来的复杂网络,也可

2020-07-03 11:50:47 309

原创 数据结构与算法(Python版)五十六:树结构小结

本章总结本章介绍了“树”数据结构, 我们讨论了如下算法:用于表达式解析和求值的二叉树用于实现ADT Map的二叉查找树BST树改进了性能, 用于实现ADT Map的平衡二叉查找树AVL树实现了“最小堆”的完全二叉树: 二叉堆ADT Map的实现方法小结我们采用了多种数据结构和算法来实现ADT Map, 其时间复杂度数量级如下表所示:方法有序表散列表二叉查找树AVL树putO(n)O(1) -> O(n)O(log2n) -> O(n)O(log2

2020-07-03 11:03:57 129

原创 数据结构与算法(Python版)五十五:AVL树的Python实现

AVL树的Python实现既然AVL平衡树确实能够改进BST树的性能, 避免退化情形我们来看看向AVL树插入一个新key, 如何才能保持AVL树的平衡性质首先, 作为BST, 新key必定以叶节点形式插入到AVL树中叶节点的平衡因子是0, 其本身无需重新平衡但会影响其父节点的平衡因子:作为左子节点插入,则父节点平衡因子会增加1;作为右子节点插入,则父节点平衡因子会减少1。这种影响可能随着其父节点到根节点的路径一直传递上去, 直到:传递到根节点为止;或者某个父节点平衡因子被调整到0,不再影

2020-07-02 12:32:21 2450 2

原创 数据结构与算法(Python版)五十四:AVL树的定义和性能

平衡二叉查找树: AVL树的定义我们来看看能够在key插入时一直保持平衡的二叉查找树: AVL树AVL是发明者的名字缩写: G.M. AdelsonVelskii and E.M. Landis利用AVL树实现ADT Map, 基本上与BST的实现相同不同之处仅在于二叉树的生成与维护过程AVL树的实现中, 需要对每个节点跟踪“平衡因子balance factor”参数平衡因子是根据节点的左右子树的高度来定义的, 确切地说, 是左右子树高度差:balanceFactor = height(lef

2020-07-02 11:14:37 2252

原创 数据结构与算法(Python版)五十三:二叉查找树实现及算法分析

二叉搜索树的实现: BST.put方法put(key, val)方法:插入key构造BST首先看BST是否为空,如果一个节点都没有,那么key成为根节点root,否则,就调用一个递归函数_put(key, val, root)来放置key二叉搜索树的实现: _put辅助方法_put(key, val, currentNode)的流程如果key比currentNode小,那么_put到左子树但如果没有左子树,那么key就成为左子节点如果key比currentNode大,那么_put到右子树

2020-07-01 18:09:01 1433

原创 数据结构与算法(Python版)五十二:二叉查找树及操作

二叉查找树Binary Search Tree在ADT Map的实现方案中, 可以采用不同的数据结构和搜索算法来保存和查找Key, 前面已经实现了两个方案有序表数据结构+二分搜索算法,散列表数据结构+散列及冲突解决算法下面我们来试试用二叉查找树保存key,实现key的快速搜索在ADT Map的实现方案中, 可以采用不同的数据结构和搜索算法来保存和查找Key, 前面已经实现了两个方案有序表数据结构+二分搜索算法,散列表数据结构+散列及冲突解决算法下面我们来试试用二叉查找树保存key,实现key的快

2020-07-01 16:03:01 4457

原创 数据结构与算法(Python版)五十一:二叉堆的Python实现

二叉堆操作的实现二叉堆初始化采用一个列表来保存堆数据,其中表首下标为0的项无用,但为了后面代码可以用到简单的整数乘除法,仍保留它。class BinHeap: def __init__(self): self.heapList = [0] self.currentSize = 0insert(key)方法首先,为了保持“完全二叉树”的性质,新key应该添加到列表末尾。会有问题吗?insert(key)方法新key加在列表末尾,显然无法保持“堆”次序,

2020-07-01 12:48:07 2627

原创 数据结构与算法(Python版)五十:优先队列和二叉堆

优先队列Priority Queue前面我们学习了一种FIFO数据结构队列队列有一种变体称为“优先队列”。银行窗口取号排队, VIP客户可以插到队首,操作系统中执行关键任务的进程或用户特别指定,进程在调度队列中靠前优先队列的出队跟队列一样从队首出队;但在优先队列内部, 数据项的次序却是由“优先级”来确定:高优先级的数据项排在队首,而低优先级的数据项则排在后面。这样,优先队列的入队操作就比较复杂,需要将数据项根据其优先级尽量挤到队列前方。思考:有什么方案可以用来实现优先队列?出队和入队的复杂

2020-07-01 11:36:37 4121

原创 数据结构与算法(Python版)四十九:树的遍历

树的遍历Tree Traversals对一个数据集中的所有数据项进行访问的操作称为“遍历Traversal”线性数据结构中, 对其所有数据项的访问比较简单直接按照顺序依次进行即可树的非线性特点, 使得遍历操作较为复杂我们按照对节点访问次序的不同来区分3种遍历前序遍历(preorder):先访问根节点,再递归地前序访问左子树、最后前序访问右子树;中序遍历(inorder):先递归地中序访问左子树,再访问根节点,最后中序访问右子树;后序遍历(postorder):先递归地后序访问左子树,再后序

2020-06-30 18:38:02 1278

原创 数据结构与算法(Python版)四十八:树的应用(表达式解析)

树的应用:解析树(语法树)将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理语法分析树主谓宾,定状补程序设计语言的编译词法、语法检查从语法树生成目标代码自然语言处理机器翻译、语义理解树的应用: 表达式解析我们还可以将表达式表示为树结构叶节点保存操作数,内部节点保存操作符全括号表达式((7+3)*(5-2))由于括号的存在,需要计算*的话,就必须先计算7+3和5-2,表达式层次决定计算的优先级越底层的表达式,优先级越高树中每个子树都表示一个子表达式

2020-06-30 17:08:39 1847

原创 数据结构与算法(Python版)四十八:树的链表实现

实现树:节点链接法同样可以用节点链接法来实现树每个节点保存根节点的数据项,以及指向左右子树的链接定义一个BinaryTree类成员key保存根节点数据项成员left/rightChild则保存指向左/右子树的引用(同样是BinaryTree对象)class BinaryTree: def __init__(self, rootObj): self.key = rootObj self.leftChild = None self.rig

2020-06-30 14:12:16 843

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除