自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Spade_的博客

Python爬虫、Django/Flask、数据分析与可视化、Python框架源码。知识积累与分享。

  • 博客(125)
  • 资源 (3)
  • 收藏
  • 关注

原创 [Python] 详解从属性描述符到实现ORM模型

[Python] 详解从属性描述符到实现ORM模型1. 什么是描述符?2. 理解类属性和实例属性访问的不同3. 开始写描述符4. 理解 self、instance 和 owner 参数5. 使用 getattr 和 setattr 替代字典以改写描述符类6. 使用元类注解类的属性7. 用描述符和元类仿照 Django 实现 ORM 模型1. 什么是描述符?描述符是对多个属性运用相同存取逻辑的一种方式。例如,Django ORM 和 SQLAlchemy 等 ORM 中的字段类型是描述符,把数据库记录

2021-02-20 22:18:18 527 1

原创 [Python] 详解使用动态规划求解最大回撤并绘图

[Python] 使用动态规划求解最大回撤并绘图首先,我们要理解什么是最大回撤。最大回撤:有一个数组,求其中两个数x,y,满足x的索引小于y的索引,使得 x-y 最大。 下面举例几种情况:[1,2,3,4,5,6,7,8,9]: 最大回撤是-1。 (1)[9,8,7,6,5,4,3,2,1]: 最大回撤是8,对应的x=9,y=1。 (2)[3,7,2,6,4,1,9,8,5]: 最大回撤是6,对应的x=7,y=1。 (3)[2,3,5,2,4,1,9,2,6]: 最大回

2021-01-07 22:36:05 2079 4

原创 [Python] 理解yield关键字、生成器函数和协程

理解yield关键字、生成器函数和协程写作背景从生成器函数到协程1. yield、生成器和生成器函数2. next()和send(None)3. send()和next()的C语言实现4. send() 给生成器函数传值5. 使用Pycharm的DEBUG模式理解data = yield item的执行过程协程1. 什么是协程?2. 个人对yield和协程的理解3. 区别生成器函数和协程期待再会...写作背景主旨:介绍yield关键字的用法、生成器和生成器函数什么是协程、生成器函数和协程的区别从

2020-12-17 23:31:02 300

原创 [Git] 两张图理解工作区、暂存区和版本库并总结git常用命令

两张图理解工作区、暂存区和版本库并总结git常用命令前情提要一、版本管理1. 一张图总结2. 版本管理常用命令二、分支管理1. 一张图总结2. git 常用分支命名3. git branch 和 git checkout三、拉取与提交命令1. git merge2. git fetch3. git pull4. git push5. git diff前情提要学了很多 git 命令,还有就是工作区、暂存区和版本库,这三个搞来搞去有点懵逼,自己总结了一下,做的图有些简陋,如果有不对的地方,烦请大佬们指出。

2020-09-06 17:49:10 386

原创 [Python] 深入理解 self、cls、__call__、__new__、__init__、__del__、__str__、__class__、__doc__等

[Python] 深入理解 self、cls、__call__、__new__、__init__、__del__、__str__、__class__、__doc__等Python self、cls、\_\_call\_\_、\_\_new\_\_、\_\_init\_\_、\_\_del\_\_、\_\_str\_\_、_\_class\_\_、\_\_doc\_\_等1. self 和 cls 的区别1.1 self 关键字1.2 类的变量(公有、保护、私有)1.3 cls 关键字1.3.1 static

2020-08-10 23:28:27 5714 4

原创 CentOS7初始化配置Python3+Django+Nginx+uwsgi+celery+MySQL+Redis

Linux初始化配置Python3+Django+Nginx+uwsgi+celery+MySQL+Redis—阿里云CentOS7Linux初始化配置Python3+Django+Nginx+uwsgi+celery+MySQL+Redis—阿里云CentOS70.修改主机名1. 安装Python32. 安装MySQL3. 安装redis4. 配置git5. 安装相关的python包和celery配置setting.py文件数据库迁移6. 运行Django项目7. 安装Nginx + uwsgi7.1 安

2020-06-29 23:15:13 6749

原创 【Python】基金/股票 最大回撤率计算与绘图详解(附源码和数据)

起因前一段时间投了一家金融公司的Python开发工程师,让我做以下事情:以月为窗口,挑选一只基金or股票,查看它近2年最大回撤率;找到从08年-至今的金融危机时间段,并呈现在这些危机时间段内,该基金or股票的历次回撤率。给了3天时间,代码我1天不到就写完了,写完之后我就去做自己的项目了,沉迷技术无法自拔~~~3天过后,没想到打电话过来的是产品经理,完全不问代码的事情,问我平时是怎么学习的;问我有没有考虑为什么要分析这些东西;问我以后的方向;问我学习中遇到过的最大的问题是什么,我说了我最近做的

2020-05-20 21:33:15 14071 1

原创 【Python】ubuntu20.04安装pip2失败解决

0. 安装pip2各种失败2021年了,想在ubuntu上装个python2.7和pip2,装pip2的时候翻车了,翻了翻网上各种通篇一律的教程,不由得让人想叹气。安装pip2的时候各种失败,试了以下几种办法:更新镜像源sudo apt install python-pipsudo wget https://bootstrap.pypa.io/2.7/get-pip.pysudo python2 get-pip.py统统不行!!!浪费时间。1. 下载pip2包并安装然而最后

2021-04-27 20:58:20 1331 4

原创 [Python] 浅谈对Python协程的理解

浅谈对Python协程的理解Python的协程也算是一个很重要的知识点了,我从刚刚开始的懵懵懂懂一知半解,到后面翻了很多书之后算是贯通一些了,因此我在此谈谈个人对Python协程的理解。对比了《Python高级编程》、《流畅的Python》等书对协程的描写,我总结了以下看法:1. 你的底层库函数必须是异步的、不IO阻塞的首先,要想实现协程,你的底层协程函数必须是异步的、不IO阻塞的。这句话很关键,你要确保你底层的协程不是IO阻塞的,能通过 yield from 交出控制权给调度程序,同时还要在IO操

2021-03-15 22:50:01 389 2

原创 [Python] 深入理解元类并区分元类中的init、call、new方法

[Python] 深入理解元类并区分元类中init、call、new方法0. 参考书籍1. 元类的定义2. 区分继承自 type 和使用 metaclass 关键字3. 类装饰器的运行4. 元类的运行5. 理解元类的四个参数6. 元类中的 init 、call、new 方法7. 元类中的prepare方法8. 元类的妙用0. 参考书籍本文内容参考书籍《流畅的Python》《Effective Python》《编写高质量代码:改善Python程序的91个建议》。我只是知识的搬运工,将知识进行整理,区分出其

2021-01-31 21:56:41 903

原创 [Python] future线程处理并发的核心源码详解

ThreadPoolExecutor 核心工作详解ThreadPoolExecutor内部是如何工作的?什么是future对象?线程什么时候被创建?任务是如何被线程处理的?结束之后如何销毁的1. ThreadPoolExecutor我们所有的工作都是在ThreadPoolExecutor完成的:with futures.ThreadPoolExecutor(max_workers=2) as executor: ...executor中定义了几个关键的变量。class Th

2020-12-27 22:25:00 484 1

原创 [Python] 使用futures模块处理并发(超好用的并发库)

使用futures模块处理并发concurrent.futures模块的主要特色是ThreadPoolExecutor和ProcessPoolExecutor类,这两个类实现的接口能分别在不同的线程或进程中执行可调用的对象。这两个类在内部维护着一个工作线程或进程池,以及要执行的任务队列。ThreadPoolExecutor和ProcessPoolExecutor的API接口一样,本文重点讲解ThreadPoolExecutor的用法。一、用法示例1. 使用 map() 处理多个任务使用两行代码,就能

2020-12-27 22:23:22 1566

原创 [Python] selenium textarea传值到了其他元素上

[Python] selenium textarea传值到了其他元素上0. 前情提要1. 问题代码2. 解决办法:替换\t3. 另辟蹊径:selenium使用js操作textarea元素替换value0. 前情提要Python使用selenium操作textarea时,由于send_keys()要写入有多行值的脚本,脚本里面包含换行\n、\t等,所以遇到了一个很奇怪的bug,send_keys()把值写到了其他元素input上,让我有点懵逼。后面也试了调用js脚本设置textarea的value值,但是

2020-12-13 16:41:03 706

原创 [Python] argparse的一般使用

1. argparse使用示例import argparseparser = argparse.ArgumentParser(description='manual to this script', prefix_chars='-+/')# 指定typeparser.add_argument('-p', type=int, default=1, help="The number of page")parser.add_argument('-d', type=str, default="def

2020-12-12 14:19:31 179

原创 [Python] argparse处理多个功能和不同的多参数

argparse官方文档https://docs.python.org/zh-cn/3.9/library/argparse.htmlargparse使用示例功能示例import argparseparser = argparse.ArgumentParser(description='manual to this script', prefix_chars='-+/')# 指定typeparser.add_argument('-p', type=int, default=1, help=

2020-12-12 13:00:37 2965

原创 [Python] 自定义中间件记录所有请求和响应信息到日志

在不使用Django自带的日志模块,我想把请求和响应信息使用自定义的日志模块记录下来,比如记录请求的请求地址、请求方法、请求路径、请求信息,返回状态码、返回内容长度,要如何做呢?前面我写了一个日志装饰器,但是只能记录到我写入了视图的request,而无法记录接收到的所有request,于是我想到了用中间件,而Django自定义中间件也很简单。那么我们开始吧,自定义Django中间件记录请求和响应信息到日志中。假设项目结构如下:- Myproject - Myproject - __init

2020-12-10 00:11:25 662

原创 [Python] Django记录请求和响应信息的日志装饰器

1. Django记录请求和响应信息的日志装饰器写一个Django记录请求和响应信息的日志装饰器,接收请求时,记录请求的请求地址、请求方法、请求路径、请求信息,返回状态码、返回内容长度。from functools import wrapsdef http_logger(logger): def logging_decorator(func): @wraps(func) def wrapped_function(*args, **kwargs):

2020-12-10 00:10:01 1272

原创 [Python] Django中的serve和FileResponse

我们知道Django可以使用serve暴露静态文件:一、Django暴露静态文件在settings.py内配置STATIC_URL = '/static/'STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'),)在urls.py内配置from django.conf.urls import urlfrom django.views.static import servefrom MyProject.settings impor

2020-12-08 00:00:29 1553

原创 [Python] 先读后覆盖写文件

Python先读后覆盖写文件只打开一次文件,先把文件内容读取出来,处理之后形成新的数据,重新写入新的数据,完成先读取后覆盖写文件。比如有一个文件内容如下,需要将内容全转为大写然后覆盖:Now York is 3 hours ahead of California, but it does not make California slow.Someone graduated at the age of 22, but waited 5 years before securing a good job.

2020-12-06 13:16:18 2867

原创 [Python] 读写yaml文件和处理yaml分段

安装处理yaml的模块pip install pyyamlyaml.load(stream) / yaml.safe_load(stream):将输入stream对象加载为字典类型。推荐使用yaml.safe_load(),将加载对象限制为简单的Python对象,如整数或列表 。yaml.load() 能通过加载yaml文件构建任何类型的python对象,若加载的yaml文件来源不可信,则可能产生注入攻击的风险。yaml.dump(data) / yaml.safe_dump(data)

2020-12-06 13:14:37 3226 1

原创 [Python] 建造者模式的实现

参考《设计模式之禅》from abc import ABC, abstractmethodclass CarModel(ABC): def __new__(cls, *args, **kwargs): # 让子类不能覆盖run方法 if cls != cls.__name__ and 'run' in cls.__dict__.keys(): raise Exception('"run" method methond cannot be

2020-11-22 23:22:26 141

原创 [Python] 线程安全的单例模式日志模块

"""我们的目的是借助单例模式,只生成一个logger。当日志文件已经存在时,默认以追加方式写入。"""import loggingimport osimport timeimport sysimport threadingdef synchronized(func): func.__lock__ = threading.Lock() def lock_func(*args, **kwargs): with func.__lock__:

2020-11-16 19:47:23 320

原创 [Python] 设计模式之简单理解原型模式

什么是原型模式?原型模式,就是“克隆”对象。当一个现有对象需要保持不变,而我们想创建它的精确副本,以便更改副本的某些部分时,原型模式非常有用。Python中的原型模式Python天然就有使用原型模式的优势,使用copy.deepcopy()就能实现对象的完全复制(深拷贝)。import copyobj1 = object()obj2 = copy.deepcopy(obj1)print(id(obj1), id(obj2)) # 输出的两个对象的id是不一样的原型模式示例我们有一个Web

2020-11-14 22:34:07 170

原创 [Python] Django集成Angular代码实现前后端不分离

Angular与Django前后端不分离时,需要将angular的代码集成待Django中,搜了搜,网上居然没有一篇相关的教程,全是简单讲了讲AngularJS和Django的,也不全面,这就很离谱!!!Angular原生的项目需要跑在webstorm上,所以代码不能直接使用,需要进行编译。参考JAVA跟Angular前后端不分离的教程,趁着这次简单搞了一次Django集成Angular前端代码,写个简单的教程记录一下。1. angular项目编译不懂编译angular的前端小白,请自行百度。an

2020-11-14 18:58:58 1171 1

原创 [Git] git pull冲突和git stash pop冲突解决

一、git pull 冲突代码仓有人提交了新代码,而我本地也修改了代码,想要pull一下,却发现:error: Your local changes to the following files would be overwritten by merge: xxx.xxxPlease, commit your changes or stash them before you can merge.百度了一下解决办法很简单,有两种:暂存本地的修改,pull之后解决冲突撤销本地所有

2020-11-09 23:05:15 4679

原创 [Python] 传递参数前面的*或**

Python传递参数前面的*或**先上结论:func(*[1, 2, 3]) == func(1, 2, 3)func(**{'name':'Spade_', 'number':'888888'}) == func(name='Spade_', number='888888')如果你不懂Python四种常用的传参方式,参考:[Python] 仅限位置参数和仅限关键字参数1. 单星号 * 解析可变参数传递参数前面的*,和不带星号的使用,func()是一个接收可变参数的函数。func(*[1

2020-10-30 23:56:27 1089

原创 [Python] 多线程同步问题——信箱传递

题目有n个线程,向同一个信箱(信箱的大小为k)里传递消息,放入的消息为数字i(i=1…n),有m个线程从信箱里取数字,取出来将数字*10并打印。代码实现"""有n个线程,向同一个信箱(信箱的大小为k)里传递消息,放入的消息为数字i(i=1...n),有m个线程从信箱里取数字,取出来将数字*10并打印。"""import timeimport randomfrom threading import Thread, Semaphore, Locklist_len = 5in_index, o

2020-10-29 23:09:44 194

原创 [Python] 多进程和多线程在共享资源上的区别

独立与非独立的内存空间同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源相互独立。我们看一个简单的例子,使用多个线程/进程向同一个list内添加值。多线程的代码这样写:from threading import Thread, Lockimport timedef func(nums, i, lock: Lock): lock.acquire() # 打印控制台是共享资源,需要请求锁 print(f"Thr

2020-10-29 23:01:53 425

原创 [Python] 爬虫requests下载保存csv xlsx zip各种资源文件

Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。Requests 的哲学是以 PEP 20 的习语为中心开发的,所以它比 urllib 更加 Pythoner。import requestsrequests.get(..., stream=False)当把get函数的stream参数设置成False时,它会立即开始下载文件并放到内.

2020-10-19 23:45:16 6799 4

原创 [Python] 按原格式写excel、xlsx,使用openpyxl

Pandas 处理 excel 确实很方便,但是让人头疼的就是如何保存数据的格式。我的办法是直接读一个已经做好格式的xlsx文件,然后通过openpyxl将数据写入,因为openpyxl能够读取excel的格式。if __name__ == '__main__': in_file = 'input/xxx表.xlsx' ex = ExcelHandler(in_file) ex.save_to_cell('Sheet1', 2, 5, '百度一下') # 保存数据到单元格

2020-10-19 23:38:28 1218

原创 [Python] 三种文件读取方式:生成器分块/按行/一次读取

三种文件读取方式。按行读取文件、按行读取并跳过某些行、一次读取文件。后续继续增加其他用法。def read_file_by_line(file): """ 按行读取,遇到空行退出 """ with open(file, mode='r', encoding='utf8') as f: while True: one_line = f.readline().strip() if not one_line:

2020-10-19 22:30:28 4581 2

原创 [Python] 4种方式优雅地连接字符串

看了很多其他人写的Python代码,不少是“+”连接字符串。各位,别再使用"+"号连接你的字符串了,这会耗费很多时间空间。优雅的字符串连接,能让你的代码更具有可读性,同时还能优化时间问题。country, city, street = '中国', '深圳市', '南山区'# f-string连接字符串,速度最快address = f"{country}.{city}.{street}"# ''.join连接字符串address = '.'.join([country, city, street

2020-10-19 22:21:11 350

原创 [Python] 获取前一日/周/月/年或相对任意时间

Python获取前一日/周/月/年或相对任意时间一、当前时间二、相对当前时间的前一天、前一周、前一月、前一年等三、相对(现在、或特定时间)任意时间一、当前时间# 使用time模块import timecurrent_time = time.strftime("%Y-%m-%d %H%M%S", time.localtime())# 使用datetime模块import datetimecurrent_time = datetime.datetime.now().strftime("%Y-%m

2020-10-19 22:15:41 1711

原创 [Git] 两种方法合并多个commit为一个

0. 前情提要要准备提交MR了,改了半天搞了很多个commit,都push上去了,但是提交MR的时候要合成一个commit,咋搞呢?0.1 我期望的效果1. 合并commit之前比如我现在有4个 commit ID,从新到旧分别为:85d5d8fa468b06bb9a62fafde01d80cbb7396682 # 我改的621ca4121f971d9604e395556763551427d799d9 # 我改的f744d2e91916ab7831f3a7695d1d1825916db1

2020-09-20 22:26:17 38842

原创 [Git] 提交某一个文件夹到一个仓内

0. 前情提要自己搞了一个工程,要把整个工程文件夹加到一个现有的Git仓内,这个仓不是我的,是所有人的,我的工程放进去就是其中的一个文件夹。但是先git clone,然后把工程文件夹复制粘贴进去实在是太麻烦,还要重新打开工程才方便继续修改。我不想复制粘贴,怎么搞呢?很简单,直接在工程文件夹里初始化现有的仓,然后添加提交。1. 解决办法提交到master分支。# 初始化git init# 配置远程仓地址git remote add origin [email protected]:H-tao/Git

2020-09-20 17:43:12 908

原创 [Git] git重命名文件和文件夹详解

0. 前情提要想修改一下我的某个文件/文件夹名字,发现一改,怎么这个文件绿色的 √ 就没了???改回来之后,√ 又回来了!!!特么的,咋回事呢?别急, Git 追踪文件是根据文件名来的,把文件名改了,它就不知道那该死的文件去哪了,它就以为你删掉了!!!所以你在本地直接改名一个文件之后,git status 发现的就是 deleted 和 untracked。但这不是我的本意啊!!!所以想要修改文件名,我们就需要用到 git mv 命令了。1. git mv 详解重命名重命名文件或文件夹可以使用 g

2020-09-06 18:33:46 14476 3

原创 [Git] 还原某个特定的文件到之前的某个版本

0. 前情提要提交了多个 commit 之后,发现对某些个文件修改的不满意或者修改错误,想把这某些个文件回退到之前的某个版本,但是又不想把整个工作区的内容从版本库中全部恢复。比如想从版本库中恢复不满意的 hellopython.py 文件到工作区:git log hellopython.pygit checkout commitID hellopython.pygit commit -m "hellopython版本回退" hellopython.py1. 使用示例1. git log 查看

2020-09-06 18:14:32 818

原创 [Python] 实现单例模式的四种方式及单例模式日志

0. 前情提要我们知道类 __init__ 方法,还应该知道类的 __new__方法,和元类的 __call__ 方法。这三个方法的执行顺序是:元类的 __call__ 方法  ==>   类的 __new__方法  == >  类的 __init__ 方法只要利用三者的执行顺序,我们就可以在创建实例对象的时候,判断实例对象是否已经创建,如果是,则返回已经创建好的实例对象,否则新建一个实例对象并返回。这样就可以实现单例模式了。1. 使用__new__实现单例模式利用运行 __ini

2020-09-05 23:38:50 944

原创 [Python] selenium 的封装之报错拦截

使用selenium的时候,总是会报错、报错、各种运行中断,无奈封装一下常用的操作。包括打开页面、等待元素加载、点击元素、切换窗口、输入值等。后续会持续完善。from selenium.common.exceptions import TimeoutException, NoSuchElementException, InvalidElementStateExceptionfrom selenium.webdriver.common.by import Byimport selenium.webdri

2020-08-29 20:17:20 406

原创 [Python] nametuple 的使用详解及读取 csv 文件

平时偶尔会看到namedtuple,但不知道这玩意儿到底有什么用,特此学习一下。1. namedtuplenamedtuple 是一个类工厂,它接受一个类型名称和一个属性列表,并从中创建一个类。明晰类工厂这一点,即使用 namedtuple 创建的是一个类。namedtuple 结合了字典和元组的优点:访问性能优势,namedtuple 是基于元组的,通过索引访问元素非常快。存储性能优势,namedtuple 是不可变的,底层的数组存储被精确地分配所需的大小,内存效率胜过字典。生成的类可以被子类

2020-08-24 23:04:47 1083 3

Xpath_helper.zip

Xpath_helper,Chrome Xpath 路径插件,爬虫页面清洗,超级好用

2021-05-13

json-viewer-awesome_v1.0.6.rar

内含json-viewer-awesome_v1.0.6.crx文件,也可以解压rar之后使用Chrome-扩展工具-打开开发者模式-加载已解压的扩展程序,就可以在chrome浏览器使用了。

2019-12-19

算术表达式求值源码+实验报告

代码可靠完整,个人手写实现,包括小数计算,下面是测试用例: //10*8^2+16.3+5*(5.2*5+3.01)/4-(-10)+0.1000060+4.00416-40 = 666.666666 //100+(-100)-(-10^2) = 100 //(((2016-2017+(((2015-2014)))))) = 0 //-1+(((((((((1^0))))))))+100^2 = 0

2018-03-18

空空如也

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

TA关注的人

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