Python面试笔试题.docx
- 文档编号:5126943
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:17
- 大小:272.54KB
Python面试笔试题.docx
《Python面试笔试题.docx》由会员分享,可在线阅读,更多相关《Python面试笔试题.docx(17页珍藏版)》请在冰豆网上搜索。
Python面试笔试题
第一题
以下两段代码,运行结束后的结果是什么?
是否相同?
原因是什么?
代码一
代码二
第二题
4G内存怎么读取一个5G的数据?
第三题
浅述深浅拷贝
答案
第一题
结果不相同
第一段结果为:
[{'num':
0},{'num':
1},{'num':
2},{'num':
3},{'num':
4},{'num':
5},{'num':
6},{'num':
7},{'num':
8},{'num':
9}]
第二段结果为:
[{'num':
9},{'num':
9},{'num':
9},{'num':
9},{'num':
9},{'num':
9},{'num':
9},{'num':
9},{'num':
9},{'num':
9}]
字典是可变类型,这里l.append(a)相当于执行了浅拷贝,每改变一次a中num的值,所有a的值都将改变
第二题
实现方法有两种。
实现方法一:
方法一的实现思路是通过生成器,一次读取少量数据,标准答案是根据文件实现,这里给出的例子是咸鱼学习bobby老师的课程时记录的例子,不知道如何使用生成器完成这个需求的朋友可以参考:
实现方法二:
在linux系统下使用split可以分割文件,对于多行文件可以使用按行分割的方式,对于单行的大文件可以采用按文件大小分割。
按文件行数分割:
split-l300large_file.logsmallfile_prefix
按文件大小分割:
split-b10mlarge_file.logsmallfile_prefix
之后再按文件读取即可。
第一题
下图中的打印结果分别是什么?
第二题
Python中静态方法、类方法、成员函数作用是什么?
第三题
说说对缺省参数的理解?
*args是什么?
**kwargs是什么?
答案
第一题
前三个是True,最后一个会报错。
具前三个为什么输出True,不了解的可以参考下图:
图来源于bobby老师的异步IO编程课件
最后一个为什么报错,我们可以先看下issubclass的用法:
issubclass方法用于判断参数 class 是否是类型参数 classinfo 的子类
issubclass(class, classinfo)
参数
class -- 类。
classinfo -- 类。
返回值
如果 class 是 classinfo 的子类返回 True,否则返回 False。
而在题目中b并不是一个类,所以报错。
第二题
我们先理清楚静态函数、类函数分别是什么?
静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作。
使用装饰器@staticmethod定义静态方法。
类对象和实例都可以调用静态方法。
类方法是将类本身作为对象进行操作的方法。
类方法使用@classmethod装饰器定义,其第一个参数是类,约定写为cls。
第三题
缺省参数是指在调用函数的时候没有传入参数的情况下,调用默认的参数,在调用函数的同时赋值时,所传入的参数会替代默认参数。
*args是不定长参数,可以表示输入参数是不确定的,可以任意多个
**kwargs是关键词参数,赋值的时候是以键=值的方式,参数是可以任意多对。
以上两个的使用是在定义函数的时候不确定会传入多少参数时使用。
什么是鸭子类型?
当看到一只鸟,走起来像鸭子、游泳起来像鸭子、叫起来像鸭子那么这只鸟就可以被称之为鸭子
∙关注点在对象的行为,而不是类型(ducktyping)
∙比如file,StringIO,socket对象都支持read/write方法(filelikeobject)
∙比如定义了 _iter_ 魔术方法的对象可以使用for
鸭子类型更关注接口而非类型。
什么是monkeypatch?
那些地方用到了?
自己如何实现?
∙所谓猴子补丁就是运行时替换
∙gevent库需要修改内置的socket
fromgeventimportmonkey;monkey.patch_socket()
∙自己实现猴子补丁:
import time
print(time.time())
def _time():
return 1234
time.time = _time
print(time.time)
什么是自省?
∙运行时判断一个对象的类型能力
∙Python一切皆对象,用type,id,isinstance获取对象类型信息
∙Inspect模块提供了更多获取对象信息的函数
什么是列表或字典推导?
∙类似:
[iforiinrange(10)ifi%2==0]
∙一种快速生成list/dict/set的方法,用来替代map/filter
python
a=[1,2,3]
b=['a','b','c']
d={k:
vfork,vinzip(b,a)}
print(d)
∙返回生成器:
(iforiinrange(10)ifi%2==0)
Python2/3的差异点
∙print成为函数
∙编码问题,Python3不再有Unicode对象,默认str就是Unicode
Unicode(给人看的) -> encode -> 字节串(给计算机看的)
传输的时候使用字节串,操作的时候使用Unicode
∙Python3除法返回浮点数
∙类型注解
def hello(name:
str) -> str:
return 'hello' + name
∙优化的super()方便调用父类函数
∙高级解包操作:
a,b,*res=range(10)
∙限定关键词参数
∙Python3重新抛出异常不会丢失栈信息(raisefrom)
∙一切返回迭代器:
range,zip,map,dict.values
∙yieldform链接子生成器
∙asyncio内置库,asyn/await原生协程支持异步编程
兼容Python2/3的工具
∙six模块
∙2to3等工具转换代码
∙_future_
函数-以下代码分别输出什么?
Python如何传参?
# 代码1
def flist(l):
l.append(0)
print(l)
l = []
flist(l)
flist(l)
# 代码2
def fstr(s):
s += 'a'
print(s)
s = 'hehe'
flist(s)
flist(s)
∙Python唯一支持的参数传递是共享传参,函数形参获得实参中各个引用的副本。
∙Python可变/不可变:
不可变对象->bool/int/float/tuple/str/frozenset
可变对象->list/dict/set
# 测试例子1
def clear_list(l):
l = []
ll = [1,2,3]
clear_list(ll)
print(ll)
# [1,2,3]
默认参数只计算一次。
# 测试例子2
def flist(l=[1]):
l.append
(1)
print(l)
flist()
flist()
# [1, 1]
# [1, 1, 1]
函数-Python*args**kwargs都是什么?
∙用来处理可变参数
∙args被打包成tuple
∙kwargs被打包成dict
Python异常机制-什么是Python异常?
Python使用异常处理错误(有些语言使用错误码)
∙BaseException
∙SystemExit/KeyboardInterrupt/GeneratorExit
∙Exception
Python异常机制-什么时候需要捕获异常
∙网络请求(超时、连接错误等)
∙资源访问(权限问题,资源不存在)
∙代码逻辑(越界访问,keyerror)
Python异常机制-如何处理异常?
try:
# fun - 可能会抛出异常的代码
except (Exception1, Exception2) as e:
# 可以捕获多个异常并处理
# 异常处理代码
else:
# pass 异常没有发生时候的代码逻辑
finally:
# pass 无论异常有没有发生都会执行的代码,一般处理资源的关闭和释放
Python异常机制-如何自定义异常?
∙继承Exception实现自定义异常
∙给异常加上一些附加信息
∙处理一些业务相关的特定异常(raiseMyException)
GIL-什么是CPythonGIL?
∙Cpython解释器的内存管理并不是线程安全
∙保护多线程情况下对Python对象进行访问
∙Cpython使用简单的所机制避免多个线程同时执行字节码
GIL影响是?
∙GIL限制了程序的多核执行
∙同一时间只能有一个线程执行字节码
∙CPU密集程序难以利用多核优势
∙IO期间会释放GIL,对IO密集程序影响不大
如何规避GIL影响?
∙CPU密集可以使用多进程+进程池
∙IO密集使用多线程/协程
∙cython扩展
如何剖析程序性能?
∙二八定律,大部分时间耗时在少量代码上
∙内置的profile/cprofile等工具
∙使用pyflame的火焰图工具
什么是生成器
∙生成器就是可以生成值得函数
∙当一个函数里有了yield关键字就成了生成器
∙生成器可以挂起执行并且保持当前执行的状态
服务器端优化措施
∙数据结构与算法优化
∙数据库层:
索引优化,慢查询消除,批量操作减少IO,Nosql
∙网络IO:
批量操作,pipline操作减少IO
∙缓存:
使用内存数据库redis
∙异步:
asyncio,celery
∙并发:
gevent、多线程
为什么写单元测试?
∙避免三无代码(无文档,无注释,无单测)
∙保证代码逻辑的正确性
∙单测影响设计,易测代码往往是高内聚低耦合的
∙回归测试,防止改一处整个服务不可用
单元测试库有哪些?
∙nose/pytest较为常用
∙moke模块用来模拟替换网络请求
∙coverage统计测试覆盖率
1.如何反向迭代一个序列
#如果是一个list,最快的方法使用reverse
tempList=[1,2,3,4]
tempList.reverse()
forxintempList:
printx
#如果不是list,需要手动重排
templist=(1,2,3,4)
foriinrange(len(templist)-1,-1,-1):
printtemplist[i]
2.如何查询和替换一个文本中的字符串
#最简单的方法使用replace()
tempstr="helloyouhellopythonareyouok"
printtempstr.replace("you","python")
#还可以使用正则,有个sub()
tempstr="helloyouhellopythonareyouok"
importre
rex=r'(hello|Use)'
printre.sub(rex,"Bye",tempstr)
3.使用python实现单例模式
#方法一:
可以使用__new__方法
#在__new__方法中把类实例绑定到类变量_instance上,如果cls._instance为None表示该类还没有实例化过,实例化该类并返回。
如果cls_instance不为None表示该类已实例化,直接返回cls_instance
classSingleTon(object):
def__new__(cls,*args,**kwargs):
ifnothasattr(cls,'_instance'):
cls._instance=object.__new__(cls,*args,**kwargs)
returncls._instance
classTestClass(SingleTon):
a=1
test1=TestClass()
test2=TestClass()
printtest1.a,test2.a
test1.a=2
printtest1.a,test2.a
printid(test1),id(test2)
#方法二:
使用装饰器,建立过实例的就放到instances里面,下次建立的时候先检查里面有没有
defSingleTon(cls,*args,**kwargs):
instances={}
printinstances
def_singleton():
ifclsnotininstances:
instances[cls]=cls(*args,**kwargs)
printinstances
returninstances[cls]
return_singleton
@SingleTon
classLastClass(object):
a=1
test1=LastClass()
printtest1.a
test2=LastClass()
printtest2.a
#方法三:
使用__metaclass__(元类)关于元类看看这个吧;
classSignalTon(type):
def__init__(cls,name,bases,dict):
super(SignalTon,cls).__init__(name,bases,dict)
cls._instance=None
def__call__(cls,*args,**kwargs):
ifcls._instanceisNone:
cls._instance=super(SignalTon,cls).__call__(*args,**kwargs)
returncls._instance
classTestClass(object):
__metaclass__=SignalTon
test1=TestClass()
test2=TestClass()
test1.a=2
printtest1.a,test2.a
printid(test1),id(test2)
#方法四:
共享属性 所谓单例就是所有的引用(实例,对象)拥有相同的属性和方法,同一个类的实例天生都会有相同的方法,那我们只需要保证同一个类所产生的实例都具有相同的属性。
所有实例共享属性最简单直接的方法就是共享__dict__属性指向。
classSingleTon(object):
_state={}
def__new__(cls,*args,**kwargs):
obj=object.__new__(cls,*args,**kwargs)
obj.__dict__=cls._state
returnobj
classTestClass(SingleTon):
a=1
test1=TestClass()
test2=TestClass()
printtest1.a,test2.a
test1.a=2
printtest1.a,test2.a
printid(test1),id(test2)
#方法五:
使用同一个模版
#写在mysingleton.py中
classMy_Singleton(object):
deffoo(self):
pass
my_singleton=My_Singleton()
#写在要使用这个实例的py文件里面,在不同的引用的地方都引用相同的实例,以此实现单例模式
frommysingletonimportmy_singleton
my_singleton.foo()
4.重新实现str.strip()
defrightStrip(tempStr,splitStr):
endindex=tempStr.rfind(splitStr)
whileendindex!
=-1andendindex==len(tempStr)-1:
tempStr=tempStr[:
endindex]
endindex=tempStr.rfind(splitStr)
returntempStr
defleftStrip(tempStr,splitStr):
startindex=tempStr.find(splitStr)
whilestartindex==0:
tempStr=tempStr[startindex+1:
]
startindex=tempStr.find(splitStr)
returntempStr
str=" H "
printstr
printleftStrip(str,'')
printrightStrip(str,'')
#输出
H
H
H
5.super的原理
#阅读下面的代码,它的输出结果是什么?
classA(object):
def__init__(self):
print"enterA"
super(A,self).__init__() #new
print"leaveA"
classB(object):
def__init__(self):
print"enterB"
super(B,self).__init__() #new
print"leaveB"
classC(A):
def__init__(self):
print"enterC"
super(C,self).__init__()
print"leaveC"
classD(A):
def__init__(self):
print"enterD"
super(D,self).__init__()
print"leaveD"
classE(B,C):
def__init__(self):
print"enterE"
super(E,self).__init__() #change
print"leaveE"
classF(E,D):
def__init__(self):
print"enterF"
super(F,self).__init__() #change
print"leaveF"
#输出
enterF
enterE
enterB
enterC
enterD
enterA
leaveA
leaveD
leaveC
leaveB
leaveE
leaveF
6.闭包
常用的装饰器就是闭包的一种
defmake_adder(addend):
defadder(addend):
returnaddend+addend
returnadder
P1=make_adder(5)
P2=make_adder(4)
printp1(10)
#输出15
printp2(10)
#输出14
闭包(Closure)是词法闭包(LexicalClosure)的简称,是引用了自由变量的函数。
这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外
7.给列表中的字典排序
list对象alist[{“name”:
”a”,”age”:
20},{“name”:
”b”,”age”:
30},{“name”:
”c”,”age”:
25}]按照age从大到小排序
alist=[{"name":
"a","age":
20},{"name":
"b","age":
30},{"name":
"c","age":
25}]
alist.sort(key=lambda:
x:
-x.get("age"))
printalist
8.合并两个列表排除重复元素
用简洁的方法合并alist=[‘a’,’b’,’c’,’d’,’e’,’f’]
blist=[‘x’,’y’,’z’,’e’,’f’]并且元素不能重复
alist=['a','b','c','d','e','f']
blist=['x','y','z','e','f']
defmerge_list(*args):
s=set()
foriinargs:
s=s.union(i)
print(s)
returns
merge_list(alist,blist)
9.打乱一个排好序的列表
fromrandomimportshuffle
alist=range(10)
print(alist)
shuffle(alist)
print(alist)
10.简单的实现一个栈结构stack
classStack(object):
def__init__(self):
self.value=[]
defpush(self,x):
self.value.append(x)
defpop(self):
self.value.pop()
stack=Stack()
stack.push
(1)
stack.push
(2)
stack.push(3)
print(stack.value)
stack.pop()
print(stack.value)
11.输入一个日期,返回时一年中的哪一天
fromda
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 试笔 试题
![提示](https://static.bdocx.com/images/bang_tan.gif)