• 0
  • 0
分享

1、列表和元组的区别

答:列表是动态的,长度可变,可以随意地增删改元素。列表的存储空间略大于元组,性能略逊于元组。元组是静态的,长度大小固定,不可以对元组元素进行增删改操作。元组对于列表更加轻量级,性能稍优。 测试面试宝典

2、字典的原理

答:python中的字典底层依靠哈希表(hash table)实现, 使用开放寻址法解决冲突。

哈希表是key-value类型的数据结构, 可以理解为一个键值需要按照一定规则存放的数组, 而哈希函数就是这个规则。

字典本质上是一个散列表(总有空白元素的数组, python至少保证1/3的数组是空的), 字典中的每个键都占用一个单元。

一个单元分为两部分, 分别是对键的引用和对值的引用, 使用hash函数获得键的散列值, 散列值对数组长度取余, 取得的值就是存放位置的索引。

哈希冲突(数组的索引相同), 使用开放寻址法解决。

这也是python中要求字典的key必须可hash的原因。

数组中1/3的位置为空, 增加元素可能会导致扩容, 引发新的散列冲突, 导致新的散列表中键的次序发生变化, 这也是字典遍历时不能添加和删除的原因。

字典在内存中开销很大, 实际上是以空间换时间。

3、说一下hash算法与哈希冲突

答:哈希算法:根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上的算法。也称为散列算法、杂凑算法。

哈希表:数据经过哈希算法之后得到的集合。这样关键字和数据在集合中的位置存在一定的关系,可以根据这种关系快速查询。

非哈希表:与哈希表相对应,集合中的 数据和其存放位置没任何关联关系的集合。

由此可见,哈希算法是一种特殊的算法,能将任意数据散列后映射到有限的空间上,通常计算机软件中用作快速查找或加密使用。

哈希冲突:由于哈希算法被计算的数据是无限的,而计算后的结果范围有限,因此总会存在不同的数据经过计算后得到的值相同,这就是哈希冲突。

4、怎么解决哈希冲突

答:解决哈希冲突的方法一般有:开放定址法、链地址法(拉链法)、再哈希法、建立公共溢出区等方法。

5、说下python的内存管理和垃圾回收机制

答:python的内存管理机制有三种:引用计数、垃圾回收、内存池。

引用计数:引用计数是一种非常高效的内存管理手段,当一个pyhton对象被引用时其引用计数增加1,当其不再被引用时引用计数减1,当引用计数等于0的时候,对象就被删除了。

垃圾回收:引用计数、标记清除、分代回收。

内存池:Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。

另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。

也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

6、内存过大时你有什么调优手段

答:

  1. 手动垃圾回收;

  2. 避免循环引用(手动解循环引用和使用弱引用);

  3. 调高垃圾回收阈值。

7、请简述下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.赋值对象随着原列表一起变化

8、请讲一下协程的原理

答:运用协程机制最典型的场景就是异步IO。所谓异步,是指一段程序在执行完成前有能力“暂停”,让其他程序段执行。

从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数,所以总体上在协程中把yield看做是控制流程的方式。

协程是一个特殊的生成器,yield有返回值>生成器,yield没有>协程(没返回值就是协程)。

9、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 语句的结果集。

10、数据库的存储过程

答:一组为了完成特定功能的SQL语句集(或者自定义数据库操作命令集), 根据传入的参数(也可以没有),

通过简单的调用, 完成比单个SQL语句更复杂的功能, 存储在数据库服务器端,只需要编译过一次之后再次使用都不需要再进行编译:主要对存储的过程进行控制。

11、数据库的存储过程与事务的异同

答:事务是保证多个SQL语句的原子型的,也就是要么一起完成,要么一起不完成存储过程是把一批SQL语句预编译后放在服务器上,然后可以远程调用。


作者:程序员白楠楠

原文链接:https://blog.csdn.net/weixin_47340771/article/details/119387831

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   作为软件测试的守护神,软件测试岗位越来越受到IT企业的重视,也有更多人想要从事软件测试工程师职业。那么软件测试工程师的要求是什么?软件测试能干到多少岁呢?我们今天就来为大家介绍一下。  软件测试工程师其实是没有任何要求的,它不像开发行业对学历要求那么高,对逻辑思维要求那么强。什么性别、什么学历都可以担任,只要你能够学会并掌握基本的测试方法。如果硬要说有什么要求的话,那就是要细心、耐心。因为软件测试的工作重复性较强,一定要能够耐得住一遍又一遍地重复进行测试工作,而且要注重细节,不忽略每一处bug,尽自己所能提升软件质量。另外与人沟通的能力也很重要,因为在发现bug之后往往要跟软件开发进行沟通...
            0 0 791
            分享
          •    参与《2022软件测试行业现状调查报告》读后感征文活动,领测试微课好礼。    51Testing软件测试网发布的“软件测试现状调查报告”清晰的展示了我国软件测试行业现状。报告涵盖行业领域、人员信息、工作内容、技术工具等方面,全面、直观的展示了当前的行业现状和发展趋势,是软件从业人员不可或缺的学习资料。通过阅读报告,初步有三点感悟在这里于大家分享、讨论。一、关于就业方向:选对了客户,就找对了方向    软件测试是一个服务行业,服务行业最重要的是什么?客户,客户,还是客户!选择了对的客户,就选择了正确从业的方向,因为客户决定了测试...
            1 1 3213
            分享
          • 在面试时,经过寒暄后,一般面试官会让介绍项目经验。常见的问法是,说下你最近的(或最拿得出手的)一个项目。根据我们的面试经验,发现有不少候选人对此没准备,说起来磕磕巴巴,甚至有人说出项目经验从时间段或技术等方面和简历上的不匹配,这样就会造成如下的后果。第一印象就不好了,至少会感觉该候选人表述能力不强。一般来说,面试官会根据候选人介绍的项目背景来提问题,假设面试时会问10个问题,那么至少有5个问题会根据候选人所介绍的项目背景来问,候选人如果没说好,那么就没法很好地引导后继问题了,就相当于把提问权完全交给面试官了。面试时7份靠能力,3份靠技能,而刚开始时的介绍项目又是技能中的重中之重,所以本文将从“...
            0 0 1691
            分享
          • Charles常用的功能总结过滤网络请求;截取 iPhone 上的网络封包;截取 Https 通讯信息;模拟慢速网络;修改网络请求内容;给服务器做压力测试;修改服务器返回内容;Map 重定向功能;Rewrite 功能;Breakpoints 功能;设置ssl允许访问地址;查看连接本机charle代理的ip;设置请求的黑名单;缓存请求返回的内容。对于某一个具体的网络请求,你可以查看其详细的请求内容和响应内容。如果请求内容是 POST 的表单,Charles 会自动帮你将表单进行分项显示。如果响应内容是 JSON 格式的,那么 Charles 可以自动帮你将 JSON 内容格式化,方便你查看。如果...
            14 15 2941
            分享
          • 一、为什么抓包1、从功能测试角度通过抓包查看隐藏字段Web 表单中会有很多隐藏的字段,这些隐藏字段一般都有一些特殊的用途,比如收集用户的数据,预防 CRSF 攻击,防网络爬虫,以及一些其他用途。这些隐藏字段在界面上都看不到,如果想检测这些字段,就必须要使用抓包工具。2、通过抓包工具了解协议内容方便开展接口和性能测试性能测试方面,性能测试其实就是大量模拟用户的请求,所以我们必须要知道请求中的协议内容和特点,才能更好的模拟用户请求,分析协议就需要用到抓包工具;接口测试方面,在接口测试时,虽然我们尽量要求有完善的接口文档。但很多时候接口文档不可能覆盖所有的情况,或者因为文档滞后,在接口测试过程中,还...
            1 1 2719
            分享
      • 51testing软件测试圈微信