字节上岸成功,整理一波测试开发岗的基础知识,含答案

2月末开始投简历,3月份开始面了tplink、字节、美团、广立微电子这四家公司,然后这边最近秋招结束,所以来发下自己整理的一些知识点来 分享,或许今年有人能用上?

春招投的岗位都是测开/测试,测试涉及的东西太多啦反正你最好啥都懂呗,面试常见题以及我被问到过的题都加进去了,Python和操作系统部分比较详细,还有计算机网络也比较重点,然后添了些小姐妹理出来的测试基础和Linux常用操作!数据库、数据结构、C、算法就一点点没来得及理了先上岸了2333。
 

 内容的话大部分都是自己在网上东抄抄西抄抄,觉得面试时遇见的机遇大的面试都整理出来了,总共有上千道题,内容有20w左右的字数,反正如果要去面试题,拿着我这本通关秘籍应该是没什么问题的,由于头条篇幅,没有把所有的题目都放上来,完整的可以找我获取,关注公众号:程序员万金油免费领取

 

最后在这里祝大家都能拿到自己满意的offer呀!!

要是有什么错误我先对不起(跪),一定要联系我改掉啊不能误导人!!

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会在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值