Python成长之路
文章平均质量分 72
涉及python基础、python高阶等等
敲代码敲到头发茂密
欲戴王冠,必承其重
展开
-
Python是如何进行内存管理的?(图文讲解)
gc.set_threshold设置垃圾回收阈值(收集频率)。将threshold0设为零会禁用回收。先调用dela;再调用gc.collect()即可手动启动GC(嵌套的引用删除不了,因为引用计数为1)Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。在python的底层中,再去维护一个链表,这个链表中专门放那些可能存在循环引用的对象。为什么引用计数为2呢?为了解决上述的问题,...原创 2022-07-21 07:58:25 · 11114 阅读 · 17 评论 -
关于AttributeError: type object ‘XXX‘ has no attribute ‘XXX‘的问题
关于AttributeError: type object ‘XXXXXX’ has no attribute 'name’的报错的原因,先运行运行一段代码例如:class Person(object): def __init__(self,name): self.name=name def play(self): print('工作')if __name__ == '__main__': p=Person('KB') p.play原创 2021-10-19 08:02:56 · 37856 阅读 · 13 评论 -
python—类和对象之浅拷贝和深拷贝详细讲解
一、变量的赋值操作定义:只是形成2个变量,实际上还是指向同一个对象代码如下:内存示意图:将创建CPU类的实例对象赋值给cpu1进行储存,所以cpu1的id为0212,然后将cpu1赋值给cpu2,cpu2的id也为0212;cpu1和cpu2指向同一个类的实例对象。在一个类中,有一个类的实例对象,用2个变量去存储。二、浅拷贝定义:python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对象与拷贝对象会引用同一个子对象代码:代码执行结果为:可以看到compute原创 2021-08-18 07:54:04 · 5876 阅读 · 0 评论 -
python知识点汇总(十一)
首先展示解封装将1,2,3封装到元组mytuple中,再将值解封装到变量x,y,zprint(x)print(y)print(z)a = 0b = 1print(a)func(8)原创 2024-04-12 21:42:06 · 1680 阅读 · 48 评论 -
python中字典的底层是怎么实现的?
python字典的底层实现的是哈希表。调用python内置的哈希函数,将键(key)作为参数进行转换(哈希运算+取余运算),得到一个唯一的地址(地址的索引),然后将值(value)存放到对应的地址中(给相同的键赋值会直接覆盖原值,因为相同的键转换后的地址时一样的)哈希表(Hash Table,又称为散列表)是一种线性表的存储结构。由一个直接寻址表 T (假设大小为m) 和一个哈希函数 h(k) 组成。对于任意可哈希对象,通过哈希函数(一般先进行哈希计算,然后对结果进行取余运算),将该对象映射为寻址表的索引原创 2024-04-11 10:09:36 · 1083 阅读 · 53 评论 -
MQ消息队列详解以及MQ重复消费问题
现有ABCDE五个系统,最初的时候BCD三个系统都要调用A系统的接口获取数据,一切都很正常,但是突然,D系统说:我不要了,你不用给我传数据了,A系统无奈,只能修改代码,将调用D系统的代码删除,这时候还没删除呢,E系统发送了请求,但是A系统这时候还没处理完D系统的请求,A系统卒!看下图↓↓↓↓↓↓↓↓↓↓↓。用户发送请求到A系统耗时3ms,A系统发送三条消息到MQ,假如耗时5ms,用户从发送请求到相应3ms+5ms=8ms,仅用了8ms,用户的体验非常好。详情如下图↓↓↓↓↓↓。原创 2024-04-03 08:09:58 · 1829 阅读 · 62 评论 -
python知识点总结(十)
当系统中存在大量的 CPU 密集型任务,会导致 CPU 处理线程变慢。:和处理进程类似,线程进行大量的 I/O 操作也会导致 CPU 处理线程变慢,因为线程需要等待 I/O 操作完成才能继续执行。当进程需要进行大量的输入输出操作时,CPU处理进程的速度会变慢,这是因为I/O操作相比于CPU处理速度较慢。操作:在栈中,数据的插入和删除都是在栈顶进行,压入数据称为入栈(push),弹出数据称为出栈(pop)。操作:在队列中,数据的插入是在队尾进行(enqueue),数据的删除是在队头进行(dequeue)。原创 2024-03-28 21:55:57 · 2058 阅读 · 61 评论 -
python知识点总结(九)
客户端发送请求,用send不用sendto,客户端知道服务器的ip和端口,服务器也知道客户端的端口和ip,因为是面向连接的。等待客户端的连接请求,当前函数是线程阻塞的函数,accept返回2个值,第一个:新的socket,第二个:客户端地址,新的字典为 : {‘age’: None, ‘name’: None, ‘sex’: None}新的字典为 : {‘age’: 10, ‘name’: 10, ‘sex’: 10}新字典为: {‘Name’: ‘Runoob’, ‘Age’: 7}原创 2024-03-26 10:03:41 · 1540 阅读 · 19 评论 -
python知识点总结(八)
2、大小固定:数组的大小在创建时就被确定了,无法动态改变大小,如果需要扩容,通常需要重新分配一块更大的内存空间,将原有的数据拷贝过去。如果是可变对象,在函数体内的修改回影响到实际参数的值,arg2的修改,append(10),回影响到n2的值。如果是不可变对象,在函数体的修改不会影响到实际参数的值,arg1的修改为100,不会影响到n1的值。3、插入和删除效率低:由于数组的内存连续存储,插入和删除元素时需要移动后面的元素,效率较低。2、该方法只能删除开头或者是结尾的字符,不能删除中间部分的字符。原创 2024-03-24 10:55:35 · 1895 阅读 · 12 评论 -
python知识点总结(七)
如果是可变对象,在函数体内的修改回影响到实际参数的值,arg2的修改,append(10),回影响到n2的值。如果是不可变对象,在函数体的修改不会影响到实际参数的值,arg1的修改为100,不会影响到n1的值。:程序员需要手动管理堆内存的分配和释放,如果分配了内存但没有释放,可能造成内存泄漏。:栈内存的分配和释放是由编译器自动完成的,效率高,不会涉及内存管理算法的处理。:堆内存的动态分配和释放需要进行内存管理算法的处理,会比较耗时。真与真 真 ——》结果有假则假。字符串与数字相加:报错。原创 2024-03-22 10:48:48 · 1259 阅读 · 23 评论 -
python知识点总结(六)
浅拷贝:创建一个新的对象,但它包含的是对原始对象中包含项的引用(如果用引用的方式修改其中一个对象,另外一个也会修改改变){1,完全切片方法;3,copy模块的copy()函数}深拷贝:创建一个新的对象,并且递归的复制它所包含的对象(修改其中一个,另外一个不会改变),因此,新对象和原对象没有任何关联。2” 而言, Python 是允许连续比较的,“1 < 2==2” 相当于 ”(1 < 2) and (2。3、模块和包解决了Python中命名冲突的问题,不同的包下可以有同名的模块,不同的模块下可以有。原创 2024-03-21 10:08:43 · 1420 阅读 · 8 评论 -
python知识点总结(五)
而search()则不同,扫描整个字符串,如果产生了一个匹配正则模式就寻找到这个位置,返回相关匹配的对象。findall:在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果有多个匹配模式,则返回元组列表,如果没有找到匹配的,则返回空列表。1、协程是一种用户态的轻量级线程,协程的调度完全由用户控制;线程是进程中执行任务的基本单位(执行指令集),一个进程中至少有一个线程,当只有一个线程时,称为主线程。输出:1,2,3,12,13,23,123(组合数,不考虑顺序,所以12和21是等价的)原创 2024-03-20 10:29:12 · 1472 阅读 · 61 评论 -
python知识点总结(四)
Python中有四种作用域,分别是局部作用域(Local)、嵌套作用域(Embedded)、全局作用域(Global)、内置作用域(Built-in),搜索一个标识符时,会按照LEGB的顺序进行搜索,如果所有的作用域中都没有找到这个标识符,就会引发NameError异常。例如,可以使用cache.get(key)方法从缓存中获取数据,使用cache.set(key, value, timeout)方法将数据存入缓存,并指定过期时间。要使用Django的缓存功能,首先需要在项目的设置文件中配置缓存后端。原创 2024-03-18 23:08:44 · 1914 阅读 · 56 评论 -
python知识点总结(三)
由于内存是有限的,当计算机内存中存在大量的相互(循环)引用计数时,会占用大部分的内存;当新的变量进来时,但是内存不够用了,所以不会去开辟新的内存地址。4、使用内存分析工具:使用内存分析工具memory_profiler可以帮助我们分析内存使用情况,找到内存占用较大的部分,并进行优化。因为删除元素后,整个列表的元素会往前移动,而i却是在最初就已经确定了,是不断增大的,所以并不能得到想要的结果。3、及时释放不再使用的对象:手动解除对不再使用的对象的引用,可以加速垃圾回收并释放内存。遍历在新的列表操作,原创 2024-03-18 10:22:29 · 1384 阅读 · 44 评论 -
python知识点总结(二)
编译型语言特点:编译成二进制文件;一次编译,多次执行;执行速度快(只需要翻译一次),跨平台型比较弱翻译成C代码,再翻译成二进制,再执行;每次编译每次执行;执行速度慢(多次执行、多次编译),跨平台型比较强。原创 2024-03-17 16:48:56 · 1177 阅读 · 35 评论 -
python知识点总结(一)
WSGI:是python web应用程序与web服务器之间的通用标准接口。它定义了web服务器和python应用程序之间的通信协议,使得不同的web服务器和python框架可以无缝集成。WSGI允许开发者使用统一的方式编写web应用程序,而不用关心底层的服务器实现细节。为什么需要wsgi呢?当请求时Web服务器需要和web应用程序进行通信,但是web服务器有很多种啊,例如最新的是nginx,专门提供http服务的;原创 2024-03-16 21:19:40 · 2145 阅读 · 40 评论 -
python高级之元类
1、当我们不写MyType类时,Type中已经帮我们定义好了__init____new____call__方法了当我定义了MyType类时,__init____new____call__方法是我们自己定义的2、这就是为什么实例化对象的时候,先去创建对象再去初始化对象,Type类中已经实现了先 __new__()再__init__()3、代码从上到下执行,当执行到时先创建这个类,去MyType中的__new__()创建方法__init__()实例化方法,类在内存中创建好了,原创 2024-03-06 23:04:27 · 2464 阅读 · 58 评论 -
python递归算法
给你一个整数 n,请你判断该整数是否是 2 的幂次方。给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。与嵌套函数调用过程相比:嵌套函数是由多个函数完成的,递归是有1个函数完成的。show(9)是由show(8)的调用的,先恢复show(8)的状态。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x。整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x。输入:A = 3, B = 4。原创 2024-02-23 19:25:19 · 1683 阅读 · 3 评论 -
Python 私有变量(__)的访问和赋值以及变量前加(_)
不能直接访问__name是因为Python解释器对外把__name变量改成了_Person__name,例如,对于类Person中的私有变量__name,可以通过_Person__name来访问。python中的私有变量是以双下划线开头的变量,例如__name。内部的__sex变量已经被Python解释器自动改成了_Person__sex,而外部代码是给m实例新增了一个__sex变量。表面上看,外部代码“成功”地设置了__sex变量,但实际上这个__sex变量和class内部的__sex变量不是一个变量!原创 2024-01-08 09:06:33 · 1504 阅读 · 4 评论 -
python实现一亿个无序数找出Top100
在Python中,heapq模块提供了一些堆队列算法。其中一个功能是使用heappush()方法将元素添加到堆中。堆是树状结构,其中一个结点的值不大于其父节点的值,也称为最小堆。。这意味着堆顶元素始终是堆中的最小值。原创 2024-01-08 00:01:32 · 1141 阅读 · 4 评论 -
【算法】递归算法理解(持续更新)
问题如何分解:每次计算mid=(left+right)//2的值后,对nums[mid]与target进行对比,来改变左或者右指针。递归条件,一直更新左右指针,并且满足left原创 2024-01-04 23:29:30 · 746 阅读 · 4 评论 -
Python项目中怎么实现异步任务和定时任务
Celery是由Python开发、简单、灵活、可靠的分布式任务队列是一个处理异步任务的框架其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务。Celery侧重于实时操作,但对调度支持也很好,其每天可以处理数以百万计的任务。include:手动加载任务,然或报错,KeyError: ‘task02.write_log’如果任务定义在其他的py文件中,需要将任务(write_log)添加到include列表中;send和app对象在同一个py文件中,不用添加到include。原创 2023-08-16 13:27:35 · 406 阅读 · 0 评论 -
消息队列测试场景和redis测试场景
Broker:消息服务器,提供消息核心服务Producer:消息生产者,业务的发起方,负责生产消息传输给 broker。Consumer:消息消费者,业务的处理方,负责从 broker 获取消息并进行业务逻辑处理。读写性能优异。数据类型丰富。Redis 支持数据的备份。数据自动过期。发布订阅。分布式。原创 2023-05-13 09:07:02 · 1028 阅读 · 1 评论 -
python——GIL锁详解
对于IO密集型应用,即便有GIL存在,由于IO操作会导致GIL释放,其他线程能够获得执行权限。由于多线程的通讯成本低于多进程,因此偏向使用多线程。对于计算密集型应用,由于CPU一直处于被占用状态,GIL锁直到规定时间才会释放,然后才会切换状态,导致多线程处于绝对的劣势,此时可以采用多进程+协程。原创 2022-11-21 08:30:30 · 7933 阅读 · 38 评论 -
算法题——给你一个字符串s,找到s中最长的回文子串。
输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。*原创 2022-10-17 22:55:59 · 1708 阅读 · 64 评论 -
python——MySQL封装操作
【代码】python——MySQL封装操作。原创 2022-10-06 09:09:29 · 3348 阅读 · 32 评论 -
web应用程序中SQL注入问题
SQL注入是一种代码注入技术,一般被应用于攻击web应用程序。它通过在web应用接口传入一些特殊参数字符,来欺骗应用服务器,执行恶意的SQL命令,以达到非法获取系统信息的目的。它目前是黑客对数据库进行攻击的最常用手段之一。原创 2022-10-05 10:22:08 · 940 阅读 · 33 评论 -
python之正则表达式用法详细讲解
作用:compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。原创 2022-10-04 08:56:39 · 1679 阅读 · 34 评论 -
python——偏函数的使用
在python的内置模块functools提供了很多有用的功能,其中一个就是偏函数(partial)。把一个函数的某些参数给固定住(也就是设置默认值),返回一个新的函数,调用这个新函数会更简单。原创 2022-09-24 10:41:36 · 675 阅读 · 61 评论 -
python——上下文管理器with
当使用with读取文件后,在with外部再次读取文件时也会报异常。with是用来启动对象的上下文协议的,不是用来专门操作文件的。当使用open读取文件,关闭文件,再次读取文件时报异常。:退出上下文(with中的代码快执行完毕之后):进入上下文(with 操作对象时)方法的返回值正是输出的对象。原创 2022-09-20 09:01:41 · 874 阅读 · 42 评论 -
python中第三方库Faker的使用
Faker是一个Python包,开源的GITHUB项目,主要用来创建伪数据,使用Faker包,无需再手动生成或者手写随机数来生成数据,只需要调用Faker提供的方法,即可完成数据的生成。原创 2022-09-18 10:59:29 · 1856 阅读 · 21 评论 -
python中常用的魔术方法总结(二)
满足以下条件:1、通过上课的相关知识点对这个类创建的对象,进行属性限制,对象只能设置这个三个属性: title money data2、通过相关机制对设置的属性类型进行限制,title只能设置字符串类型数据money设置为int类型数据 data可以设置为任意类型3、通过相关机制实现,data 属性不能进行删除4、类支持 obj[属性名] 这种语法获取属性值。原创 2022-09-16 08:58:17 · 544 阅读 · 37 评论 -
python——单例模式
1、在程序中,多个模块中,使用该类的对象时:每个实例化对象都会有内存开销2、日志收集器设置成单例模式:每个实例化日志对象后,每个日志对象会重复收集3、数据库链接:1个脚本可能存在连接多次数据库,数据库最多允许多少个连接,在安装时有配置;如果配置了100,当超出100后其他的对象连接不上,使用单例模式,服务端数据库连接只有一个连接,在性能方面有个提升原创 2022-09-09 08:46:34 · 1165 阅读 · 48 评论 -
python——装饰器深入研究(三)
第4、5行的代码的执行逻辑是:work=Demo(work)相当于初始化一个实例对象,需要定义参数去接收work,案例2。原创 2022-09-08 08:55:24 · 406 阅读 · 50 评论 -
python自动化测试中装饰器@ddt和@data源码解析
2、ddt这个装饰器:遍历测试数据,每遍历出一条数据,往测试类中添加一个test开头的方法。1、利用data装饰器:传入测试数据,在装饰器中将测试数据保存起来。采用闭包进行数据锁定,锁定value和method。测试类中每一个test开头的方法就是一条测试用例。:可以表示为test_demo1=data(setattr(类,方法名,方法)kobe-----执行了 24。kobe-----执行了 24。kobe-----执行了 24。kobe-----执行了 24。kobe-----执行了 24。原创 2022-09-06 09:19:55 · 3981 阅读 · 98 评论 -
python——装饰器深入研究(二)
2、并且将add_attr(work1)用与函数同名的变量work1来接收,即work1=add_attr(work1)执行结果:新增了属性:‘age’: 1, ‘data’: [2, 8, 23, 22, 24]函数名称: {‘age’: 1, ‘data’: [2, 8, 23, 22, 24]}函数名称: {‘desc’: ‘给函数添加属性’, ‘age’: 18}普通函数作为装饰器:一般用于对函数和类的属性进行修改添加,案例如下。4、装饰器内部实现的功能给函数work1添加属性age、data。原创 2022-09-05 08:22:26 · 805 阅读 · 56 评论 -
python——装饰器深入研究(一)
1、闭包实现2、类实现3、普通函数只要是可调用的对象(加括号就能调用),都可以作为装饰器,通过callable内置函数进行判断。原创 2022-09-04 08:48:12 · 765 阅读 · 52 评论 -
python——统计一个文本中单词频次最高的10个单词
【代码】python——统计一个文本中单词频次最高的10个单词。原创 2022-08-26 09:48:48 · 3286 阅读 · 24 评论 -
python面试题总结(四)
生成器:生成器包括列表生成器和函数中加入yield生成器生成器并不是列表,它保存了如何生成生成器中元素的算法解决了列表或者是列表生成式的缺点,解决了大量无用数据占用资源的问题生成器中含有游标,记录了元素的位置,下次使用数据时,会继续去取数据迭代器:通过调用__next__()方法能不断生成下一个数据的方式,就是迭代器闭包:闭包需要满足3个条件:函数中嵌套函数内部函数中调用外部函数中的变量外部函数要返回内部函数中的函数名。原创 2022-08-23 09:20:51 · 3501 阅读 · 55 评论 -
python面试题——设计模式之观察者模式
观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式又称:"发布-订阅"模式。比如,微信公众号,就是一种观察者模式的应用:一个公众号对应了多个(N)个 订阅者,公众号发布了新的文章,所有的订阅者都会被通知并更新。也就相当于,我们所有的订阅者就是观察者,我们观察这个公众号(发布者),他一更新,我们就能知道.原创 2022-08-21 08:54:54 · 1573 阅读 · 73 评论