一、_ init _ _ 和 _ _ new _ _是什么?
1.1、概述
在python的面向对象中,利用new方法创建对象,然后把这个创建的对象传递到init函数中,以第一个参数进
1.2、详细描述__new__
所有的类上都有一个new方法
调用时机: 新建对象的时候自动调用(init之前),同时会自动传入类cls参数
作用: 改变对象空间的创建过程
class Person(object):
def __new__(cls):
print("__new__方法被调用")
# 必须返回创建的对象
# print(cls)
#return object.__new__(cls) #父类上的__new__方法能够实现内存空间的开辟
return super().__new__(cls) #父类上的__new__方法能够实现内存空间的开辟
def __init__(self):
print("__init__方法被调用")
# 创建对象
zhangsan = Person()
__init___
定义在类中, 名字固定 init。
执行时机: 实例化对象的时候自动调用执行
作用: 一般会在初始化方法中 为对象添加(绑定)属性
class Student(object):
# 属性
# 方法
## 自己定义一个初始化方法
def __init__(self,_name,_age):
# 输出
print("我自动被调用")
# 添加属性
# self.name = "张三"
# self.age = 26
self.name = _name
self.age = _age
def learn(self):
print("努力学习,天天向上")
# 实例化对象
stu1 = Student(_age=28,_name="李四")
1.3、应用场景所谓单例就是一个类从始至终只能产生一个实例。
class Singleton(object):
__instance = None #私有类属性,保存创建的对象空间
__isInit = False # 是否已经初始化
def __new__(cls, *args, **kwargs):
# 实现自己对象的创建过程
if not cls.__instance:
# 没有就创建
cls.__instance = super().__new__(cls)
# 返回
return cls.__instance
else:
# 有直接返回
return cls.__instance
def __init__(self,name,age):
if not self.__isInit: #没有初始化
# 初始化
self.name = name
self.age = age
# 改变
self.__isInit = True
else:
#
pass
二、什么是pass,什么是lambda函数
2.1、概述
lambda 创建匿名函数的语法。
pass 空语句。
2.2、详细描述
1、pass的作用
不做任何事情,一般用做占位语句,为了保证程序的完整性。2、lambda
lambda只是一个表达式,函数体比def简单很多。
lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
# 可写函数说明
sum = lambda arg1, arg2: arg1 + arg2;
# 调用sum函数
print "相加后的值为 : ", sum( 10, 20 )
print "相加后的值为 : ", sum( 20, 20 )
2.3、应用场景lambda创建的匿名函数一般在 排序,map,reduce,filter这些高阶函数里,可以一行写完,不过这个也要看情况,过多使用匿名函 数,在团队代码阅读上,可能会有麻烦。
>>>def square(x) : # 计算平方数
... return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函数
[1, 4, 9, 16, 25]
# 提供了两个列表,对相同位置的列表数据进行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
# 过滤出列表中的所有奇数:
newlist = filter(lambda x:x % 2 == 1, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)
三、is和==有什么区别?
3.1、概述
is 比较 的是两个实例对象是不是同一个对象,也就是说这两个对象的地址,通过id()函数可以获取,是不是相同。
== 比较的是两个实例对象的值是否相等,比较的是内存中存放的内容,可以不是同一个对象,只要内容一样就可以了。3.2、详细描述
x = [1, 2, 3]
y = x
z = [1, 2, 3]
print(x == y)
print(x is y)
print(x == z)
print(x is z)
结果:
True
True
True
False
3.3、应用场景
is常用的地方是: 和None值进行比较 a is None 或者 a is not None
None 在 Python 语言中是一个单例对象,如果你要判断某个变量是否为 None 时,记得使用 is而不是 ==,因为只有 is才能在严格意义上表示某个变量是否是 None。
四、*args和**kwargs的区别?
1.1、概述:
分别代表元组和字典的两种形式,他们可以作为形式参数存在也可以作为实际参数存在。作为形式参数存在被称为打包,作为实际参数存在被称为拆包
1.2、详细描述:
作为形式参数(打包):将位置的实际参数打包到元组中, 将关键字的实际参数打包到字典中。
def 函数名字(*args): #打包位置实际参数放在元组中
pass
函数名字(实际参数1,实际参数2)
def 函数名字(**kwargs): # 打包关键字实际参数放在字典中
pass
函数名字(关键字1=实际参数1,关键字2=实际参数2)
作为实际参数(拆包): 将元组或者字典展开作为实际参数传给形式参数:
def 函数名字(形式参数1,形式参数2):
pass
元组 = (数据1,数据2)
函数名字(*元组) #将元组中的元素一一对应传递给形式参数
def 函数名字(name,age):
pass
字典 = {name:数据1,age:数据2}
函数名字(**字典) #将字典中的元素按照键一一对应传递给形式参数
1.3、应用场景:
在实现装饰器时,为了可以对任意的函数都能进行装饰,内置的闭包函数就会用*args,**kwargs来处理。
定义未知个数的形式参数。
五、Python中filter()、map()和reduce()的区别
2.1、概述:
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
map() 会根据提供的函数对指定序列做映射
reduce() 函数会对参数序列中元素进行累积。
2.2、详细描述:
filter()函数
1.语法:
filter(function, iterable)
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回
True 或 False,最后将返回 True 的元素放到新列表中。
2.案例: 得到列表中的奇数
def is_odd(n):
return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
for n in newlist:
print(n)
map函数:
1.语法:
map(function, iterable, ...)
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。
2. 案例: 提供了两个列表,对相同位置的列表数据进行相加
result = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print(result)# [3, 7, 11, 15, 19]
将后面两个列表中的分别一一对应取出之后传递给x,y.
reduce()函数:
1.语法:
reduce(function, iterable[, initializer])
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参
数)先对集合中的第 1、2 个元素 进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
python3中将 reduce 放在functools模块中了
2. 案例: 提供了两个列表,对相同位置的列表数据进行相加
from functools import reduce
result = reduce(lambda x, y: x+y, [1,2,3,4,5])
print(result)#15
2.3、应用场景:
面试题: 分别使用map,reduce,filter函数完成下面的任务
1、计算1-100的和
from functools import reduce
result = reduce(lambda x, y: x + y, range(1, 101))
print(result)
2、1-10,对每个数字的平方
result = map(lambda x:x**2,range(1,11))for n in result:print(n)
六、 {“a”,”ab”,”abc”,”bc”,”cd”}输出含有C字符的元素,返回值是list
result = filter(lambda x: "c" in x, {"a", "ab", "abc", "bc", "cd"})for n in result:print(n)
3、Python的可变类型和不可变类型包含哪些?
3.1、概述:
可变类型 包含: 列表(List)、字典(Dict)、集合(Set)。
不可变类型 包含: 字符串(String)、整数(int)、小数(Float) 布尔(Bool)、元组(Tuple)
3.2、详细描述:
3.2.1可变数据类型的特点
里面的值发生改变时不会新生成一个变量.内存地址不变. 因为改变的数据会发生在内存中.
3.2.2不可变数据类型的特点
只要值发生了改变.就会重新开辟一个内存空间. 内存地址也发生了改变, 如果元组中的元素是可变数据类型,该元素中的值是可以改变的。
values = ("张飞", ["刘备"])
values[1][0] = "刘玄德"
print(values) #('张飞', ['刘玄德'])
七、super 是干嘛用的?在 Python2 和 Python3 使用,有什么区别?为什么要使用 super?请举例说明。
答:
super 用于继承父类的方法、属性。super 是新式类中才有的,所以 Python2 中使用时,要在类名的参数中写 Object。Python3 默认是新式类,不用写,直接可用。使用 super 可以提高代码的复用性、可维护性。修改代码时,只需修改一处。代码举例:
八、阅读以下代码,推导最后结果:
答:所有的结果都是生成器表达式,不调用它,不从里面取值,就不干活。附上我的推导过程:
九、快速编写前端 HTML、JavaScript、Vue 代码。
答:HTML、JavaScript 代码
Vue 代码编写:
十、L = [1, 2, 3, 11, 2, 5, 3, 2, 5, 3],用一行代码得出 [11, 1, 2, 3, 5]
答:list(set(L))、
十一、L = [1, 2, 3, 4, 5],L[10:]的结果是?
答:空列表(当时有点紧张,一直在“空列表”和“索引超出范围”两个答案之间徘徊)。
十二、L = [1, 2, 3, 5, 6],如何得出 '12356'?
答:注意,个人觉得这个题有坑,列表的元素不是字符串,所以不能 ''.join(L) 。
以下是过程:
十三、列表和字典有什么区别?
答:一般都是问列表和元组有什么不同。 (1)获取元素的方式不同。列表通过索引值获取,字典通过键获取。 (2)数据结构和算法不同。字典是 hash 算法,搜索的速度特别快。 (3)占用的内存不同。
十四、如何结束一个进程?
答:(1)调用 terminate 方法。 (2)使用 subProcess 模块的 Popen 方法。使用简单,具体用法,这里不展开。
十五、进程、线程有什么区别?什么情况下用进程?什么情况下用线程?
答:(1)区别:
① 地址空间和其它资源(如打开文件):进程之间相互独立,同一进程的各线程之间共享。某进程内的线程在其它进程不可见。② 通信:进程间通信 IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。③ 调度和切换:线程上下文切换比进程上下文切换要快得多。④ 在多线程操作系统中,进程不是一个可执行的实体。(2)使用场景:同时操作一个对象的时候,比如操作的是一个全局变量,我用线程,因为全局变量是所有线程共享的。
十六、什么是ORM?为什么要用ORM?不用ORM会带来什么影响?
答:
ORM 框架可以将类和数据表进行对应,只需要通过类和对象就可以对数据表进行操作。通过类和对象操作对应的数据表,类的静态属性名和数据表的字段名一一对应,不需要写 SQL 语句。ORM 另外一个作用,是根据设计的类生成数据库中的表。11、写一段代码,ping 一个 ip 地址,并返回成功、失败的信息。
答:使用 subProcess 模块的 Popen 方法(使用简单,具体用法,这里不展开)。
十七、说说接口测试的流程,介绍一下request有哪些内容。
答:(1)流程:获取接口文档,依据文档设计接口参数,获取响应,解析响应,校验结果,判断测试是否通过。 (2)request 内容:
18、UI 自动化,如何做集群?
答:Selenium Grid。
19、移动端 UI 自动化,经常会自动安装 2 个程序,你知道那两个程序是什么东西不?
答:守护精灵,和 Python 并发编程中的 daemon 原理一样,父进程/父线程的代码执行完毕,它就终止,要写在 start 方法前面。另外,要找到配置文件,注释掉两行代码。
20、说5个以上 Linux 命令。
答:一口气,劈里啪啦说了 10 多个。
21、介绍一下你在这个项目中是如何使用 Jenkins 的。
答:用的不深入,说了基本操作,比如定时构建执行代码。
22、说说你对敏捷模式的认识。
答:小步快跑,拥抱变化。测试中,可以通过行为驱动测试,有个框架 lettuce 可以用。
23、了解过 Docker 不?
答:了解,没用过。然后说了下对 Docker 大概的认识、优势。
24、说一下你对软件测试的深刻心得。
答:此处省略 n 个字。
25、做过性能测试没?没做过,说出功能测试的流程。
答:此处省略 n 个字。
26、Bug 定位、分析、类型。
答:此处省略 n 个字。
27、测试策略、测试方案的区别。
答:此处省略 n 个字。
面试总结
在自动化测试、测试开发岗面试中,编程知识、Linux 都是必问的。测试开发人员的知识面既要有一定的广度,同时还要有扎实的编码基础。
路漫漫其修远兮,我还有很长的路要走。接下来的规划,进一步提升自己的实力。整理不易还请动动发财手点个赞哦~~
原文来源于百家号:源码时代以及百度