1、python的数据类型有哪些
答:Python基本数据类型一般分为:数字、字符串、列表、元组、字典、集合这六种基本数据类型。
浮点型、复数类型、布尔型(布尔型就是只有两个值的整型)、这几种数字类型。列表、元组、字符串都是序列。
2、列表和元组的区别
答:列表是动态的,长度可变,可以随意地增删改元素。列表的存储空间略大于元组,性能略逊于元组。
元组是静态的,长度大小固定,不可以对元组元素进行增删改操作。元组对于列表更加轻量级,性能稍优。
3、字典的原理
答:python中的字典底层依靠哈希表(hash table)实现, 使用开放寻址法解决冲突,
哈希表是key-value类型的数据结构, 可以理解为一个键值需要按照一定规则存放的数组, 而哈希函数就是这个规则
字典本质上是一个散列表(总有空白元素的数组, python至少保证1/3的数组是空的), 字典中的每个键都占用一个单元,
一个单元分为两部分, 分别是对键的引用和对值的引用, 使用hash函数获得键的散列值, 散列值对数组长度取余, 取得的值就是存放位置的索引
哈希冲突(数组的索引相同), 使用开放寻址法解决
这也是python中要求字典的key必须可hash的原因
数组中1/3的位置为空, 增加元素可能会导致扩容, 引发新的散列冲突, 导致新的散列表中键的次序发生变化, 这也是字典遍历时不能添加和删除的原因
字典在内存中开销很大, 实际上是以空间换时间
4、说一下hash算法与哈希冲突
答:哈希算法:根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上的算法。也称为散列算法、杂凑算法。
哈希表:数据经过哈希算法之后得到的集合。这样关键字和数据在集合中的位置存在一定的关系,可以根据这种关系快速查询。
非哈希表:与哈希表相对应,集合中的 数据和其存放位置没任何关联关系的集合。
由此可见,哈希算法是一种特殊的算法,能将任意数据散列后映射到有限的空间上,通常计算机软件中用作快速查找或加密使用。
哈希冲突:由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,因此总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。
5、怎么解决哈希冲突
答:解决哈希冲突的方法一般有:开放定址法、链地址法(拉链法)、再哈希法、建立公共溢出区等方法。
6、说下python的内存管理和垃圾回收机制
答:python的内存管理机制有三种:引用计数、垃圾回收、内存池。
引用计数:引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用时其引用计数增加1,当其不再被引用时引用计数减1,当引用计数等于0的时候,对象就被删除了
垃圾回收:引用计数、标记清除、分代回收
内存池:Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。
Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。
另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。
也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。
7、内存过大时你有什么调优手段
答:1.手动垃圾回收 2.避免循环引用(手动解循环引用和使用弱引用)3.调高垃圾回收阈值
8、请简述下python的拷贝
答:1.赋值: 只是复制了新对象的引用,不会开辟新的内存空间。
2.浅拷贝: 创建新对象,其内容是原对象的引用。
浅拷贝有三种形式:切片操作,工厂函数,copy模块中的copy函数。
如: lst = [1,2,3,[4,5]]
切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst] 要注意:list1=lst 和list1=lst[:]的区别
工厂函数:lst1 = list(lst)
copy函数:lst1 = copy.copy(lst)
浅拷贝之所以称为浅拷贝,是它仅仅只拷贝了一层,在lst中有一个嵌套的list[4,5],如果我们修改了它,情况就不一样了。
3.深拷贝:只有一种形式,copy模块中的deepcopy函数。
和浅拷贝对应,深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。
深拷贝出来的对象是一个全新的对象,不再与原来的对象有任何关联。
#说明如下:
#1.外层添加元素时, 浅拷贝c不会随原列表a变化而变化;内层list添加元素时,浅拷贝c才会变化。
#2.无论原列表a如何变化,深拷贝d都保持不变。
#3.赋值对象随着原列表一起变化
9、请讲一下协程的原理
答:我自己暂时也不清楚,还没有自己的理解,资料如下:
运用协程机制最典型的场景就是异步IO。所谓异步,是指一段程序在执行完成前有能力“暂停”,让其他程序段执行。
从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数,所以总体上在协程中把yield看做是控制流程的方式。
协程是一个特殊的生成器,yield有返回值>生成器,yield没有>协程(没返回值就是协程)
10、数据库的事务是什么
答:数据库事务是指一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性
11、sql的多表联查方式
答:内连接:JOIN / INNER JOIN、不等连接:ON 子句中使用了不等于运算符、自连接:一张表连接自身、左(外)连接:LEFT JOIN / LEFT OUTER JOIN、
右(外)连接:RIGHT JOIN / RIGHT OUTER JOIN、全(外)连接:FULL JOIN / FULL OUTER JOIN、交叉连接:CROSS JOIN (可用","代替)、
UNION 、UNION ALL操作符用于合并两个或多个 SELECT 语句的结果集。
12、数据库的存储过程
答:一组为了完成特定功能的SQL语句集(或者自定义数据库操作命令集), 根据传入的参数(也可以没有),
通过简单的调用, 完成比单个SQL语句更复杂的功能, 存储在数据库服务器端,只需要编译过一次之后再次使用都不需要再进行编译:主要对存储的过程进行控制
13、数据库的存储过程与事务的异同
答:事务是保证多个SQL语句的原子型的,也就是要么一起完成,要么一起不完成
存储过程是把一批SQL语句预编译后放在服务器上,然后可以远程调用
14、cookie与session的区别是什么
答:(1)Cookie以文本文件格式存储在浏览器中,而session存储在服务端,因为每次发起 Http 请求,都要携带有效Cookie信息,所以Cookie一般都有大小限制,以防止增加网络压力,一般不超过4k
(2)cookie的存储限制了数据量,只允许4KB,而session是无限量的
(3)我们可以轻松访问cookie值但是我们无法轻松访问会话值,因此它更安全
(4)设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。
15、项目中能不能只使用SESSION,不使用COOKIE
答:可以,通过重定向的形式,把session id放在url后面,但是这样做直接将把session id暴露出来了,于安全考虑不建议使用这样的方式
16、http和https的区别
答:1、https协议需要到CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(原来网易官网是http,而网易邮箱是https。)
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
17、https是非对称加密还是对称加密
答:Https的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
握手前使用非对称加密,连接后使用对称加密,因为仅使用非对称加密的话,会影响数据的传输效率
18、启动shell脚本的方式
答:1、工作目录执行,指的是执行脚本时,先进入到脚本所在的目录(此时,称为工作目录),然后使用 ./脚本方式执行
2、绝对路径中执行,指的是直接从根目录/到脚本目录的绝对路径
3、sh执行,指的是用脚本对应的sh或bash来接着脚本执行
4、shell环境执行,指的是在当前的shell环境中执行,可以使用 . 接脚本 或 source 接脚本
19、SQL与ORM的优缺点
答:相对来说,ORM的缺点就是SQL的优势地方,而优点也是SQL的劣势地方。
优点
方便的使用面向对象,语句清晰
防注入『这个其实不算ORM的核心,因为比如Phalcon的SQL形式写法也可以防注入』
方便动态构造语句,对于不同的表的相同操作采用多态实现更优雅
一定程度方便重构数据层『比如改表名,字段名等』
设置钩子函数
缺点
不太容易处理复杂查询语句
性能较直接用SQL差
20、请讲一下生产者消费者模型
答:生产者消费者模型设计要合理,如果生产者慢了,可以增加生产者,消费者慢了,增加消费者;
实际应用中,生产者,消费者可能是两套不同的系统,不会存在于一个进程里,甚至不在同一台设备上;而queue.Queue只能用于线程间通讯,那么该怎么办呢?
采用消息队列,比如rabbitMQ;
最后,上传一篇将进程线程做了很好的类比的一篇文章
计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。
进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
一个车间里,可以有很多工人。他们协同完成一个任务。
线程就好比车间里的工人。一个进程可以包括多个线程。
车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫“互斥锁”(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。
还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做“信号量”(Semaphore),用来保证多个线程不会互相冲突。
不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。
操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
21、HTTP状态码有哪些?
答:HTTP状态码总的分为五类:1开头:信息状态码、2开头:成功状态码、3开头:重定向状态码、4开头:客户端错误状态码、5开头:服务端错误状态码
在这里插入图片描述
22、如何保障测试的充分度?
答:从代码覆盖率和业务覆盖率来定义充分度模型,代码覆盖率比较直观,业务覆盖率可以基于流量场景挖掘技术及fuzz技术来补充度量
23、自动化测试用例如何设计?
答:自动化用例的设计依据场景诉求构造合理输入及输出断言,测试用例需要满足健壮性,有效性,可扩展,时效性要求
24、如何对测试用例进行优化与提炼,精简不必要测试用例?
答:等价划分,可从代码路径,业务要素,领域模型三个方面做最大覆盖最小流量用例精简,也可以考虑在变更基础上的精准测试
25、自动化测试框架设计中的分层如何实现,有哪几类分层?
答:自动化框架设计包含数据流,执行流,数据流解决测试数据存储及使用方式,执行流定义标准测试流程,一个标准的测试框架流程应该是数据清理,数据准备(入参,db,外部依赖),结果验证
26、如何准备完整的测试数据?
答:这个问题没啥可答的,要让一个用例能够符合预期就需要构造合理的输入,数据准备,需要依赖对于系统设计及业务的了解,没啥方法,但是可以借助实时流量提供准备数据效率
27、自动化测试执行前后,分别需要进行何种操作,以确保自动化不会影响系统运行?
答:用例运行可独立部署集群或者线下集群,一般很少在生产环境运行
28、如何基于Mock实现数据结果的返回,实现外部接口的测试?
答:mockito这些工具类可以看一下,也可以写拦截器构造返回对象
29、如何评判系统是否具备可测性?
答:这个问题比较广泛,我需要点时间整理出来
30、自动化测试执行中,如何对多个用例进行并发运行?
答:并发运行testng具备,其余的可看一下jenkins的多job或者自己写并发调度
31、在较大自动化用例运行压力下,如何实现自动化测试框架的分布式集群?
答:要做到这个点用例需要具备隔离性,其余的均衡调度就可以了
作者:Detail-L
原文链接:https://wenliang.blog.csdn.net/article/details/106116675