2021.10.09 挂在二面 ,代码能力有待提高
一面:
1.对测试开发职位的理解
2.扣 实习经验
3.手撕算法:
**找出一个字符串中第一个只出现一次的字符的位置**
class Soltion :
def maxLengthMax(self,str):
for i in str:
if str.count(i) == 1:
print(i)
break
else:
print(-1)
Soltion().maxLengthMax('google')
**实现无重复字符串的最长子串**
def lengthLong(s):
if len(s) ==0:
return 0
start = 0
end = 0
ans = end -start +1
while True:
end +=1
print('end= ',end)
if s[end] in s[start:end]:
print('s[end]=',s[end])
k = s[start:end].find(s[end])
start += k+1
else:
pass
ans = max(end -start +1,ans)
print(ans)
if end == len(s)-1:
break
print(s[:ans])
lengthLong('adbcdcdf')
数据库:
二面
1.实习相关项目
2.算法:找出数组中最大数和次大数
(没手写,但要你说出思路)
一个for循环,依次赋值比较
3.python装饰器:
python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)
,应用场景:插入日志、性能测试、事务处理、权限校验
2.1 函数装饰器
import time
def decorator(func):
def wrapper(*args, **kwargs):
start_time = time.time()
func()
end_time = time.time()
print(end_time - start_time)
return wrapper
@decorator
def func():
time.sleep(0.8)
func() # 函数调用# 输出:0.800644397735595
在上面代码中 func是我要装饰器的函数,我想用装饰器显示func函数运行的时间。@decorator这个语法相当于 执行 func =
decorator(func),为func函数装饰并返回。在来看一下我们的装饰器函数 - decorator,该函数的传入参数是func
(被装饰函数),返回参数是内层函数。这里的内层函数-wrapper,其实就相当于闭包函数,它起到装饰给定函数的作用,wrapper参数为*args,**kwargs。*args表示的参数以列表的形式传入;**kwargs表示的参数以字典的形式传入:
从图中我们可以看到:凡是以key=value形式的参数均存在kwargs中,剩下的所有参数都以列表的形式存于args中。这里要注意的是:为了不破坏原函数的逻辑,我们要保证内层函数wrapper和被装饰函数func的传入参数和返回值类型必须保持一致。
2.2 类方法的函数装饰器
import time
def decorator(func):
def wrapper(me_instance):
start_time = time.time()
func(me_instance)
end_time = time.time()
print(end_time - start_time)
return wrapper
class Method(object):
@decorator
def func(self):
time.sleep(0.8)
p1 = Method()p1.func() # 函数调用
对于类方法来说,都会有一个默认的参数self,它实际表示的是类的一个实例,所以在装饰器的内部函数wrapper也要传入一个参数 -
me_instance就表示将类的实例p1传给wrapper,其他的用法都和函数装饰器相同。
2.3 类装饰器
class Decorator(object):
def __init__(self, f):
self.f = f
def __call__(self):
print("decorator start")
self.f()
print("decorator end")
@Decorator
def func():
print("func")
func()
这里有注意的是:call()是一个特殊方法,它可将一个类实例变成一个可调用对象:
p = Decorator(func) # p是类Decorator的一个实例 p() # 实现了__call__()方法后,p可以被调用
要使用类装饰器必须实现类中的__call__()方法,就相当于将实例变成了一个方法。