python编程
python编程
S_o_l_o_n
logic
展开
-
python自定义库的打包和安装
要将自定义库安装到python的三方包地址site-packages中,除了可以直接的复制之外,更为合理科学的方法是通过build和install的方式进行。因为直接复制仅仅作为一种临时的简单的方法,而且只能针对源码进行,也不好进行科学管理,相对的trciky一些,后者才是更为科学合理的工作流。通过打包的方式进行,其需要先将原始的自定义库进行build,生成wheel文件或者压缩后的源码文件,然后通过pip直接安装即可。当然这里对库进行打包,需要依赖专门的工具,本文使用的是相对简单的flit工具。原创 2024-04-06 23:32:15 · 1004 阅读 · 0 评论 -
python模块循环导入问题解析
在python3中,只要执行import a后者from . import a,即只要a在import语句之后且被执行,那么a就会被加入到sys.modules中,而后续尽管在模块a被完全执行完毕之前,有模块b导入a,由于a已经在sys.modules中,b会直接从缓存中导入a,而不是重新执行a,因此这时避免了语法上无限循环导入的问题,因此导入语句可以顺利执行。在一个包中,如果A的完全导入依赖于B的导入,但是B的完全导入又需要导入A,即两个模块之间存在相互导入,那么就会引发循环导入问题。原创 2023-01-19 15:33:21 · 1402 阅读 · 0 评论 -
Spyder编辑器关于自定义库无法提示代码补全问题修复
博主的自定义库,已经将库路径加入了环境变量的PYTHONPATH中,最开始可以正常的导入,并且在Spyder编辑器中也可以和其他标准库以及三方库一样,有代码补全提示。但是某天突然在Spyder中对于自定义的库就无法提示代码补全了,但是标准库已经其他三方库是可以正常提示的,而且在Ipython中,代码提示一切都正常。原因找到后,解决方法就很简单,打开上图的PYTHONPATH管理器,手动显式的再次在Spyder中添加自定义库的所在路径。原创 2022-10-18 12:33:19 · 920 阅读 · 0 评论 -
python进程池之创建子任务的函数总结
目录mapapplymap_async和apply_asyncimap和imap_unorderedstarmap和starmap_async python多进程标准库multiprocessing通过进程池启动多进程有以下几种方式,本文旨在说明这几种方式的区别:map、apply、map_async、apply_async、imap、imap_unordered、starmap、starmap_async。map函数签名:(func, iterable[, chunksize])原创 2022-06-25 15:14:22 · 1521 阅读 · 0 评论 -
python模块导入详解
目录包和模块模块导入绝对导入sys.modulessys.meta_pathsys.path相对导入__init__.py相对导入mian脚本中的相对导入Reference包和模块我们可以在一个脚本中定义变量、函数和类,并添加逻辑,但是当某个项目具有复杂的逻辑时,我们希望把这些逻辑分解成不同的脚本,并以一定的合理的方式组织成层级结构,这种具有层级结构的包含脚本的文件夹就称为包。模块通常指的是定义了变量、函数和类的脚本。但...原创 2022-05-03 21:09:26 · 7998 阅读 · 0 评论 -
python中导入字符串对象命名的模块
通过标准库importlib中的import_module函数实现,该函数返回被导入的对象。如下,就可以通过字符串对象导入模块test_module,并且重命名为tm,效果等于import test_module as tm。import importlibm = 'test_module'tm = importlib.import_module('%s'%m)...原创 2022-03-19 22:31:37 · 613 阅读 · 0 评论 -
python可迭代对象、迭代器和生成器
可迭代对象指的是兼容__iter__函数的对象,调动该函数会返回一个生成器,生成器指的是兼容__next__函数的对象,__next__函数会单次获取便利对象的值并返回。对于迭代工具,实际上遍历的是迭代器,因此,对于迭代工具(比如for循环),其实际上需要先获取一个迭代器,所以对于可迭代对象,python会先通过iter内置函数作用在可迭代对象上,获取一个迭代器,然后再进行单次遍历(对于已经是生成器的对象,iter函数返回的就是该对象本身),这就是迭代协议。为什么需要区分可迭代对象和...原创 2022-01-08 19:39:18 · 378 阅读 · 0 评论 -
利用python执行linux命令的几种方式和区别
本文介绍三种在python执行linux命令的方式,三种方式都是基于python的标准库实现,因此不需要额外安装第三方库。os.system() os.system(cmd),其中cmd就是需要执行的linux命令。该方式会阻塞主进程,直到命令执行结束并返回状态,如果返回的状态值为0,表示命令正常执行,如果不为0,则表示命令执行异常。要注意的是,该方式执行linux命令,会直接打印出命令执行的结果,但是不会作为对象返回,因此程序无法直接获取命令执行的结果。os.po...原创 2021-11-03 13:28:57 · 1277 阅读 · 0 评论 -
python pdb之快速事后调试
事后调试(post-mortem debugging)指的是程序运行发生异常而进入的调试模式。 当执行一个python脚本触发异常时,我们可以通过该方式进行问题的快速定位。使用如下命令执行需要调试的python脚本: python -m pdb script.py,该执行方式使用了python的标准模块pdb,pdb是python用来调试程序的模块。使用该方式执行脚本,脚本会从第一行开始就进入调试模式,然后直接输入c回车,程序就会一直执行,直到程序遇到异常;当程序遇到异常后...原创 2021-09-10 21:40:32 · 829 阅读 · 0 评论 -
python充分理解def语句
python中def是一个可执行语句,用来定义一个函数。当解释器执行def语句时,其会在内存中创建一个函数对象,除此之外,还会创建一个该函数对应的本地命名空间。这里需要注意的有两点:1 该命名空间是在执行def语句时就已经创建的,而不是在函数调用时; 2 这个命名空间中有包含哪些变量。 对于2点,取决于函数签名已经函数类型。如果函数具有默认参数,那么该命名空间会包含默认参数变量,此外,如果该函数还是一个闭包,那么该命名空间还包含了外层函数的自由变量(即在外层函数定义,但是在...原创 2021-07-28 19:55:45 · 7728 阅读 · 0 评论 -
python作用域详解
命名空间 一个程序具有多个变量,为了更好的组织这些变量,更好的控制变量之间的命名冲突以及更好的管理变量在程序中的角色,python使用了命名空间这样一种结构来实现这个目的。python中,一个命名空间由多个变量组成,且以字典的形式来保存这些变量,其中key是变量名称,value是变量名对应的对象。 同一个命名空间中的变量名是唯一的,不同命名空间中的变量相互独立(这里的相互独立指的是不会相互冲突相互覆盖,但是可能会有相同的对象引用(即指向同一个内存中的对象))。既然命名空...原创 2021-07-27 14:52:03 · 1510 阅读 · 0 评论 -
python闭包
python有四种作用域,本地作用域(Local Scope)、闭包(Enclosing Scope)、全局作用域(Global Scope)以及内置作用域(Built-in Scope),作用域就是放置变量的命名空间,程序中的任何一个变量,都一定且唯一归属于某个层级的作用域。本文主要讲解一下作用域之中的闭包。 当某个变量在一个函数中定义,同时被其内部的嵌套函数所引用,那么python就会创建一个闭包,该变量就会归属于这个闭包,如下所示。def outer(): ...原创 2021-07-24 21:58:04 · 210 阅读 · 0 评论 -
python OOP基础
类的定义 通过class语句定义一个类,class语句是一个可执行语句,类似于def。可执行语句,即只有当python解释器执行到该语句,类对象才会被定义,不然是不存在的。要注意的是,执行class语句或者def语句,只是在解释器中创建一个具有相应名称类对象或者函数对象而已,类里面或者函数里面的语句并不会执行,只有当创建实例或者调用相应函数时,里面的语句才会被执行。因此,即使类里面或者函数里面的语句语法有问题,在执行class或者def语句时并不会报错。类属型和实例属性 ...原创 2021-05-26 13:22:31 · 238 阅读 · 0 评论 -
python 性能提升之使用deque代替list
使用list的好处是,对于固定长度的情形,list各种操作都是被极致优化的,比如当我们想要直接通过下标获取元素时,其复杂度为O(1),是高效的获取方式。但是,当我们需要频繁对list进行一些pop(0)或者insert之类的会同时改变list的长度和元素索引的操作时,会导致list在内存中复制,即空间复杂度为O(n)的操作;此外,如果频繁的append,且会造成list对象的元素数量较大的变化,同样也会进行复制。此时,我们可以使用python标准库collections中deque数据结构,这...原创 2021-05-11 20:17:30 · 1052 阅读 · 0 评论 -
python避免可变对象作为默认参数(默认参数多次调用一次计算)
python解释器对于函数的默认参数,在第一次调用时,会计算一次,即在内存中创建一个对象保存默认参数,而后如果继续调用,且对于默认参数没有显性传参,那么后续调用的同一函数的同一默认参数共享内存。如下所示。def test_id(x,y=123456): print(id(x)) print(id(y))test_id(123123)out:112356112522test_id(123123)out:112360112522test_id(123123)o原创 2021-03-24 13:55:54 · 601 阅读 · 0 评论 -
python 函数传参实际传递的是对象引用
python的函数传参实际上传递的是对象的引用,因此,对于可变对象,函数中对对象的修改会直接影响外部对象,对于不可变对象,由于无法对对象进行修改,因此不会影响外部对象。可以通过下面例子具体分析。def f1(x): print(id(x)) x += 1 print(id(x))x = 1prind(id(x))f1(x)out:135781357816589可以看到,外部变量x和函数内部参数变量x具有相同的id,因此实际上将x作为参数传递给f1时,就是将原创 2021-03-23 15:28:03 · 997 阅读 · 0 评论 -
python += 赋值和一般赋值的区别
查看如下例子:l1 = [1]print(id(l1))l1 += [2]print(id(l1))l2 = [1]print(id(l2))l2 += [2]print(id(l2))上面对于l1,两次print的输出结果是一样的,而对于l2,两次输出的结果是不一样的。因此,通过这个例子可以知道,对于可变对象,+=赋值会在原地修改对象,而不是在内存中新建一个对象;而普通赋值则是会在内存中新建一个对象。对于不可变对象,无论哪种赋值,都会在内存中新建一个对象。...原创 2021-03-23 14:14:17 · 387 阅读 · 0 评论 -
python 异常捕捉finally语句陷阱
定义如下函数:def finally_trap1(): try: raise IndexError('index error') except KeyError: print('key error got') finally: print('finished') return def finally_trap2(x): try: if x > 1: ret原创 2021-03-22 16:41:42 · 372 阅读 · 0 评论 -
python 区分is和==
is: 对象标识符,判断是否同一个对象,即是否具有相同的内存地址,一般通过id(object)返回的值就可以判断两个对象是否相同。==: 判断值是否相等。直接调用了对象的__eq__()钩子,该方法可以被重载以实现不同的比较行为。一般情况下,相同的对象具有相等的值,即is 判断为True,那么==也为True,但是对于NaN的判断除外。对于NaN,两个NaN对象用is判断为True,但是并不相等,因为NaN实际上是一类float,故逻辑上也应该是不想等的,这个通过定义__eq__()函数的特殊行为既原创 2021-03-22 14:46:49 · 203 阅读 · 0 评论 -
python正则匹配替换指定开头和结尾的字符串
场景: 替换字符串s中s1开头和s2结尾的子字符串,但是保留s1和s2,即替换s1 s2之间的内容,替换的新内容为s3。方式:pattern=re.compile(re.escape(s1(.*?)s2),flags=re.S); re.sub(pattern,s1s3s2,s)即可。其中指定re.S是为了可以跨行匹配,让点号可以匹配换行符。...原创 2021-02-23 20:32:18 · 4217 阅读 · 0 评论 -
python正则表达式点号.匹配换行符
方式:通过flags参数,指定re.S即可,这样点号就可以匹配换行符了。例如:re.sub()函数,使flags=re.S即可,多个flag可以通过|连接。原创 2021-02-23 18:57:08 · 3433 阅读 · 0 评论 -
python离线安装第三方库的方式
本文离线安装的语境为:现在给无法连接互联网的机器B安装python的第三方库,机器A可以联网,现先通过A下载需要的文件,然后拷贝到B,再在B上进行离线安装。上述语境的问题在于,通过A下载的文件拷贝到B后,需要满足B可以完全的离线安装,所以许多库通过下载.whl文件安装的方式便行不通,因为通过.whl文件安装依然很可能需要安装额外的依赖项,而依赖项的安装需要联网才能进行。本文讲解以下三种方式。方式一最简单的,现在A机器上通过pip命令安装好,然后进入python存放第三方库的site-pack原创 2020-12-02 18:12:09 · 11307 阅读 · 2 评论 -
python为项目创建虚拟环境
不同的项目可能会使用不同版本的包或库,并且我们希望项目的依赖库尽量的少,所以不需要的库便不再安装,尽量保持项目的干净整洁,这样对于不同的项目,有必要给其创建不同的环境。python中,可以通过虚拟环境来实现这个想法。一个虚拟环境包含了python解释器和项目需要的库,以及一些构成虚拟环境的文件。其和系统python以及其他虚拟环境独立,所以我们可以把一个虚拟环境当作一个独立的开发执行环境,从而保持其干净独立。虚拟环境一旦成功创建,就可以像普通的python一样去使用和工作,比如执行脚本以及使用pip安装原创 2020-12-02 15:07:34 · 2115 阅读 · 0 评论 -
python中时间戳(epoch)和日期的相互转换
1 epoch时间转日期使用标准库datetime,具体来说,使用datetime.datetime.fromtimestamp(timestamp,tz=None)方法。其中timestamp为浮点数,表示epoch秒数,tz表示时区,默认为None,表示原创 2020-12-01 22:38:49 · 4924 阅读 · 1 评论 -
numpy中的浅拷贝(视图)和深拷贝
浅拷贝会在内存中产生一个不同的对象,但是由于拷贝的是父对象,子对象并没有拷贝,所以浅拷贝会存在共享内存的情况。实际上,numpy中的视图就是一种浅拷贝。 numpy中,一个ndarray的视图和原ndarray是不同的对象,但是其共享ndarray值的内存,所以当修改其中一个对象的值的时候,两个对象都会发生改变。这样两个对象是互相关联的,这样做的好处就是不会涉及到数据在内存中的复制,这样可以节省空间,提高性能;而不好的地方就是两个对象是并不是相互独立的,有时候我们并不预期改变一...原创 2020-09-26 23:19:35 · 374 阅读 · 0 评论 -
python中的引用、浅拷贝和深拷贝
变量名和对象之间,存在引用的关系,即变量名通过引用指向对象,而对象和其在内存中的数据又存在复杂关系,在python中的对象是一种高级抽象,所以并没有简单的指针概念。对象本身在内存中是一个独立的存在,一个对象的值可能包含多个其他对象的值的指针,也就是共享内存。当两个变量具有相同的引用时,那么这两个变量肯定具有相同的内存地址,因为它们指向了同一个对象;而两个不同的对象具有不同的内存地址,但是其子值可能是共享内存的,比如两个列表对象,共享一个子列表对象。例如下面的l1和l2具有相同的引用,所以其指向...原创 2020-09-26 22:50:41 · 362 阅读 · 0 评论 -
python2和3的包导入和包内导入
目录包导入包内导入利用__init__.py初始化 当我们导入自定义库时,需要注意python中关于包导入以及包内导入的知识。对于python2和3对于包内导入有着不一样的方式。包导入 python的包导入需要在包内部有__init__.py文件,同样的,包内如果还有包,那么要导入包内的包,包内包也需要有__init__.py文件,以此类推。__init__.py文件在包被导入时会被执行,并且执行之后该文件产生一个命名空间传给被导入的包变量,命名空间中的元素就...原创 2020-08-25 16:41:46 · 1135 阅读 · 0 评论 -
python之利用递归函数实现goto或者label功能
c/cpp的goto和java的label都是一种可以从指定的语句处重新运行的功能,即可以在程序的其他地方跳转到指定处重新开始执行。那么在python中,其实并没有原生支持的类似语法,但是本文将说明,利用python的递归函数也可以实现类似的功能。 比如,我们程序在运行到某处时,如果不满足某些条件,我们希望其可以在某个地方重新开始运行,这时我们就可以将这部分需要重新运行的语句以及条件判断封装成一个函数,之后再进行递归调用即可,伪代码如下所示。---some codes...原创 2020-08-15 19:15:18 · 1098 阅读 · 1 评论 -
linux下的.swap文件的生成和处理
笔者在用python和系统交互的时候,要搜索一个目录下的所有文件并做相应的处理,但是在程序中发现了一个.swap文件,这是程序非预期,所以产生了意外的结果。对此,经过查询,发现是因为笔者已经在vim下打开了该目录下的一个文件,这时就会在当前目录生成一个相应的.swap文件,该文件实际上就相当于是原始文件的一个映射,这样让你一旦打开该文件之后,就不需要再受原始文件的限制,即使原始文件被移除了,也不会影响你对已经打开文件的查看。因此实际上,.swap文件就类似于一种缓存机制。 但是...原创 2020-08-15 18:10:26 · 1776 阅读 · 0 评论 -
python可迭代参数解包和字典参数解包
python的函数参数解包中,对于一般的可迭代对象,比如元组、列表等参数,可以直接通过单个星号*对其解包;但是如果是想对字典参数解包,但星号将只会得到字典的keys,这是因为直接对字典迭代实际上只是对字典的键进行迭代,所以如果想要正确的对字典进行解包,就需要使用双星号**。单星号对可迭代对象参数解包后得到元组作为位置参数传入,而双星号**对字典参数解包后作为关键字参数传入。 可以参考如下示例做进一步理解。注意,python的可变参数中,*args接收多出来的位置参数,而**kw...原创 2020-07-22 12:55:48 · 1018 阅读 · 2 评论 -
python 一行代码实现对列表的快速等分
定义如下函数chunk,参数l为要划分的列表,chunk_size为每个划分的大小。可以看到,函数中只有一行代码,即可实现该功能。import mathdef chunk(l,chunk_size): return list(map(lambda x:l[x*chunk_size:(x+1)*chunk_size],range(0,math.ceil(len(l)/chunk_size)))l=[0,1,2,3,4,5,6,7,8,9]chunk(l,3)[out]:[[0, 1原创 2020-06-30 13:57:11 · 5331 阅读 · 0 评论 -
深度分析python UnboundLocalError: local variable ‘x‘ referenced before assignment
当我们对一个变量进行引用,但是该变量在该引用操作之后又被绑定为本地变量,那么就会抛出UnboundLocalErro异常,一般是变量在引用前未被赋值。那么python里有哪些操作会将一个变量绑定为本地变量呢?1、赋值语句;2、for i in x语句中的x,会将x绑定为本地变量;3、del x语句会将x绑定为本地变量;4、import x语句会将x绑定为本地变量;5、try:...except Exception as x语句会将x绑定为本地变量。因此如果在上述语句之前...原创 2020-06-09 23:51:12 · 4628 阅读 · 2 评论 -
整数转浮点数精度溢出的原因和处理方式
对于64位浮点数来说,其尾数有53位(包含首位的隐藏位),当一个整数转为浮点数时,只有当该整数的二进制位数不超过53位时,64位浮点数才可以精确的表示该整数,不然会造成精度丢失。试想一下,当一个十进制整数的二进制有54位,那么最后一位无法准确储存,64位浮点数就会造成精度的丢失,自然地,当位数超过53位后,64位浮点数的可表示整数并不是连续的。 在笔者的这篇文章《浮点数的各种最值推算以及对python sys.float_info的解释》中,讲过浮点数能在该范围内精确表示的最大...原创 2020-06-01 23:25:38 · 4021 阅读 · 0 评论 -
浮点数的各种最值推算以及对python sys.float_info的解释
目录最大和最小的正规约数取值最小和最大的正非规约数取值浮点数能在该范围内精确表示的最大十进制整数大于1的最小规约数和1之间的距离epsilon对python sys.float_info的解释 本文将以64位浮点数为例,对64位浮点数的取值范围进行推算,并通过python的sys.float_info的信息,对其逐一解释,以对浮点数有一个更好的理解。本文需要笔者的这篇文章作为预备知识。最大和最小的正规约数取值 对于64位整数来说,由于规约数的移码后的指...原创 2020-05-31 23:38:27 · 5812 阅读 · 1 评论 -
使用python获取某个月的天数和日期
可以使用python的标准库calendar,如下代码所示。import calendarres = calendar.monthrange(2020,5)print(res)[out]:(4,31) #该元组中,第一个元素表示5月份第一天是周五(0表示周一,6表示周日),第二个元素表示天数 此外还可以直接获取一个月的所有具体日期的迭代器,返回datetime.date。如下所示。下面两个例子中,分别使用了calendar.Calendar().itermon...原创 2020-05-30 10:53:53 · 7349 阅读 · 0 评论 -
被装饰函数无法多进程原因分析以及解决办法
被装饰器装饰的函数无法多进程原因 python多进程的原理是通过pickle多进程函数名,然后新建一个子进程并在子进程中导入模块后unpickle,通过访问模块的该函数来实现函数在子进程中的运行的,关于pickle更详细的说明可看笔者的这篇文章。关于多进程编程中的pickle的一个重点是,对于多进程函数的pickle,只会pickle其函数名,也即f.__name__属性,然后通过模块的点号访问,因此该函数必须是可以通过模块点号访问到的,这也就是为什么要求被pickle必须被定义在模块的顶层...原创 2020-05-14 21:41:39 · 1209 阅读 · 0 评论 -
python正则表达式使用规范
匹配字符串中的/**,对比以下三种用法。import res = 'justfortesting/**csdopov**/python'# 第一种方式re.findall('/\\*\\*',s)[out]: ['/**']# 第二种方式re.findall(r'/\*\*',s)[out]: ['/**']# 第三种方式pattern = re.es...原创 2020-05-02 22:29:22 · 505 阅读 · 0 评论 -
python字符串的转义注意点
python字符串对象对于某些字符定义了转义特性,以反斜杠\作为转义标志。当python解释器对字符串对象做处理时,要记住首先始终是要对字符串做转义处理的。 在理解python字符串的转义时,需要注意两个概念,分别是转义前字符串和转义后字符串。一般情况下,直接和用户交互的应该是转义后字符串,这也是我们通常所正常理解的不需要转义知识的字符,即一个反斜杠就是\,而不是转义...原创 2020-05-02 17:32:20 · 1001 阅读 · 0 评论 -
python使用正则表达式剔除指定开头和结尾之间的所有字符串内容
这里的一个基本的需求就是对于一个字符串,想要剔除指定开头和结尾及其之间所有的内容,一个经典的场景就是剔除一个脚本里面所有的以/**开头和**/结尾的注释。对此,需要注意的点有三个:1、如何跨行匹配/**和**/之间的所有内容,因为.无法匹配换行符;2、要注意使用非贪心匹配,以防把代码也剔除;3、如何高效剔除匹配到的内容。 具体的正则表达式如下。这个正则表达式中要注意对...原创 2020-05-02 15:34:04 · 5303 阅读 · 10 评论 -
python正则表达式匹配之转义符\陷阱
python中的转义就是通过转义符号\对字符进行字面意思和字符特殊定义(如果有的话)之间的转换,python中使用标准模块re进行字符串的正则表达式匹配时,需要特别注意转义符的使用,如果不了解正则表达式和字符串的转义符,那么很容易在使用正则表达式匹配时犯错。 在使用python的re模块进行正则匹配时,关于转义符需要注意的点有三处:1、正则表达式和字符串匹配的经历过程...原创 2020-05-02 01:59:08 · 2544 阅读 · 0 评论