python常见面试集合

Python面试题目
1、Python
1. python的多进程与多线程的运行机制是什么?有什么区别?分别在什么状况下用?
2. Python的装饰器的原理是什么,在什么状况会用到装饰器。请手写Python装饰器代码
3. 如何提升Python的运行效率,请说出很多于2种提升运行效率的方法。
4. 介绍下“消费者”和“生产者”模型。
https://blog.csdn.net/sanyuesan0000/article/details/52996586
https://www.cnblogs.com/alex09/p/6675664.htmlhtml

2、HTTP/HTTPS,TCP/IP协议
1. 关于HTTP/HTTPS的区别,分别应该在什么场合下。python

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,若是攻击者截取了Web浏览器和网站服务器之间的传输报文,就能够直接读懂其中的信息,所以,HTTP协议不适合传输一些敏感信息,好比:信用卡号、密码等支付信息。linux

为了解决HTTP协议的这一缺陷,须要使用另外一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通讯加密。SSL(Secure Sockets Layer)面试

HTTPS和HTTP的区别主要以下:redis

一、https协议须要到ca申请证书,通常免费证书较少,于是须要必定费用。算法

二、http是超文本传输协议,信息是明文传输,https则是具备安全性的ssl加密传输协议。数据库

三、http和https使用的是彻底不一样的链接方式,用的端口也不同,前者是80,后者是443。浏览器

四、http的链接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。缓存

2.HTTPS有什么优势和缺点安全

HTTPS的优势:

一、SEO方面

比起同等HTTP网站,采用HTTPS加密的网站在搜索结果中的排名将会更高”。

二、安全性

(1)、使用HTTPS协议可认证用户和服务器,确保数据发送到正确的客户机和服务器;

(2)、HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全,可防止数据在传输过程当中不被窃取、改变,确保数据的完整性。

(3)、HTTPS是现行架构下最安全的解决方案,虽然不是绝对安全,但它大幅增长了中间人攻击的成本。

一、SEO方面. 使用HTTPS协议会使页面的加载时间延长近50%,增长10%到20%的耗电,此外,HTTPS协议还会影响缓存,增长数据开销和功耗,甚至已有安全措施也会受到影响也会所以而受到影响。

二、经济方面. 费用较高.

 

3. HTTPS是如何实现安全传输数据的。

HTTPS要使客户端与服务器端的通讯过程获得安全保证,必须使用的对称加密算法,可是协商对称加密算法的过程,须要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程自己也不安全,会有中间人篡改公钥的可能性,因此客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程自己的安全。这样经过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通讯安全问题。

 一、客户端发起HTTPS请求

二、服务端的配置(数字证书,公钥和私钥,)

三、传送证书( 颁发机构,过时时间等)

四、客户端解析证书

五、传送加密信息

六、服务段解密信息

七、传输加密后的信息

八、客户端解密信息

 参考:https://blog.csdn.net/kobejayandy/article/details/52433660

对称加密: 将信息和私钥(随机值)经过某种算法混合在一块儿

非对称加密的加密算法,特色是私钥加密后的密文,只要是公钥,均可以解密,可是公钥加密后的密文,只有私钥能够解密。私钥只有一我的有,而公钥能够发给全部的人

4. HTTPS安全证书是怎么来的,如何申请,国内和国外有哪些第三方机构提供安全证书认证。

有自签和第三方公司. 上海市数字证书认证中心, 北京数字认证股份有限公司


5. get和post请求有什么区别,分别应该在什么场合下。

get请求的参数通常放在url中,可是浏览器和服务器程序对url长度仍是有限制的。
post请求的参数通常放在body,你硬要放到url中也能够。

在RESTful风格中,get用于从服务器获获取数据,而post用于建立数据


6. TCP三次握手、四次挥手,请说出每次发送的状态码。 

  syn:同步请求,创建链接    ack: 回复,确认

第一次握手:创建链接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP链接成功)状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据,在上述过程当中,还有一些重要的概念:

未链接队列
在三次握手协议中,服务器维护一个未链接队列,该队列为每一个客户端的SYN包(syn=j)开设一个条目,该条目代表服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的链接在服务器处于SYN_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。

 

关闭TCP链接:改进的三次握手
(使用一个带有FIN附加标记的报文段)TCP关闭链接的步骤以下:

第一步,当客户端的应用程序通知TCP数据已经发送完毕时,TCP向服务器发送一个带有FIN附加标记的报文段(FIN表示英文finish)。

第二步,服务器收到这个FIN报文段以后,并不当即用FIN报文段回复客户端,而是先向客户端发送一个确认序号ACK,同时通知本身相应的应用程序:对方要求关闭链接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。

第三步,服务器的应用程序告诉TCP:我要完全的关闭链接,TCP向客户端送一个FIN报文段。

第四步,客户端收到这个FIN报文段后,向服务器发送一个ACK表示链接完全释放。


7. HTTP请求会有哪些信息发送到后台服务器。


3、数据库
0. MySQL的经常使用引擎有哪些?有什么区别?

(1)MyISAM存储引擎  不支持事务、也不支持外键,优点是访问速度快

(2)InnoDB存储引擎  提供了具备提交、回滚和崩溃恢复能力的事务安全。可是对比MyISAM引擎,写的处理效率会差一些,而且会占用更多的磁盘空间以保留数据和索引。 
InnoDB存储引擎的特色:支持自动增加列,支持外键约束

(3)MEMORY存储引擎  使用存在于内存中的内容来建立表, 访问很是的快, 默认使用HASH索引, 一旦服务关闭,表中的数据就会丢失掉.

(4)MERGE存储引擎  它是MyISAM表的组合,这些MyISAM表必须结构彻底相同,merge表自己并无数据,对merge类型的表能够进行查询,更新,删除操做,这些操做其实是对内部的MyISAM表进行的。


1. redis是什么类型数据库,能够存哪些数据结构的数据。

redis是内存型的key-value型的非关系型数据库,支持数据持久化.

Redis是一个字典结构的存储服务器, 能够储存String, Hash, List, Set, zset数据.

2. redis有多少个库?

每一个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(能够经过配置文件支持更多,无上限)


3. redis、MongoDB有什么区别,分别应用在什么状况下。

redis:是一个key-value存储系统(布式内缓存,高性能的key-value数据库)

MongoDB: 是一个介于关系数据库和非关系数据库之间的产品(基于分布式文件存储的数据库),是非关系数据库当中功能最丰富,最像关系数据库的。

内存管理机制:Redis数据所有存在内存,按期写入磁盘,当内存不够时,能够选择指定的LRU算法删除数据。

      MongoDB数据存在内存,由linux系统mmap实现,当内存不够时,只将热点数据放入内存,其余数据存在磁盘。

支持的数据结构: Redis支持的数据结构丰富,包括hash、set、list等。

        MongoDB数据结构比较单一,可是支持丰富的数据表达,索引,最相似关系型数据库,支持的查询语言很是丰富。

性能: 两者性能都比较高,应该说都不会是瓶颈。

可靠性: 两者均支持持久化。

集群: MongoDB集群技术比较成熟,Redis从3.0开始支持集群。

适用场景: reids 适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。

    MongoDB 主要解决海量数据的访问效率问题。


4. MongoDB是以什么数据结构存入的。

文件存储格式为Bson,使用易于掌握和理解的Json风格语法。相对Json来讲,Bson拥有更好的性能,主要表现为更快的遍历速度、操做更简易、增长了额外的数据类型


5. 如何优化MySql数据库

1.优化索引、SQL语句、分析慢查询;
2.设计表的时候严格按照数据库的设计范式来设计数据库;
3.咱们还能够将咱们的业务架构进行缓存,静态化和分布式;

4.若是效率仍是不够好,能够采用主从方式将数据读写分离;

5.硬件优化:使用更好的一些硬盘(固态硬盘),使用一些磁盘阵列技术.


4、scrapy和scrapy-redis
1. 描述下scrapy框架运行的机制?
答:从start_urls里获取第一批url并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给本身编写的解析方法作提取处理:1. 若是提取出须要的数据,则交给管道文件处理;2. 若是提取出url,则继续执行以前的步骤(发送url请求,并由引擎将请求交给调度器入队列...),直到请求队列里没有请求,程序结束。


2. scrapy和scrapy-redis有什么区别?为何选择redis数据库?
答:
1) scrapy是一个Python爬虫框架,爬取效率极高,具备高度定制性,可是不支持分布式。而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合。
2) 为何选择redis数据库,由于redis支持主从同步,并且数据都是缓存在内存中的,因此基于redis的分布式爬虫,对请求和数据的高频读取效率很是高。


3. 反爬虫的机制有哪些?
答:
1) User—Agent
2) 代理ip
3) 访问频率限制
4) 验证码处理
5) Cookie
6) 动态HTML数据加载


4. 实现模拟登陆的方式有哪些?
答:
1) 使用一个具备登陆状态的cookie,结合请求报头一块儿发送,能够直接发送get请求,访问登陆后才能访问的页面。
2) 先发送登陆界面的get请求,在登陆页面HTML里获取登陆须要的数据(若是须要的话),而后结合帐户密码,再发送post请求,便可登陆成功。而后根据获取的cookie信息,继续访问以后的页面。


5. get和post请求有什么区别?分别应该在什么场合下。
答:
1) get请求用于直接获取指定url的响应数据,和服务器没有交互信息。
2) post请求在获取响应数据前,会先发送form表单,服务器会根据form表单来返回响应数据。


6. Selenium、PhantomJS是什么?能够为爬虫作哪些事情?
答:
1) Selenium是一种自动测试化工具,能够导入使用指定的浏览器,在发送请求获取响应后,响应数据则会在指定的浏览器里执行完毕。而PhantomJS是一种无界面浏览器,相比传统的Chrome或Firefox浏览器等,资源消耗会更少。
2) 在Python爬虫代码里使用Selenium和PhantomJS组合,至关于真实浏览器的执行状态,能够直接获取动态HTML数据(如JavaScript、Ajax加载的数据等),而且支持模拟键盘事件、鼠标点击事件、执行JavaScript语句等。在一些反爬虫极端状况下,Selenium+PhantomJS能够做为终极解决方案。

七、简单介绍下scrapy的异步处理。答:scrapy框架的异步机制是基于twisted异步网络框架处理的,在settings.py文件里能够设置具体的并发量数值(默认是并发量16)。

相关文章
相关标签/搜索