![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Python
文章平均质量分 50
蓝绿色~菠菜
对技术有一颗敬畏和严谨之心,对代码有精益求精的精神。像养小孩和女朋友一样,精心照料和打扮。想清楚了再干,坚持高标准,Design for future!
展开
-
你真的了解python中的setup.py吗?
通过上面的学习,你一定已经学会了如何打包自己的项目,若你觉得自己开发的模块非常不错,想要share给其他人使用,你可以将其上传到PyPi(PythonPackageIndex)上,它是Python官方维护的第三方包仓库,用于统一存储和管理开发者发布的Python包。安装以源码包方式发布的包的过程,是先解压,再编译,最后才安装(上面提到的pythonsetup.pyinstall),所以它是跨平台的,由于每次安装都要进行编译,相对二进包安装方式来说安装速度较慢。...............原创 2022-08-01 18:54:26 · 2459 阅读 · 0 评论 -
pkg_resources动态加载插件
当编写应用软件时,我们通常希望程序具有一定的扩展性,额外的功能——甚至所有非核心的功能,都能通过插件实现,具有可插拔性。特别是使用 Python 编写的程序,由于语言本身的动态特性,为我们的插件方案提供了很多种实现方式。django的中间件都用过吧,只需要在setting中配置好django就能自动被调用,这也是利用import_string动态加载的。函数、django的import_string(),它们都可以动态加载指定的 Python 模块。安装的软件包的路径,并且可以正确执行。......原创 2022-07-25 11:19:57 · 1670 阅读 · 0 评论 -
Python操作树结构、树结构节点
nodes = [ {'id': 1, 'name': '1', 'parent_id': None}, {'id': 2, 'name': '2', 'parent_id': 1}, {'id': 3, 'name': '3', 'parent_id': 1}, {'id': 4, 'name': '4', 'parent_id': 2}, {'id': 5, 'name': '5', 'parent_id': 3}, .原创 2021-12-23 18:30:46 · 2734 阅读 · 3 评论 -
python对接kafka
python对接kafka有两个常用库:kafka-python,pykafka,前者github star较多,所以选用了前者。生产者:from kafka import KafkaProducerimport jsonimport datetimetopic = 'test'producer = KafkaProducer(bootstrap_servers='127.0.0.1:9092', value_serializer=lambda m: json.dumps(m).enc原创 2021-11-08 11:20:35 · 5158 阅读 · 0 评论 -
深入理解Python&Werkzeug中的ThreadLocal变量
Python.ThreadLocal我们知道多线程环境下,每一个线程均可以使用所属进程的全局变量。如果一个线程对全局变量进行了修改,将会影响到其他所有的线程。为了避免多个线程同时对变量进行修改,引入了线程同步机制,通过互斥锁,条件变量或者读写锁来控制对全局变量的访问。只用全局变量并不能满足多线程环境的需求,很多时候线程还需要拥有自己的私有数据,这些数据对于其他线程来说不可见。因此线程中也可以使用局部变量,局部变量只有线程自身可以访问,同一个进程下的其他线程不可访问。有时候使用局部变量不太方便,因原创 2021-07-08 17:58:06 · 370 阅读 · 0 评论 -
Mac系统安装mysqlclient报错问题汇总
找不到mysql_configMac系统下执行pip install mysqlclient时报错,提示找不到mysql_config一般是由于通过dmg或者其他方式安装mysql以后mysql_config是在/usr/local/mysql/bin/里面,这里面的文件不是在任意位置都可以访问的,所以解决办法就很清晰了:ln -s /usr/local/mysql/bin/mysql_config /usr/local/bin/mysql_config将mysql_config链接到/usr原创 2021-06-30 16:22:00 · 873 阅读 · 1 评论 -
Python默认参数是字典或列表时的注意事项
当以字典或列表为参数时,pycharm会给出以上提示,大概意思就是默认参数是列表或者字典,这个默认参数仅在初始化的时候被实现一次,而且仅此一次,如果后面的函数调用改变了这个默认参数,可能会影响到以后的这个参数。什么意思?来看个例子:def test(arr=[]): arr.append('哈哈') print(id(arr), arr)test()test()test(arr=['嘿嘿'])#2689678556552 ['哈哈']#2689678556552 ..原创 2021-04-12 18:03:13 · 628 阅读 · 0 评论 -
Python多维字典排序、获取所在层级问题
开发时,遇到这样一个问题,抽象出来就是:输入一个多维嵌套字典,输出一个列表,列表的值按照字典的键排序输出(值为字典时忽略,键重复时,键越靠近外层,值越靠前)。举个例子:输入如下字典:a = { 'a': { 'd': 3, 'c': 9, 'f': { 'a': 5, 'e': 8 } }, 'b': 1, 'e':6}输出的值应为:[原创 2021-04-09 18:34:06 · 754 阅读 · 0 评论 -
Python几种列表生成方式的性能比较
from timeit import Timerimport functoolsdef test_time(number): def decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): t = Timer(func, "from __main__ import " + func.__name__) print(t.time..原创 2021-02-24 18:49:52 · 541 阅读 · 0 评论 -
Python exec函数用法
定义和用法exec() 函数执行指定的 Python 代码。exec() 函数接受大量代码块,这与 eval() 函数仅接受单个表达式不同。语法exec(object, globals, locals)object:必选参数,表示需要被指定的Python代码。它必须是字符串或code对象(可以通过compile函数创建)。如果object是一个字符串,该字符串会先被解析为一组Python语句,然后在执行(除非发生语法错误)。如果object是一个code对象,那么它只是被简单的执行。原创 2021-02-23 17:46:52 · 3900 阅读 · 0 评论 -
python多层装饰器的执行顺序分析
装饰器本质就是一个闭包,配合语法糖就构成了一个装饰器。def c(func): print('c', func) def inner_c(): print('cc') print(func) func() print('ccc') return inner_cdef b(func): print('b', func) #@functools.wraps(func) def inner_b原创 2021-01-12 17:37:06 · 814 阅读 · 2 评论 -
Python之重写__init__()与__new__()方法时的注意事项
__new__()通常用于控制生成一个新实例的过程。它是类级别的方法。在python中,真正创建实例的是__new__方法,这个方法是基于类的层面。 __new__()至少需要传递一个参数cls,cls表示需要实例化的类。 __new__()必须要有返回值,一般都是返回父类new方法出来的实例,即return super()__new__(cls)。 __new__()的返回值必须为当前类的实例时,__init__方法才会被调用。 如果(新式)类中没有重写__new__()方法,Python原创 2020-12-31 16:19:41 · 761 阅读 · 2 评论 -
python buildin 中的一些类或方法的内容都是pass?
python的内置函数都是内嵌在解释器里面的,是使用C编写的,正常情况下你是无法查看的,只不过pycharm这种智能编辑器对其进行了一个抽象罢了,可以让你查看相应的注释。比如内置函数len,它是C编写的,编译之后就内嵌在解释器里面了。pycharm通过def len()的方式告诉你这是一个函数,名字叫做len,根据注释提示你:这是返回一个容器内部元素的个数。函数体只有一个pass,是因为代码的具体实现是通过C实现的,该文件只是起到一个让你学习的辅助作用。...原创 2020-12-31 16:20:11 · 614 阅读 · 0 评论 -
Python动态创建类
动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。而动态创建class的方法就是使用type()函数。比如,可以通过type()函数创建出Hello类,而无需通过class Hello(object)...的定义:def fn(self, name): print(name)age = 27User = type('User', (object,), dict(name=fn, age=age))user = User()user.age27原创 2020-12-03 14:30:39 · 884 阅读 · 0 评论 -
Python 列表和元组的区别
元组:元组不可变(这里的不可变是指元组元素的数据地址不变,当元组元素为列表/字典类型时,这个元素值是可以改变的,不变的是元素地址); 是可迭代的; 存储同样的数据,比列表占用更少的空间; 原子性的tuple可以作为字典的键; 可以拆包处理,当作函数的参数传递(a=(1,2) func(*a));列表:列表可变,可以使用insert、append等操作; 存储同样的数据,元组要比列表占用更多的空间;...原创 2020-08-24 20:04:27 · 260 阅读 · 0 评论 -
python列表按照多个条件排序
1、key函数实现所谓的key函数,就是以参加排序的每一项作为输入,而输出则为用来排序的keya = [(1,2), (2,4), (1,3)]a.sort(key=lambda elem: (elem[0], -elem[1]))print(a) # [(1, 3), (1, 2), (2, 4)]# 或者def my_key(x): return x[0], -x[1]a = [(1,2), (2,4), (1,3), (5,3)]a.sort(key=my_key原创 2020-06-24 17:43:56 · 4247 阅读 · 3 评论 -
强大的PIL.Image图片处理库
PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:http://pythonware.com/products/pil/。包含各种图片处理方法:格式转化设置大小添加文字颜色改变生成缩略图获取轮廓浮雕处理等等。。等等非常强大的图像处理工具。...原创 2020-06-15 15:04:09 · 419 阅读 · 0 评论 -
对A列表进行排序,排序规则为A元素在B列表出现的顺序
A = [1,6,3,5,2]B = [3,2,5,1,6]A.sort(key=lambda elem:B.index(elem))print(A) #[3, 2, 5, 1, 6]a = [ [1,2,3], [2,3,4], [4,2,3], [3,4,5], [5,5,6], [4,5,6],]b = [5,1,2,4,3]a.sort(key=lambda elem:b.index(elem[0]))print(a) .原创 2020-06-11 10:38:49 · 553 阅读 · 0 评论 -
Python深拷贝、浅拷贝
浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。深拷贝是对于一个对象所有层次的拷贝(递归)。1、深拷贝a = (1,2,3) b = a.copy.deepcopy()外层不可变(如元祖),内层全为不可变类型时,a、b地址一样。a = (1,2,[3,4,5]) b = a.copy.deepcopy()外层不可变(如元祖),内层有可变类型时,a、b地址不一样, 但[3,4,5]这个可变元素的地址一样。a = [1,2,3] b = a....原创 2020-06-03 13:25:33 · 165 阅读 · 0 评论 -
简述 迭代器 | 生成器 | 可迭代对象 | 以及应用场景
迭代器协议什么是迭代器协议对象需要提供next方法,它要么返回迭代中的下一项,要么就引起一个StopIteration异常,终止迭代.可迭代对象实现了迭代器协议的对象就是可迭代对象(实现方式是,实现iter方法)协议协议是一种规定,可迭代对象实现迭代器协议,Python的内置工具(如for,sum,min,max,in)就可以使用迭代器协议访问对象.例如文件之所以可以被for循环...原创 2019-12-24 10:39:13 · 1507 阅读 · 0 评论 -
利用Pyinstaller打包.py文件为.exe可执行文件
安装: pip install pyinstaller打包单个文件:pyinstaller -F demo.py (-F打包成一个exe文件,-D打包成exe文件和多个dll依赖文件)打包多个文件: pyinstaller main.py -p mysql.py -p other.py --hidden-import mysql --hidden-import other...原创 2019-12-09 13:45:49 · 171 阅读 · 2 评论 -
Python内存管理机制
一、引用计数python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。总结一下对象会在以下情况下引用计数加1:1.对象被创建:x=42.另外的别人被创建:y=x3.被作为参数传递给函数:foo(x)4.作为容器对象的一个元素:a=[...原创 2019-11-14 09:27:04 · 2310 阅读 · 2 评论 -
Python 中的__dict__
1、无处不在的__dict__ 首先看一下类的__dict__属性和类对象的__dict__属性 1)类的静态函数、类函数、普通函数、全局变量以及一些内置的属性都是放在类__dict__里的 2)对象的__dict__中存储了一些self.xxx的一些东西class A(object): a = 0 b = 1 def __init__(sel...原创 2019-10-31 12:01:55 · 381 阅读 · 0 评论 -
Python利用Reportlab生成PDF文档
通过整整两天时间的学习。已经基本摸清reportlab生成pdf的方法。下面记录我的学习成果:reportlab文档:https://www.reportlab.com/docs/reportlab-userguide.pdfreportlab实例:https://www.programcreek.com/python/index/1920/reportlab.platypusrepo...原创 2019-10-30 15:51:30 · 10372 阅读 · 11 评论 -
Python用元类实现单例模式
用元类实现单例的好处是:只需要写一次单例实现的逻辑代码。当需要创建单例时,只需要指定元类即可。尤其是在大型项目中代码多处需要使用单例模式时尤其方便。实现代码请参考https://blog.csdn.net/bocai_xiaodaidai/article/details/102513892...原创 2019-10-12 10:34:48 · 1257 阅读 · 0 评论 -
Python抽象类
抽象类:如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性。抽象类可以借助python的abc模块实现。抽象类不可以被实例化,抽象类中抽象方法不需要实现,一般写pass。子类必须要实现被@abstractmethod装饰的抽象方法。抽象类中可以定义一般方法。普通父类完全可以实现抽象类功能为什么还要定义抽象类呢?抽象...原创 2019-10-12 10:29:51 · 449 阅读 · 0 评论 -
Python元类
究竟什么是元类:元类就是用来创建类的“东西”。你创建类就是为了创建类的实例对象,不是吗?但是我们已经学习到了Python中的类也是对象。好吧,元类就是用来创建这些类(对象)的,元类就是类的类。我要一大群的类都具有一种特点,我怎么给他们加上呢?模板嘛,我从这个模板创建一群类不就OK了?那就需要元类了。__metaclass__属性:__metaclass__属性是用来指明创建类...原创 2019-10-12 09:47:41 · 191 阅读 · 0 评论 -
Python设计模式 (代码实现)
一、设计模式分类创建类设计模式 单例模式、工厂模式、建造者模式、原型模式 结构类设计模式 装饰器模式、适配器模式、门面模式、代理模式、组合模式、享元模式、桥梁模式 行为类模式 策略模式、责任链模式、命令模式、中介者模式、模板模式、迭代器模式、访问者模式、观察者模式、解释器模式、备忘录模式、状态模式 二、创建类设计模式1、单例模式单例模式就是确保一个类...原创 2019-10-09 13:18:36 · 1181 阅读 · 0 评论 -
Python实现xls文件文本替换(保留原格式)
from xlrd import open_workbookfrom xlutils.copy import copydef get_safe_xls(filepath): wb = open_workbook(filepath, formatting_info=True) #formatting_info保留原格式,只支持xls文件,对xlsx格式无效 ...原创 2019-08-22 09:33:04 · 4635 阅读 · 8 评论 -
Python实现PDF、doc、docx、xls、xlsx文件文本替换(保留原格式)
需求:替换pdf文件中的指定内容解决思路:doc、docx、pdf、xls等文件都是以二进制形式保存,不能直接通过read('r')读取文件原始内容,需要转换为html文件,html文件可以通过read('r')获取文本内容,在进行文本替换。替换doc、docx文件指定内容:可以利用win32com库直接进行替换(只适用于win系统) 或者转为html格式处理替换xls文件...原创 2019-08-16 15:05:36 · 5036 阅读 · 0 评论 -
Python 实现doc docx xls pdf html等文件格式互转
doc、docx、xls 转 pdf:利用libreoffice工具,libreoffice安装请自行百度。 cmd = 'libreoffice --invisible --convert-to pdf --outdir "%s" "%s"' % (out_dir, filepath) code = os.system(cmd) #成功返回0,失败返回1doc、docx、xls ...原创 2019-08-16 14:44:41 · 3093 阅读 · 0 评论 -
Python的hasattr() getattr() setattr() 函数使用方法详解
hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。需要注意的是name要用括号括起来 1 >>> class test(): 2 ... name="xiaohua" 3 ... def run(self): 4 ... ...原创 2019-06-19 13:26:41 · 4502 阅读 · 0 评论 -
Python类继承问题
class A(object): def a(self): self.b() def b(self): print('A---b')class B(A): def b(self): print('B---b') def c(self): super(B, self).a()B().c() # ...原创 2019-06-21 14:05:49 · 6615 阅读 · 0 评论 -
Base64编码
Python base64模块是用来作base64编码解码的。python2中:import base64 str1 = u'我是一个字符串'str2 = base64.b64encode(str1) str3 = base64.b64decode(str2) python3中:base64.b64encode必须接收二进制数据base64.b64decode得到的...原创 2019-06-27 11:04:07 · 380 阅读 · 0 评论 -
Base64模块、pickle模块、json模块、encode/decode的使用
base64:将特殊格式字符串或者二进制数据转化为可打印的字符串(只包含字母数字和+ / =),并且能在网络中进行传输。pickle:将python数据类型(字符串、字典、列表、函数等等)转化为字符串类型。可以将两者结合使用,从而对数据进行加密传输。...原创 2019-06-27 13:34:31 · 2945 阅读 · 0 评论 -
python中有趣的hashids库(加密数据库id等数字)
Hashids是一个非常小巧的跨语言的开源库,它用来把数字编码成一个随机字符串。它不同于md5这种算法这种单向映射,Hashids除了编码还会解码。拿论坛来说,一般帖子在数据库里的id都是顺序递增的,但是你可能不想在url上直接把id暴露出来,以免爬虫直接遍历id爬取你的内容,给你带来损失。那现在你就可以使用Hashids把这个id搞乱,让它失去顺序性,无法直接遍历,这样就可以直接提高了爬虫的...原创 2019-06-27 13:45:00 · 4178 阅读 · 0 评论 -
python列表转字符串的一个小技巧
列表转字段这听起来应该很简单吧,比如下面的例子:a = ['aa','bb','cc']b = ''.join(a)print(b) # 'aabbcc'但是当列表中有非字符串时,大概率会报错了。因为join是将字符串拼接。那应该怎么办呢?可以利用map函数,将列表中的数字转为字符串。a = [1,2,3]b = map(str, a) c = ''.join(...原创 2019-07-05 09:42:43 · 584 阅读 · 0 评论 -
一文搞懂yield生成器、@contextmanager 装饰器、with语句、以及实际开发中三者的结合使用
在了解contextmanager之前有必要解释下生成器的概念:一、生成器生成器:生长器是一个可迭代对象,主要用于生成一个序列,能够用next()获取生成器的下一个值,在需要生成的序列元素较多时,使用生成器可以节省内存空间。生成器与普通函数的本质区别:普通函数一次返回所有结果(比如一个包含1亿个值的列表),而生成器只有你调用next()时,才会返回一个值,并且终止生成器的运行...原创 2019-07-12 10:01:09 · 2781 阅读 · 0 评论 -
Python自定义上下文管理器对象
自定义上下文管理器对象有两种方式,可以参考我的这篇文章https://mp.csdn.net/postedit/95587814的第二和第三部分,里面写的已经很详细了。原创 2019-07-12 13:37:09 · 2080 阅读 · 2 评论 -
python中的 os.mkdir和os.mkdirs,os.rmdir()和os.removedirs()
创建目录 在Python中可以使用os.mkdir()函数创建目录(创建一级目录)。 其原型如下所示: os.mkdir(path) 其参数path 为要创建目录的路径。 例如要在D盘下创建hello的目录 >>> import os >>> os.mkdir('d:\hello') 可以使用os.makedirs...原创 2019-08-06 11:17:29 · 6104 阅读 · 0 评论