admin 管理员组文章数量: 887031
Python
Python为什么是解释型语言
顺序执行的 没有静态检查 没有编译链接过程 可以交互式运行
c语言类型不对是编译抛的错误,python类型不对是运行抛的错误
也就是python是一条条运行的,c需要整个编译过了才能运行
面向对象和面向过程的区别
面向对象是把构成问题的事务分解成各个对象,建立对象来描述某个事务在解决问题的步骤中的行为;
面向过程是分析出解决问题所需要的步骤,然后用一些函数把这些步骤一步步实现,使用的时候依次调用函数就行了。
Python有什么优势
解释型,语法简单易懂,可读性强
有很多库可以用,可以让我们站在巨人的肩膀上简单的实现想要的功能
可扩展,和其他编程语言或其他软件有可连接的接口
免费开源、可移植
自动内存管理,让程序员可以专注于代码的实现
缺点:
他的可解释特征使其运行速度变慢
动态语言的特点可能会增加运行时错误。
装饰器
装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,它接受一个函数作为参数,并返回一个函数,利用python的@语法来放置
功能:1.引入日志;2.函数执行时间统计;3.执行函数前预备处理;4.执行函数后清理功能;5.权限校验;6.缓存
python 装饰器@staticmethod和@classmethod区别和使用
@classmethod:类方法,类方法是给类用的,类在使用时会将类本身当做参数传给类方法的第一个参数,python为我们内置了函数classmethod来把类中的函数定义成类方法。
@staticmethod:静态方法
用上面两个装饰器就可以不用在实用类前对类进行实例化了,
@property:将一个实例方法提升为属性,便于访问
写一个装饰器
复制代码
import functools
import time
def print_run_time(func):
@functools.wraps(func) def wrapper(*args,**kw):
local_time=time.time()
func(*args,**kw)
t=time.time()-local_time
print(t)
return wrapper
@print_run_time
def test(x):
for i in range(1000):
print(x,end='')
print('\n')
return x
test(1)
functools.warp方法是把被wrapped的函数的属性传递给wrapper的函数,不写的话不支持参数
深拷贝、浅拷贝和等号赋值
深拷贝:新建一个对象,把原来对象的内存完全复制过来,改变复制后的对象,不会改动原来内存的内容。(两个对象在复制之后是完全独立的对象)
等号赋值:相当于为原来的对象打一个新的标签,两个引用指向同一个对象,修改其中的一个,另一个也会产生变化
浅拷贝:两种情况,1. 浅拷贝的值是不可变对象(数值、字符、元组)时,和等于赋值一样,对象的id值和浅拷贝原来的值相同;2. 如果是可变对象(列表、字典等),a. 一个简单的没有嵌套的对象,复制前后的对象相互之间不会影响,b. 对象中有复杂子对象,如列表嵌套,如果改变原来的对象中复杂子对象的值,浅拷贝的值也会受影响,因为在浅拷贝时只复制了子对象的引用(只拷贝父对象)。
在python中如何实现多线程
Thread,新建线程,然后可以用GIL实现线程通信
GIL
GIL(全局解释锁)能确保一次执行一个线程,线程轮流保存GIL并且在把他传给下一个线程之前执行一些操作,以达到多个进程在CPU上轮流运行,但是这个转换速度很快,让我们觉得他是并行的。
类
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类的继承
当一个类继承自另一个类,它就被称为一个子类/派生类,继承自父类/基类/超类。它会继承/获取所有类成员(属性和方法)。
Python如何内存管理
1. 引用计数:python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。
2. 垃圾回收:python会检查引用计数为0的对象,清除其在内存占的空间;循环引用对象则用一个循环垃圾回收器来回收
3. 内存池机制:在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。
a) Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
b) Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
Python垃圾回收机制
(自动处理分配回收内存的问题,没用了内存泄漏的隐患),以引用计数机制为主,标记-清楚和分代收集两种机制为辅
计数机制就是python中的每一个对象都有一个引用计数的值,当有引用的时候,这个值会增加,引用他的对象被删除时,这个值减小,引用计数的值为0时,该对象生命结束,python会把这段内存自动回收。(缺点,循环引用,如果l1和l2相互引用,没用其他的对象引用他们,这两段内存永远无法被回收)
猴子补丁
在运行期间动态修改一个类或模块,比较灵活?
为什么要用猴子补丁:
引用通用库里的模块,又想丰富模块的功能,就可以用猴子补丁。
参数,传参
位置参数和关键字参数的区别
*args一定要在**kwargs前面
*args和**kwargs的含义
不知道向函数传递多少参数时,比如传递一个列表或元组,就使用*args
def func(*args):…
Func(1,2,3,4,5)
不知道该传递多少关键字参数时,使用**kwargs来收集关键字参数(keyword argument)
def func(**kwargs):…
Func(a=1,b=2,c=3)
全局变量和局部变量
常用方法
join()和split()
join(),把指定的字符串添加到字符串中,也可以把join后面带的一个含字符串的列表用指定的字符串连接起来
split(),把字符串用指定字符分割,结果是一个列表
strip(), lstrip(), rstrip()
移除字符串两边的空格
is家族 检查字符串…..
islower(), isupper(), istitle()…
isalnum(), isdigit(), isnumeric(), isdecimal()…
pass
比如函数没想好怎么写的时候可以用来在函数中占位,保证语法正确
continue直接跳到下一个循环,pass则是占位,虽然什么都不会发生,但是如果后面语句的话这些语句会继续运行
yield
1.保存当前运行状态(断点),然后暂停执行,即将函数挂起
2.将yeild关键字后面表达式的值作为返回值返回,此时可以理解为起到了return的作用,当使用next()、send()函数让函数从断点处继续执行,即唤醒函数。
match()和search()
match()检测RE是不是在字符串开始位置匹配,只有在0匹配成功才返回True,search()会扫描整个字符串查找有无匹配
模块和包
模块:python中包含并有组织的代码片段,xxx.py的xxx就是模块名
包:模块之上的有层次的目录结构,定义了由很多模块或很多子包组成的应用程序执行环境。包是一个包含__init__.py文件和若干模块文件的文件夹。
库:具有相关功能模块的集合,python有很多标准库、第三方库…
闭包
闭包使得局部变量在函数外被访问成为可能。
python运算符(7)
算术、关系、赋值、逻辑、位、成员、身份运算符
多进制数字
0b二进制(bin),0o八进制,0x十六进制
Python标准数据类型(5)
Numbers数字,Strings字符串,Lists列表,Tuples元组,Dictionary字典
他们的一些特点:
元组解封装
Namedtuple:(从collections模块中导入)能够用标签获取一个元组的元素。
集合:无序且元素不重复
PYTHONPATH变量是什么
Python中的环境变量,用于在导入模块的时候搜索路径。因此它必须包含Python源库目录以及含有Python源代码的目录。
生成器generator和迭代器iterator
生成器
生成器是一种特殊迭代器。生成一系列的值用于迭代,在for循环的过程中不断计算出下一个元素并在恰当的条件结束循环
使用了yield的函数,返回迭代器
迭代器
迭代器是访问集合元素的一种方式,他的对象从集合的第一个元素开始访问,直到所有元素被访问完结束,用iter()创建迭代器,调用next()函数获取对象(迭代只能往前不能后退)。
两者区别:
1. 创建/生成,生成器创建一个函数,用关键字yield生成/返回对象;迭代器用内置函数iter()和next()
2. 生成器中yield语句的数目可以自己在使用时定义,迭代器不能超过对象数目
3. 生成器yield暂停循环时,生成器会保存本地变量的状态;迭代器不会使用局部变量,更节省内存
生成器和函数:
生成器和函数的主要区别在于函数 return a value,生成器 yield a value同时标记或记忆 point of the yield 以便于在下次调用时从标记点恢复执行。 yield 使函数转换成生成器,而生成器反过来又返回迭代器。
参数传递机制
如果实际参数的数据类型是可变对象(列表、字典),则函数参数的传递方式将采用引用传递方式。如果是不可变的,比如字符串、数值、元组,他们就是按值传递。
Python对象基本要素(3),id,type和value
==比较value,即值,is比较id
__new__和__init__的区别?
__new__:创建对象时调用,会返回当前对象的一个实例
__init__:创建完对象后调用,对当前对象的一些实例初始化,无返回值
调用顺序:先调用__new__生成一个实例再调用__init__方法对实例进行初始化,比如添加属性
全局变量和局部变量
主(main)函数的作用
作为整个程序文件的入口。
调试代码的时候,在if __name__ == ‘__main__’中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
cookie和session的关系和区别
cookie保存在浏览器端,session保存在服务器端,但是为了区分不同的客户端,服务器会在浏览器中发送一个对应的sessionid保存到cookies中,下次浏览器请求服务器的时候会将sessionid一并发送给服务器。所以session机制依赖于cookie机制
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
什么是Python的命名空间?
在Python中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作——这就是命名空间。它就好像一个盒子,每一个变量名字都对应装着一个对象。当查询变量的时候,会从该盒子里面寻找相应的对象。
计算机网络
连不上网可能哪里有问题
网络模型
七层网络模型
1. 物理层:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。
2. 数据链路层
3. 网络层 IP
4. 传输层 TCP、UDP
5. 会话层
6. 表示层 对底层命令和数据进行解释,
7. 应用层 应用层协议:DNS、HTTP、SMTP等,用户在这一层与网络进行交互
TCP/IP四层
1. 网络接口层
2. 网际层 IP
3. 运输层 TCP、UDP
4. 应用层 HTTP、SMTP、FTP等
五层协议
1. 物理层 实现相邻计算机之间比特流的透明传递
2. 数据链路层 将IP数据报组装成帧,控制信息在相邻两节点的链路上进行传输
3. 网络层 IP,为不同主机分组交换信息服务
4. 应用层 HTTP、SMTP、FTP等
5. 运输层 TCP、UDP,为两台主机之间的通信提供通用的数据传输服务
HTTP
HTTP和HTTPS的区别
https需要到ca申请证书,因而需要一定费用
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议,成本较高
http的连接很简单,是无状态的,https协议是由ssl+http协议构建的可进行加密串苏,身份验证的网络协议
http用的端口是80,https用的端口是443
HTTP请求报文的内容
请求行包括请求方法(GET、POST…),URL,HTTP协议版本
请求头。格式为,头部字段:值。常见头部字段有…
请求正文
HTTP头部有哪些主要字段
Host:接受请求的服务器地址,可以是IP或者是域名
User-Agent:发送请求的应用名称
Connection:指定与连接相关的属性,例如(Keep_Alive,长连接)
Accept-Charset:通知服务器端可以发送的编码格式
Accept-Encoding:通知服务器端可以发送的数据压缩格式
Accept-Language:通知服务器端可以发送的语言
HTTP响应报文
状态行:协议版本,状态码,状态码描述
响应头
响应正文
HTTP响应头主要字段
Server:服务器应用软件的名称和版本
Content-Type:响应正文的类型
Content-Length:响应正文的长度
Content-Charset:响应正文所使用的编码
Content-Encoding:响应正文使用的数据压缩格式
Content-Language:响应正文使用的语言
HTTP状态码
1xx 服务器收到请求,需要请求者继续执行操作
2xx ok,请求成功
3xx 重定向,资源已经重新分配
4xx 客户端请求错误,403 forbidden请求资源被拒绝,404 not found找不到请求资源
5xx 服务器错误,500 服务器故障,503 服务器超载或停机维护
200,请求成功
301,资源(网页等)被永久转移到其它URL
302,资源临时移动
403,forbidden,服务器理解请求客户端的请求,但是拒绝执行此请求。请求资源被拒绝,通常原因是服务器上某些文件或目录设置了权限,客户端权限不够
404,not found,用户输入错误的链接,该链接指向的网页不存在。除此之外,也可以在服务器端拒绝请求且不想说明理由时使用。
500,internal server error 服务器内部错误(比如浏览器代理除了问题,ip,端口不对等)该状态码表明服务器端在执行请求时发生了错误。也有可能是Web应用存在的bug或某些临时的故障。
502,Bad Gateway,作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503,服务器超载或停机维护
504,Gateway Timeout网关超时 服务器作为网关或代理,未及时从上游服务器接收请求。
HTTP劫持
在正常的数据流中插入特定的网络数据报文,让客户端解释错误的数据,并以弹出新窗口的形式向使用者展示小广告或网页内容
步骤:
在TCP连接中标识HTTP协议链接;
改HTTP响应体;
将篡改后的数据包抢先回发到用户,这样后面的数据包在到达后会被直接丢弃。而客户端显示改后的网页
防范:
事前加密:HTTPS,防止明文传输被挟持,(但防不了DNS挟持)
事中加密:拆分HTTP请求数据包,运营商的旁路设备没有完整的TCP/IP协议栈,不能标记,web服务器有完整的TCP/IP协议栈,能把接收到的数据包拼成完整的HTTP请求,不影响服务
事后屏蔽:前端显示HTTP时对内容进行检测,在DOM结构发生变化时触发回调
DNS劫持:通过劫持DNS服务器,获得某域名的解析记录控制权,修改此域名的解析结果。把原来对A域名的访问转入B域名,返回错误的查询结果。可能是一些产品的持续的推广
区别:DNS劫持倾向于持续性,访问一个界面时强行推送广告,HTTP劫持频率多变,劫持过程也非常快,一般多出现于网站小尾巴
HTTPS挟持:伪造证书来进行挟持….
跨域
跨域,指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器施加的安全限制。
同源:域名,协议,端口均相同
即浏览器只能执行相同协议、相同域名、相同端口下的网站脚本,执行的时候如果网站的脚本不属于现在这个界面,就不会执行
HTTP请求响应中断原因
网断了,网络阻塞,请求超时,浏览器出问题,服务器出问题
如何检查
检查网络,检查本地…
HTTP有几种请求方式
HTTP1.0 定义了三种请求方法: GET, POST 和HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和CONNECT 方法。
GET和POST的区别
GET的参数放在url中,返回服务器拿数据;POST在request body里自带一个参数去服务器拿指定的数据
因为GET的参数暴露在url上,所以安全性不能保证,也有长度的限制
应用场景
GET用来查询数据,POST用来修改数据,以及其他更需要安全性的场景如密码
DNS的查找过程(应用层)
用于将用户提供的主机名解析为ip地址
0. 浏览器从接收到的url中抽取出域名地址,将域名传给DNS应用的客户端
1. 检查浏览器缓存、本地hosts文件是否有这个网址的映射,如果有,就调用这个IP地址映射
2. 如果没有,则查找本地DNS解析器缓存是否有这个网址的映射,如果有,返回映射
3. 如果没有,则向DNS服务器提出查询请求
4. 服务器接收到查询时,查询本地配置区域资源,查到就返回结果
5. 如果查不到,但服务器缓存了此网址映射关系,返回查找结果
6. 如果没有缓存,就继续间请求转发至上一级DNS服务器进行查询。最终将解析结果依次返回本地DNS服务器,本地DNS服务器在返回给客户端,并把这个映射存到服务器的缓存中
IP
IP地址分类
A类:1字节(8位)网络号,3字节(24位)主机号。网络号第一位固定为0,剩下7位随便用。保留地址0(00000000)表示“本文网络”,127(01111111)表示本地环回软件测试
B类:2字节(16位)网络号,2字节(16位)主机号。网络号前两位固定为10,剩下16位随便用。保留地址
C类:3字节(24位)网络号,1字节(8位)主机号。前三位固定为110,剩下21位可用。
D类:主机号全是0的IP地址表示是“本主机”所连接到的单个网络。
E类:主机号全是1的IP地址表示是该网络上的所有主机。
A类地址的表示范围是:0.0.0.0-126.255.255.255,默认网络掩码为:255.0.0.0,A类地址分配给规模特别大的网络使用,
B类地址表示范围是:128.0.0.0-191.255.255.255,默认网络掩码为:25
版权声明:本文标题:软件测试面试整理 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1725920719h892958.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论