![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
面试
python面试题
Lewis-Liu.
临渊羡鱼,不如退而结网
展开
-
sql语句练习题
创建表,(id,标题title, 100字内,公司f_id, 10以内数字,类型f_type进口1, 出口2,金额,2位小数,时间)并插入几条数据。create table t_order(id int unsigned primary key auto_increment not null, title varchar(100) default '', f_id tinyint unsigned, f_type enum("1", "2"), mo.原创 2020-08-31 15:27:05 · 810 阅读 · 0 评论 -
MySQL sql语句执行过程和顺序
MySQL 基本架构连接器: 身份认证和权限相关(登录 MySQL 的时候)。查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除,因为这个功能不太实用)。分析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。优化器: 按照 MySQL 认为最优的方案去执行。执行器: 执行语句,然后从存储引擎返回数据。sql语句编写顺序<SELECT clause> [<FROM原创 2020-08-31 12:19:35 · 282 阅读 · 0 评论 -
Python 的异常处理机制
如果我们没有对异常进行任何预防,那么在程序执行的过程中发生异常,就会中断程序,调用 python默认的异常处理器,并在终端输出异常信息。用try…except…捕获异常, 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。如果里面的try捕获到了异常进行了处理就不会传递到外面。with open打开文件, 如果 with 语句或语句块中发生异常, 会调用默认的异常处理器处理, 但文件还是会正常关闭。.原创 2020-08-20 01:17:29 · 359 阅读 · 1 评论 -
Redis 的使用场景
1.取最新 N 个数据的操作2.排行榜应用,取 TOP N 操作3.需要精准设定过期时间的应用4.计数器应用5.uniq 操作,获取某段时间所有数据排重值6.Pub/Sub 构建实时消息系统7.构建队列系统8.缓存原创 2020-08-20 01:17:14 · 157 阅读 · 0 评论 -
Python内存管理与垃圾回收机制
内存管理机制:引用计数、垃圾回收、内存池。1.引用计数:当一个 Python 对象被引用时其引用计数增加 1,当其不再被一个变量引用时则计数减 1,当引用计数等于 0 时对象被删除。2.垃圾回收:引用计数-当 Python 的某个对象的引用计数降为 0 时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。标记清除-如果两个对象的引用计数都为 1,但是仅仅存在他们之间的循环引用,那么这两个对象都是需要被回收的。分代回收3.内存池:Python 的内存机制呈现金字塔形状。第 1 层和第原创 2020-08-20 01:16:55 · 105 阅读 · 0 评论 -
MVC,MVT思想
MVC框架的核心思想是:解耦,让不同的代码块之间降低耦合,增强代码的可扩展性和可移植性,实现向后兼容。M全拼为Model,主要封装对数据库层的访问,对数据库中的数据进行增、删、改、查操作。V全拼为View,用于封装结果,生成页面展示的HTML部分。C全拼为Controller,用于接收请求,处理业务逻辑,与Model,View交互,返回结果。Django框架遵循MVC设计,并且有一个专有名词:MVT。M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理。V全拼为Vie原创 2020-08-20 01:16:39 · 167 阅读 · 0 评论 -
TCP如何实现长连接
应用层的心跳机制通过应用程序自身发送心跳包去检测连接是否正常,基本方法就是在服务器端设置一个Timer事件,在一定时间段内向客户端一个心跳数据包,若在一定时间内没有收到客户端的回应,那么就会认为客户端掉线;同样客户端在一定时间段内没有收到服务器的心跳包,则判断与服务器端连接断开。TCP的keepalive机制其实跟心跳机制大同小异,无论是客户端还是服务器端,只要有一方开启Keepalive功能后,就会在特定的时间段内发送心跳包,对端在收到心跳包后进行回复,表示自己在线。默认的Keepalive..原创 2020-08-20 01:15:53 · 3662 阅读 · 0 评论 -
Nginx服务器优点
nginx是一个开源高性能的HTTTP服务器。响应很快,处理静态文件效率高高扩展性,跨平台高可靠性,稳定占用内存小,配置简洁支持负载均衡和正向反向代理功能,支持高并发原创 2020-08-20 00:07:38 · 266 阅读 · 0 评论 -
说说 Nginx 和 uWISG 服务器之间如何配合工作的
首先浏览器发起 http 请求到 nginx 服务器,Nginx 根据接收到请求包,进行 url 分析,判断访问的资源类型,如果是静态资源,直接读取静态资源返回给浏览器,如果请求的是动态资源就转交给 uwsgi服务器,uwsgi 服务器根据自身的 uwsgi 和 WSGI 协议,找到对应的 Django 框架,Django 框架下的应用进行逻辑处理后,将返回值发送到 uwsgi 服务器,然后 uwsgi 服务器再返回给 nginx,最后 nginx将返回值返回给浏览器进行渲染显示给用户。...原创 2020-08-19 09:16:53 · 249 阅读 · 0 评论 -
事务的特性
原子性: 事务中的所有操作是不可分割的, 要么全部执行, 要么全部不执行一致性: 并行的事务的处理结果必须和事务串行时的顺序执行的结果一致隔离性: 事务不会受到其他事务的干扰, 事务的中间结果必须对其他事务是透明的持久性: 对于已提交的事务, 系统必须保证事务对数据库的操作是不会丢失的...原创 2020-08-19 09:15:03 · 112 阅读 · 0 评论 -
如何设计restful风格的api
REST:Representational State Transfer 的缩写,翻译:“具象状态传输”。一般解释为“表现层状态转换”。REST 是设计风格而不是标准,是指客户端和服务器的交互形式。域名: 将api部署在专用域名下, 或主域名下。版本: 将api的版本放在url中。路径: url中不能有动词, 名词要用复数。过滤信息: api应该设置过滤参数, 指定返回数据的数量, 返回数据的起始位置, 第几页和每页数量。使用标准的HTTP方法: GET, POST, PUT, DELETE原创 2020-08-19 09:14:27 · 285 阅读 · 0 评论 -
请简述浏览器是如何获取一枚网页的?
在用户输入目的 URL 后,浏览器先向 DNS 服务器发起域名解析请求;在获取了对应的 IP 后向服务器发送请求数据包;服务器接收到请求数据后查询服务器上对应的页面,并将找到的页面代码回复给客户端;客户端接收到页面源代码后,检查页面代码中引用的其他资源,并再次向服务器请求该资源;在资源接收完成后,客户端浏览器按照页面代码将页面渲染输出显示在显示器上。...原创 2020-08-19 09:14:02 · 232 阅读 · 0 评论 -
简单说一下三次握手和四次挥手
第一次握手:首先客户端向服务端发送一个带有 SYN 连接请求标志,以及随机生成的序号 seq=x 的报文,等待服务端确认。第二次握手:服务端收到报文后返回一个 seq=y,ACK=x+1 的报文给客户端以确认连接请求。第三次握手:客户端收到确认后,检查ACK是否为 x+1,如果正确则发送带有 ACK=y+1 的报文给服务端。服务端检查ack是否为 y+1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态,完成三次握手,随后客户端与服务端之间可以开始传输数据了。四次挥手过程,..原创 2020-08-19 09:13:23 · 543 阅读 · 0 评论 -
CSRF攻击原理以及解决方案
CSRF攻击原理:你访问了信任网站 A,然后 A 会用保存你的个人信息并返回浏览器一个cookie,然后在 cookie 的过期时间之内,你去访问了恶意网站 B,它给你返回一些恶意请求代码,要求你去访问网站 A,而你的浏览器在收到这个恶意请求之后,在你不知情的情况下,会带上保存在本地浏览器的 cookie 信息去访问网站 A,然后网站 A 误以为是用户本身的操作,导致来自恶意网站 B 的攻击代码会被执:发邮件,发消息,修改你的密码,购物,转账,偷窥你的个人信息,导致私人信息泄漏和账户财产安全收到威胁。解决原创 2020-08-19 09:12:49 · 1343 阅读 · 0 评论 -
import module和from module import *的区别
import module,引用模块中的变量时要用module.变量名;from module import *,引用模块中变量时只需直接使用变量名import module,使用模块中的变量时,使用的是原模块中的变量,不会创建新的变量;from module import *,使用模块中的变量时,会把原模块中的变量复制到本地,会创建新的对象。开发中建议用import module。...原创 2020-08-19 09:12:31 · 1965 阅读 · 0 评论 -
数据库三范式
第一范式确保每一列的原子性,数据表中的每一列,必须是不可拆分的最小单元,不能够再拆分成其他列。第二范式满足第一范式后要求表中的所有列,都必需依赖于主键,而不能有任何一列与主键没有关系。第三范式满足第二范式后要求表中的所有列只能直接依赖于主键,而不能间接依赖。...原创 2020-08-19 09:12:14 · 85 阅读 · 0 评论 -
简述Docker
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后移植到任何其他平台上。优点更快速的交付和部署Docker 容器几乎可以在任意的平台上运行,这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。启动速度快资源利用率高一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。性能开销小容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能原创 2020-08-19 09:11:48 · 179 阅读 · 0 评论 -
简述 TCP 和 UDP 的区别以及优缺点
UDP 是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息。优点:UDP速度快、操作简单、要求系统资源较少,由于通讯不需要连接,可以实现广播发送缺点:UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号,发送端不知道数 据是否会正确接收,也不重复发送,不可靠。TCP 是面向连接的通讯协议,通过三次握手建立连接,通过四次挥手断开连接。优点:TCP在数据传递时,有确认、窗口、重传、阻塞等控制机制,能保证数据正确性,较为可靠。缺点:TCP 相对于 UDP 速度慢一.原创 2020-08-19 09:11:08 · 377 阅读 · 0 评论 -
Python正则re.match,search,findall,sub 的区别
match()函数只检测 RE 是不是在 string 的开始位置匹配,只有在 0 位置匹配成功的话才有返回,如果不是开始位置匹配成功的话,match()就返回 nonesearch()会扫描整个 string 查找匹配findall 查找多个字符,返回列表sub 将匹配到的数据进行替换,返回替换后的新字符串...原创 2020-08-18 15:32:59 · 396 阅读 · 0 评论 -
生成器、迭代器
在类里面定义__iter__和__next__方法创建的对象就是迭代器对象, for 语句对容器对象就是先通过iter()函数获取可迭代对象Iterable的迭代器,然后对获取到的迭代器不断调用next()方法来获取下一个值并将其赋值给item,当遇到StopIteration的异常后循环结束。生成器是一类特殊的迭代器,它不需要再像上面的类一样写__iter__()和__next__()方法了, 使用更加方便,它依然可以使用next函数和for循环取值。yield: 每次启动生成器都会返回一个值,多次启原创 2020-08-18 15:25:11 · 141 阅读 · 0 评论 -
map 函数和 reduce 函数
①从参数方面来讲:map()包含两个参数,第一个参数是一个函数,第二个是序列(列表 或元组)。其中,函数(即 map的第一个参数位置的函数)可以接收一个或多个参数。reduce()第一个参数是函数,第二个是序列(列表或元组)。但是,其函数必须接收两个参数。②从对传进去的数值作用来讲:map()是将传入的函数依次作用到序列的每个元素,每个元素都是独自被函数“作用”一次 。reduce()是将传人的函数作用在序列的第一个元素得到结果后,把这个结果继续与下一个元素作用(累积计算)。...原创 2020-08-18 15:22:29 · 572 阅读 · 0 评论 -
Python线程, 进程, 协程
进程进程是系统资源分配的最小单位,一个运行的程序就是一个进程的实例,进程拥有自己独立的内存空间,所以进程间数据不共享,资源开销大。进程之间通过队列进行通信。进程可以使用多核CPU。进程适用于CPU计算密集型的场景。线程线程是CPU调度执行的最小单位,不能独立存在,依赖进程存在, 一个进程至少有一个线程,而多个线程共享数据,共享全局变量, 资源开销小。线程之间共享数据,所以会产生资源竞争。为了避免这个问题,所以线程有GIL锁(全局解释器锁)和互斥锁。线程的多线程其实是伪多线程,是并发的。原创 2020-08-18 12:11:29 · 118 阅读 · 0 评论 -
Python深拷贝,浅拷贝的区别
浅拷贝会创建新对象, 拷贝顶层对象,但不会拷贝内部的子元素对象。外层内存地址发生改变, 内层元素内存地址不变。浅拷贝拷贝列表 a, 列表 a中有一个嵌套的list,我们修改了它,列表 a 也会发生变化。浅拷贝有三种形式:切片操作、工厂函数b = list(a)、copy 模块中的 copy 函数。深拷贝只有一种形式,copy 模块中的 deepcopy()函数。深拷贝拷贝了对象的所有元素,包括多层嵌套的元素,深拷贝拷贝出来的对象是一个全新的对象,内存地址改变,不再与原来的对象有任何的关联。当顶层对原创 2020-08-18 11:59:32 · 104 阅读 · 0 评论 -
*args,**kwargs的意思
*args 是不定长参数,他可以表示输入参数是不确定的,可以是任意多个。**kwargs 是关键字参数,赋值的时候是以键 = 值的方式,参数是可以任意多对。原创 2020-08-18 11:49:09 · 145 阅读 · 0 评论 -
简述 read,readline 和 readlines 的区别
read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,read()那么就表示读取文件中所有的数据readline()每只读取文件的一行,返回 str类型readlines()可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素...原创 2020-08-18 11:39:22 · 3367 阅读 · 0 评论 -
Python 中 is 和 == 的区别
Python 中的对象包含三要素:id、type、value。其中 id 用来唯一标识一个对象,type 多态,value 是对象的值。is 判断的是 a 对象是否就是 b 对象,是通过 id 来判断内存地址是否一致。==判断的是 a 对象的值是否和 b 对象的值相等,是通过 value 来判断的。...原创 2020-08-18 11:31:45 · 100 阅读 · 0 评论 -
Mysql中MyISAM与InnoDB引擎的区别
1.myisam是默认引擎, innodb需要指定2.innodb支持事务, 在事务中操作出错可以进行数据库回滚, myisam每次查询具有原子性但不支持事务3.innodb支持外键, myisam不支持外键4.MyISAM 在磁盘上存储成三个文件, InnoDB所有的表都保存在同一个数据文件中5.myisam适合查询插入为主的应用, innodb适合频繁修改和安全性较高的应用...原创 2020-08-18 11:22:49 · 98 阅读 · 0 评论 -
lambda 匿名函数
lambda 函数是一个可以接收任意多个参数并且返回单个表达式值的函数sum = lambda arg1, arg2: arg1 + arg2sum( 10, 20 )应用场景:匿名函数,一般用来给 filter, map 这样的函数式编程服务作为回调函数,传递给某些应用,比如消息处理函数作为参数传递...原创 2020-08-18 11:20:02 · 104 阅读 · 0 评论 -
Scrapy爬虫框架
scrapy的流程爬虫中起始的url构造成request对象–>爬虫中间件–>引擎–>调度器调度器把request–>引擎–>下载中间件—>下载器下载器发送请求,获取response响应---->下载中间件---->引擎—>爬虫中间件—>爬虫爬虫提取url地址,组装成request对象---->爬虫中间件—>引擎...原创 2020-04-24 21:38:57 · 301 阅读 · 0 评论 -
HTTP和HTTPS协议
HTTP协议是(超文本传输协议)的缩写, 是用于从万维网服务器传输超文本到本地浏览器的传送协议, HTTP基于TCP/IP通信协议来传递数据。HTTPS(超文本传输安全协议),HTTPS 协议是由 SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,SSL协议用于对HTTP 协议传输的数据进行加密,要比 http 协议安全。HTTP: 直接通过明文在浏览器和服务器之间传递信息。HTTPS: 采用 对称加密 和 非对称加密 结合的方式来保护浏览器和服务端之间的通信安全。..原创 2020-08-15 17:49:57 · 104 阅读 · 0 评论 -
Python读取大文件的方法
使用生成器读取(指定读取长度)def read_file(file_obj, size=1024): while True: data = file_obj.read(size) yield data if not data: breakdef deal_data(data): passwith open('z.txt', 'r', encoding='utf-8') as f: for dat.原创 2020-08-12 18:17:17 · 209 阅读 · 0 评论 -
乐观锁与悲观锁
悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁一般会使用版本号机制或CAS算法实现。版本号机制:一般是在数据表中加上一个数据版本号version字段,表示数据被修改原创 2020-08-09 17:10:25 · 806 阅读 · 0 评论 -
Mysql数据库优化
可以给查询频率高的字段,创建索引分表分库对sql查询语句进行优化,要尽量避免全表扫描主从配置, 读写分离使用缓存, 把经常访问不经常改变的数据放进缓存中,减少对数据库的访问原创 2020-08-08 19:05:17 · 117 阅读 · 0 评论 -
Linux常用命令
查阅命令帮助信息: command --help man commandls -ahl-a 显示隐藏文件-h 显示文件大小单位-l 列表形式显示详细信息查看当前路径: pwd新建文件: touch a.txt删除文件: rm a.txt新建文件夹: mkdir dir1递归创建目录: mkdir -p a/b/c/d删除文件夹: rm -r dir1 rmdir dir1rm-i 交互方式-f 强制删除,不提示-r 递归删除文件夹下的内容递归复制文原创 2020-07-19 16:30:53 · 160 阅读 · 0 评论 -
Git源代码管理
一. 简介Git 是分布式管理.服务器和客户端都有版本控制能力,都能进行代码的提交、合并、…Git会在根目录下创建一个.git隐藏文件夹,作为本地代码仓库工作区对于添加、修改、删除文件的操作,都发生在工作区中(红色文件)暂存区暂存区指将工作区中的操作完成小阶段的存储,是版本库的一部分 (绿色)在暂存区的版本一旦提交就再也没有了仓库区仓库区表示个人开发的一个小阶段的完成仓库区中记录的各版本是可以查看并回退的二. Git单人本地仓库操作在桌面创建test文件夹,表原创 2020-07-18 23:04:33 · 476 阅读 · 0 评论 -
Python最简单的两种排序算法-冒泡,选择排序(代码,图解)
1.冒泡排序冒泡排序从列表的开头处开始,逐个比较相邻两个数据,如果前面的值大于后面的值,交换两个数据的位置,一直比较到列表的末尾。这个过程就是将最大的项以冒泡的方式排到末尾。然后算法从列表开头到倒数第二项重复这一过程,依次类推。def bubble_sort(alist): for j in range(len(alist)-1,0,-1): for i in range(j): if alist[i] > alist[i+1]: al原创 2020-07-17 23:15:48 · 1765 阅读 · 0 评论 -
Python遍历文件夹及其子文件夹中的所有文件
# coding:utf-8import ospath = "C:\\Users\\15527\\Desktop\\demo"def get_file(path, file_list): if os.path.isfile(path): file_list.append(path) elif os.path.isdir(path): for item in os.listdir(path): item_path = os.p原创 2020-07-15 21:57:01 · 697 阅读 · 0 评论 -
使用__new__实现单例模式
单例模式是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在,节约内存资源。class Singleton(): def __new__(cls): if not hasattr(cls, "_instance"): cls._instance = super().__new__(cls) return cls._instancea = Singleton()b = Singleton()print(id(a.原创 2020-07-15 15:22:39 · 820 阅读 · 0 评论 -
装饰器
装饰器本质上是一个 Python函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能,装饰器的返回值(return)也是一个函数对象。def test(func): def wrapper(*args, **kwargs): print("装饰器中的功能") return func(*args, **kwargs) return wrapper @test def foo(a, b, c): return a, b, c print(foo(1,2,.原创 2020-07-15 00:00:40 · 123 阅读 · 0 评论 -
Mysql数据库常用sql语句
1.数据库 test连接: mysql -uroot -p密码退出: quit/exit/ctrl + D查看-当前: select database(); 所有: show databases;创建: create database test charset=utf8;使用: use test;删除: drop database test;2.数据表 student查看所有表: show tables;查看表的结构: desc student;创建表: create tab原创 2020-07-06 20:19:45 · 381 阅读 · 1 评论