自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 前端(十三)bootstrap的基本使用

Bootstrap 是一个开源的前端框架,用于快速设计和定制响应式的网站和Web应用。它包含了一系列的HTML、CSS和JavaScript工具,可以帮助开发者快速构建出美观、响应式的用户界面。响应式设计:Bootstrap提供了一系列的CSS类,使得网站能够自动适应不同大小的屏幕,包括手机、平板和桌面显示器。预定义的组件:Bootstrap包含了大量的预定义组件,如按钮、表单、导航栏、卡片、模态框等,这些组件可以快速地添加到你的项目中,无需从头开始设计。

2025-01-09 22:19:37 1363

原创 前端(十二)jquery(2)

最后进入事件冒泡阶段,button的事件触发完以后会按button–>div(d2)–>div(d1)–>body–>html的顺序寻找父标签中是否绑定事件,如果父标签绑定了事件则会随着子标签事件的触发一并被触发。我们知道html的结构是html–>body–>div(d1)–>div(d2)–>button,当我们点击button标签时实际上也是在点击div(d2)和div(d1)标签,因此html中子事件被触发时,父事件也会跟着触发。show(speed,callback):显示隐藏的元素。

2025-01-06 23:02:28 1159

原创 前端(十一)jquery(1)

jQuery 是一个高效、精简并且功能丰富的JavaScript工具库,其极大的简化了JavaScript编程的繁琐程度。//cdn//使用cdn以后无需下载文件即可直接使用jquery//下载文件并在本地引用<script src="jquery文件路径"></script>jquery下载解析HTML结构。加载外部脚本和样式表文件。解析并执行脚本代码。DOM树构建完成。加载图片等外部文件。页面加载完毕。

2025-01-06 01:10:02 448

原创 前端(十)js的使用

【代码】前端(十)js的使用。

2025-01-03 22:22:28 343

原创 前端(九)js介绍(2)

上面的闭包函数中inner函数的变量x作用域在函数定义阶段就已经确定为outter函数的形参x,而由于inner函数中引用了变量x,因此原本在outter函数运行结束就应该释放的局部变量x会保持下来,这样闭包函数就完成了将外部参数保存至内部函数的功能。同样的下方代码中,函数func的定义阶段存在对变量e的赋值,因此变量e为局部变量。是变量声明会被放到顶部,所有上方的代码可以等价于。在js中代码是从上往下一次执行的,并且js中的变量的声明会被放到作用域的顶部位置,而函数的定义与声明都会放到作用域的顶部位置。

2024-12-31 23:55:47 962

原创 前端(八)js介绍(1)

javaScript一般用来编写客户端脚本,来为html页面添加交互行为,是前台语言,而不是后台语言。< script > // 方式一 </ script >< script > // 方式一 </ script >// 方式一< script > // 方式一 </ script ></< script > // 方式一 </ script >--方式二--> < script src = " xxx.js " > </ script >

2024-12-26 23:20:02 467

原创 前端(七)定位流

绝对定位就是寻找父级标签中设置为定位流的标签(相对定位、绝对定位、固定定位),自身相对于这个标签进行移动,如果父级标签不存在定位流的标签则会找body作为参考标签,如果父级标签存在多个定位流标签,则会选择离自身近的标签作为参考标签。另外绝对定位是完全脱离文档流的,这就意味着绝对定位不区分块级、行内、行内块级元素,可以给这些元素设置宽高,同时绝对定位在文档流中不占用位置,下方元素会顶上设置绝对定位的元素位置。所谓相对定位就是相对于自己在文档流中的位置来移到,这是一种不脱离文档流的布局方式。

2024-12-16 15:39:01 622

原创 前端(六)浮动流

另外在上一章中提到过一个问题,如果两个盒子嵌套,父盒子没有边框,子盒子的margin-top会把两个盒子都定下来.这个问题的本质是父元素没有边框,子元素的margin-top不能参照父元素,那么就会去参照body,因此父元素和子元素会一起被顶下去。当父级元素宽度无法容纳浮起元素时,浮起元素会先找前面元素的左下点作为垂直位置的起始点,贴靠在其空白处,如果此元素也无法容纳浮起元素,则浮起元素再找前一个元素,以此类推直到找到父元素最左侧为止,此时无论父元素能否容纳,浮起元素都会显示在该位置。

2024-12-14 22:45:59 753

原创 前端(五)css属性

css中可以通过display进行标签的转换,none表示不显示标签也不占用空间,block表示块级标签,inline表示行内标签,inline-block行内块级标签。在css中可以把html的标签分为块级标签和行内标签,块级标签是占一整行的标签,如div、p等,标签结束会自动换行,而行内标签则不会自动换行。行内标签:不会独占一行,不可以设置宽高,有span、buis、strong、em、ins、del。块级标签:会独占一行,可以设置宽高,有 div、h、ul、ol、dl、li、dt、dd 、p。

2024-12-12 21:23:46 367

原创 前端(四)css选择器、css的三大特性

p{color: red;

2024-12-09 21:13:47 709

原创 前端(三)html标签(2)

可以给td加colspan完成水平方向的单元格合并,也可以给td加rowspan完成垂直方向的单元格合并,单元格的合并永远是向下或者向后合并的。width和height表示宽高,可以给table设置表格整体的宽高(默认情况下表格自动调节),也可以给td设置单元格及其影响行列的宽高,但是不能超过表格整体的宽高。align给表格加是设置表格整体的对齐方式,align、valign给tr加是设置一行的对齐方式,align、valign给td加是设置一个单元格的对齐方式。disc:实心圆(默认值)

2024-12-08 22:36:55 686

原创 前端(二)html标签(1)

在html中有些字符是被html保留的,例如大于小于,有些则是有着特殊含义,还有一些如空格回车tab等会被当作一个空格处理,为了能正常显示这些字符,以此需要使用字符实体。非语义化的标签可以用来修改文本的样式,但是一般html中都是使用css来完成样式的修改,因此非语义化的标签并不推荐使用。另外<div></div>和<span></span>也是没有语义的标签,但是这两种标签却使用的较为广泛。a标签还可以用来存放假链接,假链接是开发初期不知道a标签应该跳转到那个页面,临时存放的链接。

2024-12-04 21:32:44 1170

原创 前端(一)浏览器与后端的通信过程介绍

用户使用浏览器打开网页这一系列过程中浏览器会将服务端的文本文件内容下载到本地,然后打开显示出来。在pycharm中如果想要快速创建xhtml1.0结构的文本文件可以输入快捷键html:xt + tab,如果想要创建html5格式的文档文件可以输入快捷键 html:5 + tab。xhtml和html5的区别是xhtml更为严格,它要求标签必须小写、必须严格闭合、标签中的属性必须使用引号引起,img必须要加alt属性等等;

2024-12-03 19:45:36 554

原创 mysql数据库(九)锁机制

所谓锁就是为了保证数据安全性而设计出来的,举个例子来说就像两人在办公室同时打印文件,为了使打印的内容不混乱,必须等一人打印完以后另一个人才能打印,如果把打印机看出数据,在一个人修改数据时就相当于上了一把锁,另一个人必须等待其修改完成也就是开锁以后才能进行修改操作,这就是锁。

2024-11-28 21:25:51 1055

原创 mysl数据库(八)事务、三种读现象

事务是mysql的一种机制,一个事务里可以包含多条sql语句。执行事务相当于拍了一张快照,在事务执行完提交以前可以回滚至最初的状态,当然事务中也有保存点,可以将事务回滚至保存点处。原子性:指事务内部的sql语句是一个整体,有一条运行失败,其他的sql语句也会运行失败。一致性:指事务执行前后状态要保持一致。例如转账前后,转入方和转出方的总金额保持不变。隔离性:多个事务并发运行彼此之间互不影响。持久性:事务提交以后对数据库中数据的改变是持久的,即使数据库故障也不会对其有影响。

2024-11-27 20:36:56 1000

原创 mysql数据库(七)索引

索引是存储引擎中一种数据结构,或者说数据的组织方式。索引又称之为键key,为数据建立索引就好比是为书建目录,目的是为了便于查找数据。显然的是为数据建立索引以后需要额外的空间存放建立的键值对关系,因此当对数据进行增删改时同时也需要修改索引关系,这将降低增删改的效率。然而我们平时使用数据库时,查询与增删改的比率大概为10:1,因此索引的建立可以大大提高我们的工作效率。建立索引的原则:在程序上线前就考虑好索引问题,对那些用户可能频繁使用的查询数据加上索引。

2024-11-26 15:59:25 805

原创 mysql数据库(六)pymysql、视图、触发器、存储过程、函数、流程控制、数据库连接池

使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,这会使得扩展sql极为不便,因此视图不常使用。我们知道mysql查询语句是通过逻辑判断的方式进行查询的,而1=1的结果永远为真,这就会导致没有输入任何用户和密码的情况下依然可以查询到用户信息。存储过程的优点是:用于替代程序写的SQL语句,实现程序与sql解耦;

2024-11-20 21:00:20 1129

原创 mysql数据库(五)多表查询

查询中使用的表如下所示。

2024-11-13 23:08:56 901

原创 mysql数据库(四)单表查询

需要注意的是mysql默认的是ONLY_FULL_GROUP_BY模式的分组,简单来说就是分组后查询出来的字段中只能有一个明确的值,如果有多个就会报错。group by用于对数据进行分组,分组的目的是将数据中某一字段的相同内容进行归类,并对归类后的数据进行一系列的操作。这些关键词的执行顺序是:from(选出记录)、where、group by、having、select(根据指定字段保留记录内容)、distinct、order by、limit。having用于对分组结果进行筛选。GROUP BY 分组。

2024-11-11 21:17:44 550

原创 mysql数据库(三)表的完整性约束、表与表的关系

如果没有不为空且唯一的字段,mysql会自动创建隐藏字段作为主键,主键是mysql索引记录的重要字段,隐藏主键会对mysql的索引效率产生一定的影响。对于大部分的数据类型而言默认是允许空值的,如果不想为空需要设置not null,也可以设置默认值default,这样插入值为空时会自动填充默认值。主键primary key是innodb存储引擎组织数据的依据,一张表中必须有且只有一个主键,并且主键唯一且不能为空。PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录。

2024-11-07 21:09:49 853

原创 mysql数据库(二)存储引擎、表操作、数据类型

对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。因此整形一般不指定显示宽度。

2024-11-06 21:36:16 1119

原创 mysql数据库(一)mysql介绍及基本操作

数据库其本质就是一个事先写好的socket服务端与客户端程序,使用mysql是为了解决数据共享、查询效率以及数据安全性等一系列问题。总的来说使用数据库可以把程序员从数据管理的繁琐任务中解脱出来,专注于自己程序逻辑的编写。数据:数据是描述事物的符号,例如文字、图像、声音等等。数据库:数据库是按一定规则存放数据的仓库。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度、较高的数据独立性和易扩展性,并且可以为用户所共享。

2024-11-05 20:56:49 989

原创 网络通信与并发编程(九)asyncio

另外需要注意的是await只能等待非阻塞的任务,例如想要使用await完成爬虫任务需要将常使用的requests库替换为aiohttp库,因为requests的I/O操作会阻塞线程从而协程无法完成并发操作,而aiohttp允许异步爬取多个网站信息。async with的用法和with相同,async with可以与asyncontextmanager装饰器连用,使用async with时会调用__aenter__()方法,退出async with代码块时会调用__aexit__()方法。

2024-11-02 22:55:05 1056

原创 网络通信与并发编程(八)I/O模型

基于上面的介绍,我们可以看到阻塞I/O与非阻塞I/O的区别在于wait阶段进程是否被阻塞;而同步I/O与异步I/O的区别在于copy(真正的I/O操作阶段)阶段是否被阻塞。因此上面介绍的阻塞I/O、非阻塞I/O、多路复用I/O都属于同步I/O。

2024-11-01 23:19:35 737

原创 网络通信与并发编程(七)GIL、协程

而解释器中的数据和py文件中的数据又是共享的,所以必须要一种锁来确保多个线程在修改数据时数据的安全性,这就是GIL锁存在的原因。需要注意的是子线程也是要抢GIL锁后才能执行的,如果子线程抢到GIL锁后发现需要修改的数据被mutex锁上了,子线程会进入阻塞状态,然后解释器会回收子线程的GIL锁。GIL锁的是解释器的数据,自定义互斥锁锁的是用户的数据。例如用户创建三个线程修改文件中的某个数据,文件中的数据属于用户自己的数据不归解释器管,所以想要文件数据能被安全的修改必须加上自定义的互斥锁。

2024-10-31 22:42:17 592

原创 网络通信与并发编程(六)线程、进程池与线程池

举个例子,进程好比是车间,而线程则是车间的流水线,流水线是实际的生产工具,而车间是集合生产资源的地方。当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时,就应该用池将开启的进程数或线程数限制在计算机可承受的范围内。守护线程的创建方式和守护进程相同,但是守护线程需要主进程内的所有子线程都运行完以后才会结束,而守护进程则是主进程的代码运行结束就会结束了。补充一句:上面说的守护进程/线程的结束是指主进程代码结束/主进程线程结束时守护进程/线程还没运行结束会被强制结束。

2024-10-26 21:35:04 611

原创 网络通信与并发编程(五)进程的相关操作

互斥锁的本质是每次只有一个进程可以修改上锁的数据,当其他进程想要修改时必须排队,只有正在修改数据的进程修改完了并且打开锁以后其他进程才能修改数据。守护进程的功能:守护进程本质是一个子进程,所以其目的是并发的执行父进程的任务,但是当父进程代码运行完毕后子进程没有存在的意义了,这时就应该将该子进程设置为守护进程,守护进程会在父进程代码结束后结束。由于进程之间不共享数据,当多个进程需要使用共同的数据时就要一套共同的文件系统,但是当多个进程竞争处理文件系统的数据时就有可能出现数据错乱的问题。(可以理解为公共锁)

2024-10-25 16:25:00 759

原创 网络通信与并发编程(四)操作系统、进程理论、开启进程的两种方式

p=Myprocess('子进程1')如上方代码所示创建子进程p。p.terminate()表示向操作系统请求强制终止子进程p。p.is_alive()表示查看子进程是否存活。p.pid表示子进程的pid号。如果想查看父进程的pid可以在父进程使用os.getpid()或者在子进程使用os.getppid()p.name表示子进程的名称。

2024-10-20 20:40:22 1066

原创 网络通信与并发编程(三)粘包现象解决方案、socketserver实现并发

有了上一篇文章的分析,我们知道tcp协议之所以会出现粘包现象,是因为无法得知每次传输的字节数。如果我们人为的给传输的数据添加一个报头用来表示接收内容的字节数就可以解决这个问题了。映像名称 PID 会话名 会话# 内存使用。映像名称 PID 会话名 会话# 内存使用。(接收内容过长,中间部分略去)(接收内容过长,中间部分略去)

2024-10-18 19:00:16 557

原创 网络通信与并发编程(二)基于tcp的套接字、基于udp的套接字、粘包现象

我们知道tcp协议是流式协议,也就是说基于tcp协议发送消息时,服务端套接字会把需要发送的消息给自己的操作系统,而自己的操作系统将这些消息一段一段发送给客户端的操作系统,由于是一段一段的发送,客户端无法判断一条消息的始末,所以客户端套接字每次只从操作系统中取字节数限制字节的消息,当发送的消息量过大时,只有一部分消息会被接收并打印到终端上,剩余的消息依然在客户端的操作系统中。当我们再次向服务端发送消息接收消息以后,套接字会先接收上次没有接受完的消息,再接受新的消息,这就产生了粘包现象。

2024-10-14 19:20:51 1167

原创 网络通信与并发编程(一)网络通信、osi五层模型、tcp协议的三次握手与四次挥手

在同一个局域网中,由于源主机不知道目标主机的mac地址,源主机会一广播的方式发送arp报文给局域网的所有主机,当目标主机接收报文以后会缓存源主机的mac地址并发送arp报文回应,以此让源主机获取mac地址。四次挥手:当客户端发送完数据以后向服务端发送结束信息发送通道请求(FIN),服务端接收请求并发送回应信息(ACK),当服务端接收完数据以后会向客户端发送接收信息接收通道请求(FIN),客户端接收请求并发送回应(ACK),通信通道解除。mac地址是唯一的,可以用来标识计算机的身份信息。

2024-10-12 20:08:24 1100

原创 python全栈学习记录(二十四)元类、异常处理

上述代码中当调用People(‘111’,222)时,触发元类的__call__方法,首先会调用People的__new__方法产生一个People类的新对象,由于People没有__new__方法,根据继承的机制解释器会去父类object中找,新对象产生后就需要根据People类的初始化方法完成对象的初始化,所以我们调用People的初始化方法并将新产生的obj对象传入完成初始化操作,最后返回这个obj对象也就完成了实例化的操作了。方法三:元类控制单例的产生。

2024-10-09 22:09:15 602

原创 python全栈学习记录(二十三)反射、内置方法、类相关的函数、元类

元类中的__new__方法负责完成类产生的整个过程(拿到类名、确定基类(父类)、产生名称空间、用type产生类),并且这个过程是在类的定义阶段完成的,话句话说就是元类是在类的定义阶段被调用的。python的类内置了许多以__开头,以__结尾的方法,这些方法是在满足特定条件时自动触发的,如__init__的作用是初始化类的实例,会在类的实例创建完成以后自动触发。在python中一切皆对象,那么我们用class关键字定义的类本身也是一个对象,而负责产生该对象的类称之为元类,即元类可以简称为类的类。

2024-10-07 20:21:51 771

原创 python全栈学习记录(二十二)多态性、封装、绑定方法与非绑定方法

非绑定方法:类中定义的函数如果被装饰器@staticmethod装饰,那么该函数就变成非绑定方法,既不与类绑定,又不与对象绑定,意味着类与对象都可以来调用,但是无论谁来调用,都没有任何自动传值的效果,就是一个普通函数。python本身也是支持多态性的,len函数就是对多种容器类型封装的接口函数,所以使用len函数时只需要将容器的实例传入就可以得到容器的长度值。精髓在于:隔离了复杂度。由上面的例子我们可以知道多态性的本质就是在不同的类型中定义相同的方法,这样就可以不考虑具体的类型直接调用统一的方法了。

2024-10-04 20:54:54 685

原创 python全栈学习记录(二十一)类的继承、派生、组合

上述代码中c.f1()首先会运行C中的f1代码,然后运行super().f1(),此刻调用super的类是C,mro表中以C的后一个类为起始向后寻找继承关系,找到A类的f1函数,再次运行super函数,再次在mro表中以A的后一个类为起始向后找,找到B类,运行B的f1函数。菱形继承的实现原理(新式类):图中的继承顺序为:首先按A的直接继承顺序找B这条路为B、E,到两条路相交的节点G后会跳转到下一条路C,再到下一条路D,找到D、F,当三条路全部找完以后再找节点G,之后再找F。

2024-10-03 22:03:21 1017

原创 python全栈学习记录(二十)类的属性传递与绑定方法

类中的方法类可以直接调用,不过要给self参数传值,但是一般而言类的方法是绑定被对象使用的。当类的方法在实例中调用时,方法就会被绑定给实例,而方法中的self参数会被自动传值为实例的内存地址。如果想在实例化的过程中就给实例定制属性,可以使用__init__方法,__init__方法会在类实例化以后自动调用,负责初始化实例的属性,切记__init__方法不能有返回值。调用类的过程就是将类实例化的过程,调用类后拿到的返回值就是类的一个对象,也可以称之为类的一个实例。在程序中:必须先定义类,后调用类来产生对象。

2024-09-27 19:27:18 451

原创 python全栈学习记录(十九) hashlib、shutil和tarfile、configparser

hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。如果把hash算法比喻为一座工厂,那传给hash算法的内容就是原材料,生成的hash值就是生产出的产品。由于只使用加密算法加密的数据容易被破解出来,一般对密码的加密操作中,还会进行加盐操作,在python中可以使用hmac模块完成此操作。基于1和2可以在下载文件时做文件一致性校验,基于1和3可以对密码进行加密。tarfile库包含一些对tar文件的操作,例如解压缩.tar.gz。shutil模块常用来进行文件操作。

2024-09-25 12:48:27 476

原创 python全栈学习记录(十八)re、os和sys、subprocess

在正则字符传入python解释器的过程中会经历两次转义过程,第一次是作为python字符串的转义,第二次是作为正则字符的转义,例如‘12\b’python会把字符转义为’12\x08’(\x08表示退格)传给正则模块,然后正则模块匹配’12\x08’。在非返回match对象的一些函数中()表示只输出括号中匹配的内容(匹配边界),若一组正则字符中出现多个()会将一次匹配到的内容放入一个元组中。re.sub(正则字符,替换字符串/函数地址,字符串,flag)表示按正则匹配规则替换字符串中的字符。

2024-09-24 19:52:24 697 1

原创 python全栈学习记录(十七)logging、json与pickle、time与datatime、random

json保存的数据可以与多种语言交互,但是它只支持python部分的类型,如字典、列表、元组、字符串、数字、True、False、None等。pickle只能用于python语言,但是它支持python的所有数据类型。json、pickle模块的作用是将数据序列化。logging模块用来记录日志信息。注:一个文件一般只存一个json数据。random模块通常用来取随机数。

2024-09-21 19:11:33 648 1

原创 python全栈学习记录(十六)模块与包

执行m.py文件会先打印m,然后开始导入n模块,运行n模块的代码。在n模块的代码中打印n,并导入m模块,运行m模块的代码。再次运行m模块的代码时打印m,由于此前已经运行过n的代码了,所以此次之行m模块的代码不会在运行n模块的代码,而from n import x又要去导入x变量,目前的名称空间不存在x变量,最后报错。from 模块名 import 具体的功能时,解释器会将模块中的变量直接导入当前的名称空间中,若是当前名称空间中存在与导入功能重名的变量,后导入的变量会将之前的变量覆盖。

2024-09-20 19:29:26 624

空空如也

空空如也

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

TA关注的人

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