自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode:删除有序数组中的重复项

思路为前一个的数跟后面的数分别进行比较,如果相同则只保留前一个数即可,然后把k+1,最后的k就是遍历后剩下数字的数量。

2025-04-10 14:14:16 267

原创 LeetCode:有效的括号

遍历字符,如果当前字符是左括号就压入栈中;如果是右括号,如果栈是空的则返回False;弹出栈顶元素,如果此元素对应的和char不一样,返回False;基本思路为:利用栈和映射字典,遇到左括号入栈,遇到右括号时检查栈顶元素是否匹配,若不匹配则返回。遍历结束后若栈为空,说明所有的左括号都匹配右括号,返回True。创建一个映射字典,键为左括号,值为对应的右括号;,最后检查栈是否为空来确定字符串是否有效。首先,创建一个空栈存储左括号;

2025-04-08 20:17:57 278

原创 LeetCode题五:合并两个有序链表

如果第一个链表节点值较小,那么先将list1插入新链表中,然后将尾节点后移;相同的,第二个也需要比较;基本思路其实就是:先建立一个空链表,然后将尾节点放在头结点上;如果list1或者list2还有剩余节点,全部插入到新链表中;最后返回链表的头结点的下一个节点,即新合并链表的头结点。这段代码运行效率较低,不推荐使用。

2025-04-08 18:46:56 224

原创 LeetCode题四:最长公共前缀

我先通过使用min函数key=len参数希望找出最短的字符串,再利用双重循环先将索引i与字符char遍历,再通过一层索引others比较当前字符i的位置是否和当前others[i]的字符是否一样,如果不一样输出之前的最小字符串,都一样就说明是相同的字符组;思路是:先考虑是否存在字符串strs,如果不存在即为空;代码执行用时较快,但是消耗内存较多。思路更加简单易懂,代码更加简洁。

2025-04-07 18:57:48 188

原创 LeetCode题三:罗马数字转变为整数

这时候可以用一个循环表示,前提为这个字符串存在,索引i不能超过字符串长度,而且当前位置的罗马字马表示的数字必后一个小的话说明这是一个特殊组合,我们先用Python把每个字母和整数的映射关系,然后定义一个新的数字用来存储遍历中的数字,接下来进行遍历。通过自己的写法需要明白的是:小数字表示的字符在大数字前边表示的数为减去前边的罗马数字表示的小数字所得到的数,例如IV=4,CD=400,CM=900。在进行比较充分的解释后对比大佬的代码发现思路差不太多,但是特别占内存。

2025-04-03 14:59:28 160

原创 LeetCode题二:判断回文

通过把x变成字符串然后再反转来比较得到的结果是否相等,仅仅几行代码,无论是从简洁度还是代码运行速度都远胜于前者。查阅资料我得到的结果远没有大佬们的做法更省时间,而且还很麻烦。

2025-04-03 14:13:46 411

原创 LeetCode题一:求两数之和

第一次做题遇到了很大的阻碍,通过查阅资料才知道自己还存在着诸多不足,而且听同学讲LeetCode只需把著代码写出来就可以,输入问题困扰了我将近一节课,我还需要继续努力!

2025-04-02 15:34:03 184

原创 爬虫:请求头,requests库基本使用

抓取数据包得到的内容才是判断依据elements中的源码是渲染之后的不能作为判断标准。请求方式:get(向服务器要资源)和post(提交资源)referer:表示当前这一次请求是由哪个请求过来的。user-agent:模拟正常用户的一种方式。cookie:登陆保持。

2025-04-01 19:00:26 1000

原创 爬虫:网络请求(通信)步骤,http和https协议

请求,对响应状态码进行检查,解析响应内容并提取出网页标题,并处理可能出现的请求异常。html:文本 css:样式,控制文字大小,颜色。服务器返回给响应数据:html/css/js/jpg...电脑(浏览器):www.baidu.com——url。DNS服务器:IP地址标注服务器——1.1.38。实际原理:一个网络请求只能对应一个数据包(文件)之后抓包可能会有很多个数据包,共同组成了这个页面。浏览器拿到IP地址去访问服务器,返回响应。js:行为 jpg:图片。

2025-03-31 19:03:29 481

原创 爬虫:基本流程和robots协议

robots协议:并不是规范,只是约定俗成的,是一种通过简单文本文件(robots.txt)来规范搜索引擎爬虫等网络机器人对网站内容访问行为的协议。获取到的响应中,有可能会提取到还需要继续发送请求的url,可以拿着解析到的url继续发送请求。2.发送请求:发送网络请求,获取到特定的服务端给你的响应。4.保存数据:本地(html,json,txt),数据库。1.确认目标:url:www.baidu.com。3.提取数据:从响应中提取特定的数据。

2025-03-31 18:44:23 1109

原创 Python:爬虫概念与分类

请求:请求网址(request url);请求方法(request methods);请求头(request header);请求体(request body)https://www.baidu.com url——统一资源定位符。获取数据的目的:功能性爬虫,数据增量爬虫。客户端,指web浏览器向服务器发送请求。爬虫分类:爬取网站数量:通用爬虫与。

2025-03-30 18:50:21 980

原创 linux查看目录及清屏操作

cd~切换根目录。

2025-03-30 18:21:37 197

原创 Python:日志管理器配置

时间:2025-03-29 19:21:37,000 日志级别:INFO 日志信息:normal operation。时间:2025-03-29 19:21:37,000 日志级别:DEBUG 日志信息:testing。时间:2025-03-29 19:21:37,001 日志级别:CRITICAL 日志信息:严重错误。时间:2025-03-29 19:21:37,000 日志级别:WARNING 日志信息:警告。时间:2025-03-29 19:21:37,000 日志级别:ERROR 日志信息:错误。

2025-03-29 19:25:16 433 1

原创 Python:日志模块操作及基本配置,日志格式化输出

当创建好log文件并运行后,编译器会自动生成一个名为'text.log'的文件。日志时间:2025-03-29 18:38:32,909。日志时间:2025-03-29 18:38:32,909。日志时间:2025-03-29 18:38:32,909。%(levelname)s:表示日志记录日志级别。%(message)s:日志记录的文本信息。日志内容:warning message。输出信息如上,下边的代码均为调试代码。日志内容:debug message。日志内容:info message。

2025-03-29 18:38:55 266 1

原创 Python:内置模块

os模块:os:操作系统接口模块,它提供了一些方便使用的操作系统相关的系数os.path.split():把路径分为两个部分,一个是目录路径,一个文件名os.path.dirname():分割的第一个元素os.path.basename():分割的第二个元素运行结果为:D:\Python\PythonProject\.venv\Scripts;D:\python\Scripts\;D:\python\;C:\Program Files (x86)\Common Files\Intel\Shared L

2025-03-28 15:11:53 679

原创 Python:正则进阶

测试链接</a> 也在这儿。<p>这是一个包含 <a target="_blank" href="https://example.com">链接</a> 的段落。<p>另一个 <a href="https://test.com" class="link">测试链接

2025-03-28 13:56:38 457

原创 Python:匹配结尾与匹配分组

res=re.match('<(\w*)>\w*<\\1>','<html>hh<html>')#\1表示引用第一个分组的内容。print(res.group())#输出<html>hh<html>print(res.group())#输出<html>hh<html>print(res.group())#提取数据,输出结果为10。print(res.group())#提取数据,输出结果为1。print(res.group(0))#输出全部匹配到的内容。print(res.group())#输出<html>

2025-03-27 14:33:39 434

原创 Python:匹配多个字符,如何匹配开头

print(res.group())#提取数据(后边只写python会报错,因为必须至少匹配一次)res=re.match('[^0-9]','abcde')#取反。print(res.group())#提取数据。print(res.group())#提取数据。print(res.group())#提取数据。print(res.group())#提取数据。print(res.group())#提取数据。print(res.group())#提取数据。print(res.group())#提取数据。

2025-03-26 20:22:44 293

原创 Python:正则基础

result=re.match(正则表达式,要匹配的字符串,flag=0(可选项))#尝试从字符串的起始位置匹配一个正则表达式,返回match对象,如果起始位置没有匹配成功,返回None。作用:可以去检查一个字符串是否与某种模式匹配,是很强大的字符串处理工具,类似于格式化输出(作为一个模板和要匹配的字符串去进行匹配,筛选出符合条件的部分)print(res.group())#提取数据,print(res.group())#提取数据,print(res.group())#提取数据。

2025-03-26 19:58:32 287

原创 Python:gevent综合案例,进程线程协程对比

总结:进程是资源分配的单位,线程是调度的操作系统的一个单位,一个程序至少有一个进程,一个进程至少有一个线程,即主线程;指定先来后到的选择,后来要等待,解决资源竞争的办法:Lock锁+join。线程和进程是由程序触发系统接口,最后的执行者是系统,协程的操作是程序员。多线程:一个QQ开多个聊天窗口就是多线程,线程资源共享,操作者就是资源。举例:多进程:多个QQ登录;并发:分时切片串行的操作,实际上同一时间只有一个任务在运行。IO+CPU都密集:多进程+协程操作。应用场景:CPU密集型:多进程。

2025-03-26 19:26:19 325

原创 Python:gevent,自动切换示例,gevent.joinall()

gevent.sleep() 与time.sleep()都可以用,但是gevent不能直接识别time模块。monkey.patch_all() #打补丁,将程序中用到耗时操作的代码,换为gevent中实现的模块。gevent.sleep(1)#用来模拟一个耗时操作,注意不是time模块中的sleep。monkey.patch_all() #打补丁,将程序中用到耗时操作的代码,换为gevent中实现的模块。time.sleep(1)#打补丁操作,或者直接gevent.sleep(1)

2025-03-26 15:29:01 326

原创 Python:协程,用yield和greenlet方式创建协程

IO特别多时,因为Python有GIL(全局解释器锁)在同一时间内实际只有一个线程在工作(IO操作,切换保存状态耗费时间),多线程的执行效率比协程会更低。优点:通过对象,switch(),来实现任务的切换,需要导入greenlet模块#pip install greenlet。存在意义:多线程:分时切片,串行并发操作,线程切换需要耗费时间(保存状态)w1.switch()#切换到w1运行,告诉程序先从哪个任务开始执行。协程:单线程下的并发,又称为微线程,纤程,是一种用户态轻量级线程。

2025-03-26 14:22:29 313

原创 Python:进程池,同步和异步,进程池通信示例

enumerate() 不管任务是否完成,立即终止,如果使用异步提交任务,等进程池内任务都处理完,需要用get()来收集结果。Manager()模块专门用来做数据共享,支持很多类型,如value,array,list,dict,Queue,Lock等。print(f'rd启动{os.getpid()},父进程{os.getppid()}')print(f'wd启动{os.getpid()},父进程{os.getppid()}')p.close() 关闭进程池,防止进一步操作(进程池不接受新的任务)

2025-03-25 20:01:01 1207

原创 Python:进程间的通信,进程的操作队列

maxsize:队列中能存放数据个数的上限(整数),一旦达到上限插入会导致阻塞,直到队列中的数据被消费掉 maxsize<=0队列大小没有限制。q.empty() q为空返回True q.get() 在队列中取值。q.put() 在队列中放值 q.ful() 队列是不是满了。p1=Process(target=write,args=(q,))#先写入。print('现在的消息总量是:',q.qsize())#查看消息数量。

2025-03-25 19:02:46 646

原创 Python:进程的常用方法,注意细节,进程线程对比

join([timeout]):是否等待子进程执行结束(在当前位置阻塞主进程)主进程等子进程多长时间timeout。is_alive():判断子进程的存活状态,返回True或False,子进程执行完后的状态为False。print('p2的状态是:', p2.is_alive())print('p2的状态是:', p2.is_alive())print('p1的状态是:',p1.is_alive())print('p1的状态是:',p1.is_alive())print('funa子进程:',list)

2025-03-25 16:48:23 453

原创 Python:进程介绍及语法结构

print('oneid:%s,父进程id:%s' % (os.getpid(), os.getppid()))print('oneid:%s,父进程id:%s' %(os.getpid(),os.getppid()))print('主进程:%s,父进程:%s'%(os.getpid(),os.getppid()))name=input('name:')#用户输入,进入阻塞。print('p2子进程名:', p2.name)print('p1子进程名:',p1.name)#获取当前进程号及父进程号。

2025-03-25 16:14:58 388

原创 Python:互斥锁,线程同步及总结

3.如果在调用acquire方法时,其他线程已经使用了这个互斥锁,那么此时acquire方法会堵塞,知道这个互斥锁释放后才能再次上锁。4.Lock有acquire()和release(),成对出现的,先加锁释放锁才能再加锁等操作,否则会造成死锁。print(f'第一次:{a}\n',end='')print(f'第二次:{a}\n',end='')print(f'第一次:{a}\n',end='')print(f'第二次:{a}\n',end='')lock.acquire()#加锁。

2025-03-24 19:31:54 437

原创 Python:多线程意义及应用场景

print(f'当前线程:{threading.current_thread().name}\n',end='')print(f'当前线程:{threading.current_thread().name}')线程之间执行是无序的,它是由CPU调度来决定的,CPU调度哪个线程哪个就先执行。#重构run方法,规定run这个名字,表示线程活动的方法。#重构run方法,规定run这个名字,表示线程活动的方法。print(f'第一次:{a}\n',end='')print(f'第二次:{a}\n',end='')

2025-03-24 19:05:07 1001

原创 Python:多线程创建的语法及步骤

t=threading.Thread(target=dance,args=('lihailu',))#一个元素的元组也要加,5.阻塞主线程join() #a.join() a为子线程,阻塞主线程,主线程会等待子线程a执行完再执行下面的代码。if __name__=='__main__':#程序文件如果直接运行则执行下面的代码。线程类Thread参数:group(线程组) target:执行的目标的任务名。f1.join()#主线程等待f1执行完再执行。t.start()#启动线程。

2025-03-23 18:32:17 366

原创 Python:线程进程,多任务

并发:指的是任务数多于CPU核数时,通过操作系统的各种任务调用算法,来实现用多个任务“一起”执行的效果。线程:一个进程默认有一个线程,进程里可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。一个正在运行的程序或者软件就是一个进程,他是操作系统进行资源分配的基本单位。程序启动默认会有一个主线程(因为线程是程序执行的最小单位)并行:指的是任务数少于CPU核数时,即任务真正的一起执行。time.sleep(1) # 睡眠一秒。进程:打开一个程序至少就会有一个进程。多任务:同一时间内执行多个任务。

2025-03-23 17:57:58 222

原创 Python:生成器及三者关系

yield语句一次返回一个结果,在每个结果中间挂起函数,执行next()再重新从挂起点继续往下执行。是函数中断,并保存中断的状态。gen=(i*5 for i in range(5))#列表推导式[]变成()就变成了生成器表达式。yield:类似于return,将指定值或多个值返回给调用者。可以一边循环一边计算(generator)生成器函数:使用了yield的关键字函数。

2025-03-23 17:32:51 152

原创 Python:可迭代对象和迭代器,自定义迭代器类

如果一个对象拥有__iter__(),是可迭代对象,如果一个对象拥有__next__()和__iter__()方法,是迭代器对象。迭代器协议:对象必须提供一个next方法,执行该方法要么返回执行中的下一项,要么发生错误停止迭代(了解)#可以通过iter方法(魔法方法)可以转换成迭代器对象。两个特性:iter方法和next方法、#可迭代对象不一定是迭代器对象。#迭代器对象一定是可迭代对象。

2025-03-23 17:10:51 202

原创 Python:可迭代对象,迭代器对象

for循环工作原理:先通过__iter__()方法获取可迭代对象的迭代器;步骤:1.iter()调用对象的__iter__(),并把__iter__()方法的返回结果作为自己的返回值。__iter__()方法返回了迭代器对象。#print(next(li2))#不断通过next()获取,五个数据取五次。print(next(li2))#不断通过next()获取,五个数据取五次。2.next()调用对象的__next__(),一个个取元素。__iter__()方法:获取到可迭代对象的迭代器。

2025-03-22 18:57:48 411

原创 Python:with open&编码格式,获取目录操作

output_image_path = "output.jpg" # 替换为实际的输出图片路径。input_image_path = "input.jpg" # 替换为实际的输入图片路径。with open(文件,读写):代码执行完系统会自动调用f.close(),可以省略文件关闭步骤。print(f"成功写入图片: {output_path}")print(f"成功读取图片: {input_path}")print(os.listdir('../'))#获取上一级目录列表。库进行图片读取和写入操作。

2025-03-21 20:44:02 254

原创 Python:访问模式,文件定位操作

whence:起始位置,表示移动字节的参考位置,默认值是0,0代表文件开头作为参考位置,1代表当前位置为参考位置,2代表将文件结尾作为参考位置。a:追加模式,不存在就创建新文件进行写入,存在就在原有内容的基础上追加新的内容。#w:只写模式,文件存在就先清空文件内容,再写入添加内容,不存在就创建新文件。使用+会影响文件读写效率,开发过程中更多时候会以只读,只写的方式来操作文件。r+:先写再读,文件存在就重新编辑文件,不存在就创建新文件。#r:只读模式(默认模式),文件必须存在,不存在就会报错。

2025-03-21 20:26:43 170

原创 Python:文件的基本操作与基本读写

read(n):n表示从文件中读取的数据的长度,没有传n就默认一次性读取文件的所有内容。属性:文件名.name:返回要打开的文件的文件名,可以包含文件的具体路径。文件名.closed:用来检测文件是否关闭,关闭则返回True。注意:只可以打开和关闭文件,不进行任何读写操作。1.创建一个file对象,默认是以只读模式打开。基础操作:打开文件,读与写文件,关闭文件。文件:存储在某种长期储存设备上的一段数据。write(n):将指定内容写入文件。文件名.mode:返回文件的访问模式。close(n):关闭文件。

2025-03-21 20:06:14 153

原创 Python:单例模式&魔法方法

一个对象的实例化过程:首先执行__init__(),如果没有写__new__(),默认调用object里面的__new__(),返回一个实例对象,然后再去调用__init__(),给对象进行初始化。重写__new__()一定要写return super(),__new__(cls),否则Python解释器得不到分配空间的对象引用,就不会调用__init__()__new__():object基类提供的内置静态方法,在内存中为对象分配空间,返回对象的引用。__init__():初始化对象,给属性赋值。

2025-03-20 20:12:17 998

原创 Python:多态,静态方法和类方法

总结:类属性是公共的,所有方法都能够访问到,静态方法不需要访问类属性(静态方法和类与对象没有关联),实例属性是私有的,只有实例方法内部能够访问到。不需要访问实例属性和类属性,如果要访问类属性,通过类名,类属性名访问,不能访问实例属性。应用场景:当方法中需要使用到类对象(如访问私有类属性等),定义类方法。#实例属性,对象私有的。#实例属性,对象私有的。name='lihailu'#类属性,对象拥有的。name='lihailu'#类属性,对象拥有的。name='lihailu'#类属性,对象拥有的。

2025-03-19 21:22:40 807

原创 Python:新式类写法,多继承

(对象,Python为所有对象提供的基类,提供一些内置的属性和方法,所有类都继承,如果一个类没有继承任何类,默认继承object类)) 新式类:继承了object类或者该类的子类都是新式类,推荐使用。def sing(self):#派生类,拥有不同于父类的属性。def sing(self):#派生类,拥有不同于父类的属性。def sing(self):#派生类,拥有不同于父类的属性。def sing(self):#派生类,拥有不同于父类的属性。class Person1(object):#第二个父类。

2025-03-19 20:36:44 560

原创 Python:单继承&方法的重写

super().方法名():super在Python里面是一个特殊的类。继承:让类和类之间转变为父子关系,子类默认继承父类的属性和方法。class Son(Father):#Father类的子类。class Man(Person):#Father类的子类。class Man(Person):#Father类的子类。class Man(Person):#Father类的子类。class Man(Person):#Father类的子类。可以多个类是子类,就算子类自己没有,也可以使用父类的。

2025-03-19 20:15:08 683

空空如也

空空如也

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

TA关注的人

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