【Python】面试基础知识整理

版权声明:本文为CSDN博主「精钩子娃」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42199781/article/details/92422941

1、    正则表达式

^ 行首匹配,和在[]里的不是一个
$ 行尾匹配
. 匹配任意一个字符(除了\n)
(xyz) 匹配小括号内的xyz(作为一个整体去匹配)
[] 匹配[]中列举的字符
\d 匹配数字,即0-9
\D 匹配非数字,即不是数字
\s 匹配空白,即空格,tab键
\S 匹配非空白
\w 匹配单词字符,即a-z、A-Z、0-9、_
\W 匹配非单词字符
* 匹配前一个符字出现0次或者无限次,即可有可无
+ 匹配前一个字符出现1次或者无限次,即至少有1次
? 匹配前一个字符出现1次或者0次,要么有1次,要么没有
{m} 匹配前一个字符出现m次
x{n,} 匹配至少n个x
{m,n} 匹配前一个字符出现从m到n次
[\u4E00-\u9FA5] 匹配汉字
2、    python有哪些数据类型

数字,字符串,列表,元组,字典,集合
3、    python2和python3的区别

首先,python2默认采用的是Ascll编码格式,python3默认采用utf8。Print方法 python中的print不用加括号,是一个类,python3中print是一个函数,必须加括号。Python2中input函数输入的是数字,python3中输入的是字符串。Python2中range返回的是一个列表,python3中返回的是一个可迭代对象。
4、    列表和字典的区别

列表通过索引来获取值,字典通过键获取值。字典的原理是hash算法,占用内存不同,字典占用内存较大。字典查找和插入的速度极快。
5、    元组的实现原理。
 

myTuple=(1,2,3,4)
id(myTuple[0])
1652911120
a=1
id(a)
1652911120

元组第一位元素的地址和整形变量a的地址是一样的,说明他们都指向常量1所在的地址空间,常量是不可重写的,所以元组的元素不可重写,但元组却可以重新赋值,此特性和C++的指针常量完全一样:指向的内存地址区域不可重写,但却可以重新指向其他内存区域
6、    类和对象的区别

类是具有相同属性和服务的一组对象的集合,类是抽象的,其内部包括属性和服务两个主要部分,而对象用于表示现实中该类事物的个体,对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,对象是类的一个具体。它是一个实实在在存在的东西,类是一个抽象的概念,它不存在于现实中的时间/空间里,类只是为所有的对象定义了抽象的属性与行为。
7、    面向对象和面向过程

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
8、    python面向对象中super是干啥用的?

继承父类的方法属性;super在新式类中才有,在python2中要写object,python3中不用。super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
9、    python中的魔法方法__init__和__new__的区别

  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。
  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。

 

即,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。

 

【一些说明】

1、继承自object的新式类才有__new__

2、__new__至少要有一个参数cls,代表当前类,此参数在实例化时由Python解释器自动识别

3、__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类(通过super(当前类名, cls))__new__出来的实例,或者直接是object的__new__出来的实例

4、__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

5、如果__new__创建的是当前类的实例,会自动调用__init__函数,通过return语句里面调用的__new__函数的第一个参数是 cls 来保证是当前类实例,如果是其他类的类名,;那么实际创建返回的就是其他类的实例,其实就不会调用当前类的__init__函数,也不会调用其他类的__init__函数。

6、在定义子类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例,如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。

7、而如果子类中重写了__new__()方法,那么你可以自由选择任意一个的其他的新式类(必定要是新式类,只有新式类必定都有__new__(),因为所有新式类都是object的后代,而经典类则没有__new__()方法)的__new__()方法来制造实例,包括这个新式类的所有前代类和后代类,只要它们不会造成递归死循环。反正肯定不能调用自己的__new__,这肯定是死循环。

8、对于子类的__init__,其调用规则跟__new__是一致的,当然如果子类和父类的__init__函数都想调用,可以在子类的__init__函数中加入对父类__init__函数的调用。

9、我们在使用时,尽量使用__init__函数,不要去自定义__new__函数,因为这两者在继承派生时的特性还是很不一样的。

10、将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节

10、简述一下ORM

ORM,全拼Object-Relation Mapping,意为对象-关系映射,实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码只需要面向对象编程,orm操作本质上会根据对接的数据库引擎,翻译成对应的sql语句
11、Git开发--git merge request 步骤

新建分支,分支开发,撰写提交信息,与主干同步,合并 commit,
推送代码到远端,请求代码合并 merge-request
12、类中self的作用

为了方便使用对象自身的性质。
13、俩个栈实现一个队列

栈A用来作入队列,栈B用来出队列,当栈B为空时,栈A全部出栈到栈B,栈B再出栈(即出队列)
14、MySQL中序列的使用

auto_increament
15、TCP断开连接过程,什么情况下进入time_wait阶段?

当关闭一个 socket 连接时,主动关闭一端的 socket 将进入TIME_WAIT状态,而被动关闭一方则转入CLOSED状态。
具体过程如下:

1、 客户端发送FIN报文段,进入FIN_WAIT_1状态。

2、 服务器端收到FIN报文段,发送ACK表示确认,进入CLOSE_WAIT状态。

3、 客户端收到FIN的确认报文段,进入FIN_WAIT_2状态。

4、服务器端发送FIN报文端,进入LAST_ACK状态。

5、 客户端收到FIN报文端,发送FIN的ACK,同时进入TIME_WAIT状态,启动TIME_WAIT定时器,超时时间设为2MSL。

6、 服务器端收到FIN的ACK,进入CLOSED状态。

7、客户端在2MSL时间内没收到对端的任何响应,TIME_WAIT超时,进入CLOSED状态。
16、Nginx

niginx是一款轻量级的Web 服务器/反向代理服务器, 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好. 轻量级高并发服务器Nginx.Nginx使用基于事件驱动架构,使得其可以支持数以百万级别的TCP连接
高度的模块化和自由软件许可证使得第三方模块层出不穷(这是个开源的时代啊~)
Nginx是一个跨平台服务器,可以运行在Linux,Windows,FreeBSD,Solaris,AIX,Mac OS等操作系统上。正向代理(软件):正向代理最大的特点是客户端非常明确要访问的服务器地址,屏蔽或者隐藏了真实客户端信息。(1)访问原来无法访问的资源,如Google(2) 可以做缓存,加速访问资源(3)对客户端访问授权,上网进行认证(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息。
反向代理:比如淘宝每天同时连接到网站的访问人数已经爆表,单个服务器远远不能满足人民日益增长的购买欲望了,此时就出现了一个大家耳熟能详的名词:分布式部署也就是通过部署多台服务器来解决访问人数限制的问题;淘宝网站中大部分功能也是直接使用Nginx进行反向代理实现的

客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。反向代理,“它代理的是服务端,代服务端接收请求”,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。反向代理的作用:(1)保证内网的安全,通常将反向代理作为公网访问地址,Web服务器是内网(2)负载均衡,通过反向代理服务器来优化网站的负载,常用方法有哈希,轮询。
17、MySQL对于千万条数据量有什么优化方法

1、分库分表,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径。

2、加索引,少用连接
18、死锁产生的必要条件?MySQL发生死锁了,怎么解决?

互斥条件,请求和保持条件,不可剥夺条件,环路等待条件。解决:终止进程,终止(或撤销)系统中的一个或多个死锁进程,直至打破循环环路,使系统从死锁状态中解除出来;抢占资源,从一个或多个进程中抢占足够数量的资源,分配给死锁进程,以打破死锁状态。
19、redis基本数据类型。

列表,字符串,哈希,集合,有序集合
20、get和post的区别?

get请求无消息体,只能携带少量数据 post请求有消息体,可以携带大量数据。携带数据的方式:get请求将数据放在url地址中,post请求将数据放在消息体中,GET请求提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中; GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
21、HTTP协议,请求头和响应头信息?

HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。请求报文包含三部分:a、请求行:包含请求方法、URI、HTTP版本信息b、请求首部字段c、请求内容实体;响应报文包含三部分:a、状态行:包含HTTP版本、状态码、状态码的原因短语b、响应首部字段c、响应内容实体
22、输入一个网址的整个请求流程?

(1)域名解析:分解出协议名、主机名、端口、对象路径等部分,得到IP地址

(2)建立TCP连接,三次握手,把以上部分结合本机自己的信息,封装成一个HTTP请求数据包

(3)Web浏览器向Web服务端发送HTTP请求报文

(4)服务器响应HTTP请求

(5)浏览器解析HTML代码,并请求HTML代码中的资源(JS,CSS,图片)(这是自动向服务器请求下载的)

(6)浏览器对页面进行渲染呈现给客户

(7)断开TCP连接。
23、长连接和短连接及其优缺点?

HTTP的长连接和短连接本质上是TCP长连接和短连接。

长连接:client方与server方先建立连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在。此种方式常用于P2P通信。
短连接:Client方与server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此方式常用于一点对多点通讯。

优缺点:

(1)长连接,可以省去较多的TCP建立和关闭操作,减少资源的浪费,节约时间。长连接多用于操作频繁,点对点的通讯,而且连接数不能太多。数据库的连接就是使用长连接,如果用短连接频繁通讯会造成socket错误,而且频繁的Socket创建和销毁也是对资源的消耗比较大。
(2)短连接,短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段,web网站一般使用短连接,因为长连接对服务端来说会消耗一定资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的,对资源消耗过大
24、数据库的集中连接?

1、django自带ORM框架和django.db三方库

2、python中最著名的SQLAlchermy ORM框架
25、多态以及多态怎样实现?

python中多态的实现:多个不同的类具有共同的方法f,各个类调用方法f,返回值不同。把方法f提取出来,封装为一个接口g。不同类的实例作为参数,传入接口g,得到不同返回值。多态性使用的前提:①类的继承关系 ②要有方法重写。python中的多态体现
26、进程和线程和协程?

1)进程是操作系统进行资源分配和调度的基本单位,多个进程之间相互独立。直白的讲:进程是应用程序的启动实例。

2)线程是CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源。缺点是一个线程的崩溃,可能会导致整个进程的崩溃。IO密集型用多线程。CPU密集型用多进程,因为如果IO操作少,用多线程的话,线程会共享一个全局解释器锁。不能充分发挥多线程的优势。

3)协程,又称微线程,线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度。在一个线程中会有很多函数,我们把这些函数称为子程序,在子程序执行过程中可以中断去执行别的子程序,而别的子程序也可以中断回来继续执行之前的子程序,这个过程就称为协程。也就是说在同一线程内一段代码在执行过程中会中断然后跳转执行别的代码,接着在之前中断的地方继续开始执行,类似与yield操作。

协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此:协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态。

协程的优点:1)无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)(2)无需原子操作锁定及同步的开销(3)方便切换控制流,简化编程模型(4)高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

协程的缺点:(1)无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。2)进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序。
传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。如果改用协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高:
27、数据库的存储引擎?

mysql的默认存储引擎是innoDB,是唯一一个支持事务和支持外键的存储引擎

mysql的主要存储引擎有:innoDB,myISAM,merge,memory

myISAM:不支持事务,不支持外键,访问速度尤其快,如果以查询和插入为主的表可以设置myISAM引擎,锁定级别是表锁定

innoDB:支持事务安全,支持外键,锁定级别是行级锁定

1、InnoDB 支持事务,MyISAM 不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而 MyISAM就不可以了;

2、MyISAM 适合查询以及插入为主的应用,InnoDB 适合频繁修改以及涉及到安全性较高的应用;

3、InnoDB 支持外键,MyISAM 不支持;

4、对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM表中可以和其他字段一起建立联合索引;

5、清空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表;
28、Linux软连接和硬链接

ln命令用于给文件创建链接。软链接:类似于 Windows 系统中给文件创建快捷方式,即产生一个特殊的文件,该文件用来指向另一个文件,此链接方式同样适用于目录。硬链接:我们知道,文件的基本信息都存储在 inode 中,而硬链接指的就是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息。
29、python垃圾回收算法?

python垃圾回收主要以引用计数为主,标记-清除和分代清除为辅的机制,其中标记-清除和分代回收主要是为了处理循环引用的难题。引用计数算法
当有1个变量保存了对象的引用时,此对象的引用计数就会加1,当使用del删除变量指向的对象时,如果对象的引用计数不为1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除
30、迭代器,生成器,装饰器,闭包?

1)迭代器就是用于迭代操作的的对象,遵从迭代协议(内部实现了__iter__()和__next__()方法,可以像列表(可迭代对象,只有__iter__()方法)一样迭代获取其中的值,与列表不同的是,构建迭代器的时候,不像列表一样一次性把数据加到内存,而是以一种延迟计算的方式返回元素,即调用next方法时候返回此值。

2)生成器本质上也是一个迭代器,自己实现了可迭代协议,与生成器不同的是生成器的实现方式不同,可以通过生成器表达式和生成器函数两种方式实现,代码更简洁。生成器和迭代器都是惰性可迭代对象,只能遍历一次,数据取完抛出Stopiteration异常。区别:生成器一定是迭代器,但是迭代器不一定是生成器,因为创建一个迭代器只需要实现iter和next()方法就可以了,并不一定要使用yield实现。生成器的唯一注意事项就是:生成器只能遍历一次。

3)装饰器:在不修改原函数的情况下,给原函数添加新功能。一共有俩个函数,外层函数返回的是内层函数的函数名,用的时候在被装饰的函数上面加上@装饰器名。

4)闭包:闭包的概念就是当我们在函数内定义一个函数时,这个内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用。

https://www.cnblogs.com/wj-1314/p/8490822.html
31、import搜索过程

首先判断这个module是不是built-in即内建模块,如果是则引入内建模块,如果不是则在一个称为sys.path的list中寻找。sys.path在python脚本执行时动态生成,包括以下3个部分:a、脚本执行的位置,即当前路径b、环境变量中的PYTHONPATH, 即.bash_profilec. c、安装python时的依赖位置
32、HTTP和HTTPS的区别

HTTP是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。

HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

HTTPS和HTTP的区别主要如下:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
33、红黑树

简单来说,就是平衡的二叉查找树,特点1)结点是红色或黑色,2)根结点是黑色,3)每个叶子结点都是黑色的空结点(NIL结点),4)每个红色结点的两个子结点都是黑色(从每个叶子到根的所有路径上不能有两个连续的红色结点),5)从任一结点到其每个叶子的所有路径都包含相同数目的黑色结点。

红黑树能够以O(log2(N))的时间复杂度进行搜索、插入、删除操作,红黑树可以能确保树的最长路径不大于两倍的最短路径的长度,所以可以看出它的查找效果是有最低保证的。在最坏的情况下也可以保证O(logN)的,这是要好于二叉查找树的。因为二叉查找树最坏情况可以让查找达到O(N)。需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。Linux内核在管理vm_area_struct时就是采用了红黑树来维护内存块的。linux中进程的调度用的是红黑树。
34、cookie和session的区别

1,session 在服务器端,cookie 在客户端(浏览器)2、session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效,存储Session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息,进行了base64编码,过期时间由开发人员设置3、cookie安全性比session差。
35、对分布式的理解

在面对一些高并发,海量的数据任务时,一台服务器往往是不够的,而分布式就是让多台服务器协同工作,完成单台服务器无法处理的任务。即就是同一个业务拆成多个子业务,部署在不同服务器上。
36、线程同步的方法

1. 锁机制threading的Lock类,用该类的acquire函数进行加锁,用realease函数进行解锁,当一个线程调用锁的acquire()方法获得锁时,锁就进入“locked”状态。每次只有一个线程可以获得锁。如果此时另一个线程试图获得这个锁,该线程就会变为“blocked”状态,称为“同步阻塞”, 直到拥有锁的线程调用锁的release()方法释放锁之后,锁进入“unlocked”状态。线程调度程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入运行(running)状态。

2. 信号量:信号量也提供acquire方法和release方法,每当调用acquire方法的时候,如果内部计数器大于0,则将其减1,如果内部计数器等于0,则会阻塞该线程,知道有线程调用了release方法将内部计数器更新到大于1位置。

3. 条件判断:所谓条件变量,即这种机制是在满足了特定的条件后,线程才可以访问相关的数据。它使用Condition类来完成,由于它也可以像锁机制那样用,所以它也有acquire方法和release方法,而且它还有wait,notify,notifyAll方法。

4. 同步队列:put方法和task_done方法,queue有一个未完成任务数量num,put依次num+1,task依次num-1.任务都完成时任务结束。
37、进程间通信

管道,消息队列,共享内存。进程地址空间:父子进程代码共享,数据各自开辟空间,采用写时拷贝私有一份。
38、redis如何做持久化

一种是RDB(快照)持久化(默认)(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。优点:是一个紧凑压缩的二进制文件,Redis加载RDB恢复数据远远快于AOF的方式。另外一种是AOF(append only file)持久化(原理是将Reids的操作日志以追加的方式写入文件),AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。优点:实时持久化。
39、restful架构

(表征性状态转移),一种软件架构风格,描述的是在网络中client和server的一种交互形式,使得软件更简洁,更有层次,更易于实现缓存机制。规定:a、每一个url代表一种资源,客户端和服务器之间,传递这种资源的某种表现层c、客户端通过get,post,delete,update四个HTTP动词来对资源进行操作。
40、tcp实现可靠传输

1、确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就重传。

2、数据校验

3、数据合理分片和排序:IP数据报大于1500字节,大于MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每 一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于TCP的特性,当某一片数据传送中丢失时,接收方便 无法重组数据报.将导致丢弃整个TCP数据报.tcp会按MTU合理分片,接收方会缓存未按序到达的数据,重新排序后再交给应用层。

4、流量控制:当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。

5、拥塞控制:当网络拥塞时,减少数据的发送
41、flask,django面试题

https://blog.csdn.net/qq_41891803/article/details/81272575
https://www.cnblogs.com/chongdongxiaoyu/p/9403399.html
42、MVC,MVT

 1)MVC:软件的设计典范,用一种业务逻辑,数据,界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。    核心思想:解耦,让每一个模块独立的Model(模型):处理应用程序数据逻辑的部分,通常模型对象负责数据库存取数据。    View(视图):是应用程序中处理数据显示的部分,通常视图依据模型数据建立的。Controller(控制器):是应用程序处理用户交互的部分,通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
2)MVT:本质上与MVC模式没有什么差别,也是各组件为了保持松耦合关系,知识定义上有些许不同。
编程模式:model(模型):负责业务对象与数据库的对象(ORM)
Template(模板):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model
和Template。
44、mysql 事务特征

原子性(A):事务是最小单位,不可再分。一致性©:事务要求所有的DML语句操作的时候,必须保证同时成功或者同时失败。隔离性(I):事务A和事务B之间具有隔离性。持久性(D):是事务的保证,事务终结的标志(内存的数据持久到硬盘文件中)
45、docker了解不

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。Dockers的思想来源于集装箱,比如在一个大货轮上,各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。现在都流行云计算了,云计算就好比大货轮,docker就是集装箱。

A、不同的应用程序可能有不同的应用环境,比如开发的网站,依赖的软件环境并不一样,要是把他们安装在一个服务器上要调试很久,而且很麻烦。我们可以在服务器上创建不同的虚拟机在不同的虚拟机放置不同的应用,但是这样开销太大了。比如我电脑上装了一个虚拟机,运行起来都好卡。。而docker呢,可以实现虚拟机隔离应用环境的功能,且开销比较小。

B、比如开发软件用的是Ubuntu,但是运维管理用的是centos,那么在运维人员部署项目的时候,要是遇到有些东西不兼容,就会很麻烦,无形之中增加了工作量,但是,要是有docker你就可以将开发环境直接封装给运维人员,这就很方便,部署速度也很快。

C、在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。
--------------------- 
版权声明:本文为CSDN博主「精钩子娃」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42199781/article/details/92422941

你可能感兴趣的:(【Python】面试基础知识整理)