Python面试知识点一、
基础知识点
代码调式
调试方式1:
print(输出可能出现错误的数据)
调试方式2
断言调式
需要输出错误信息的位置处 不使用print 而是使用assert
格式:
assert 满足需求的条件, 出现不满足条件的数据提示的错误信息
说明:
如果满足条件 代码继续向下执行
不满足条件 直接在断言的位置报错 提示错误信息
调试方法3:
模块logging中的内容
把输出错误信息的位置 替换成logging
1. 导入模块logging
2. 在需要输出错误信息的位置
logging.info(提示的数据)
如果只写这一句 不会显示想输出的数据内容 如果想显示提示的数据 在导入模块的下方添加
logging.basicConfig(level=logging.INFO) ----> 使设置的info中的信息被输出
调试方法4:
pdb调试 --- 可以实现让代码一行一行执行
使用pdb测试的时候 需要启动pdb 启动语句是在控制台Terminal上书写的
前提进入到py文件所在的路径
指令: python -m pdb 执行的py文件
进入到pdb环境下 输入n执行单行代码
进入pdb环境下可以指令p 变量名 查看该变量的值
结束调试 输入q
调试方法5:
debug断点调试
单元测试
单元测试:
对一个模块, 一个函数或者是一个类进行正确检验的测试工具
比如:
系统提供的函数:
int() ----> 将数据转化为整型
需要导入模块 unittest
并且设置一个测试类 继承自unittest.TestCase
# value = [12, 13]
# res = int(value)
# print(res)
def cus_int(n):
import math
if type(n) == int:
return n
elif isinstance(n, float):
return math.floor(n)
elif isinstance(n, str):
if n.isdigit():
return eval(n)
else:
raise ValueError("数据不能转化为整型")
elif isinstance(n, bool):
return 1 if n else 0
else:
raise TypeError("不能转换指定类型")
def sort_list(src_list):
#排序算法 : 冒泡 对列表数据大小进行降序排序
for out in range(1, len(src_list)):
for inner in range(0, len(src_list) - out):
if src_list[inner] < src_list[inner+1]:
src_list[inner], src_list[inner + 1] = src_list[inner + 1], src_list[inner]
return src_list
from unittest_pack.test import cus_int, sort_list
import unittest
class Test(unittest.TestCase):
#测试的方法
def test_cus_int(self):
'''
第一个参数 要进行测验的执行函数
第二个参数 设置函数运行之后的预期值
第三个参数 如果函数运行结果 与 预期值不一致 提示的错误信息
'''
self.assertEqual(cus_int(5.12), 5, "转换结果不一致")
def test_sort_list(self):
self.assertEqual(sort_list([19, 27, 35, 41]), [41, 27, 35, 19], "排序失败")
if __name__ == '__main__':
unittest.main()
SQL语句的优化
在虚拟环境中安装第三方插件django-debug-toolbar,然后在settings,urls文件中配置所需要的条件,配置好之后,刷新一下浏览器,就会出现debug-toolbar这个插件,在上面我们可以看到页面加载所需要的时间,和页面加载所需要的所有的sql语句等,然后根据加载时间和sql语句对代码进行优化,可以使用redis来进行缓存加载,对于一些sql语句所查询的对象,一般先对redis缓存进行查询,如果存在就直接缓存加载,如果不存在就去数据库查询,然后set到redis当中,当下次加载直接进入缓存获取。
请简述项目中优化sql语句执行的效率的方法
(1)选择最有效率的表名顺序
(2)优化WHERE子句中的连接顺序,避免在where条件子句中,比较符号的左侧出现表达式、函数等操作。
(3)SELECT子句中避免使用‘*’
(4)用Where子句替换HAVING子句
(5)通过内部函数提高SQL效率
(6)避免在索引列上使用计算。
(7)提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。
(8)尽量避免使用or,因为这会全表搜索扫描
(9)使用limit子句限制返回的数据行数
memcached缓存
memcached与redis相比的缺点是它的数据不能持久化,仅作为缓存来用。
对于单个对象的缓存适合用memcache
缓存整个页面
from django.views.decorators.cache import cache_page
@cache_page(60)
def index(request,page=1)
session和cookie
简述Session的原理,并说明session和cookies的区别。
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
1、cookie数据存放在客户的浏览器上,session数据放在服务器上
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE
什么是http无状态协议,怎么解决?
http协议无状态中的【状态】到底指的是什么?!
先来看这句话的另外两个概念:(标准的http协议是无状态的,无连接的)
标准的http协议指的是不包括cookies, session,application的http协议,他们都不属于标准协议,虽然各种网络应用提供商,实现语言、web容器等,都默认支持它
无连接指的是什么
每一个访问都是无连接,服务器挨个处理访问队列里的访问,处理完一个就关闭连接,这事儿就完了,然后处理下一个新的
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接
两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session
http和https
http和https的区别和优缺点。
\1. http 的URL 以http:// 开头,https以https:// 开头。
\2. http 标准端口是80 ,https是443。
3.https 协议需要到ca申请证书,http不需要。
4.http 是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
5.http 的连接很简单,是无状态的,https协议是由SSL+http协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全。
优点:
- 通过证书可以更信任服务器。
- 更安全,防篡改。
缺点:
- https 需要证书。
- 因为对传输进行加密,会一定程度增加cpu消耗。
- 由于https 要还密钥和确认加密算法的需要,所以首次建立连接会慢一些。
- 带宽消耗会增加。
TCP和UDP
tcp传输控制协议
tcp传输控制协议是面向连接的,面向连接就是在正式通信前必须要与对方建立起连接,比如你给别人打电话,必须等线路接通了,对方拿起话筒才能相互通话。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍
我们来看看这三次对话的简单过程:
\1. 主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;
\2. 主机B向主机A发送同意连接和要求同步