Python面试笔试题Word文件下载.docx

上传人:b****6 文档编号:18094364 上传时间:2022-12-13 格式:DOCX 页数:17 大小:272.54KB
下载 相关 举报
Python面试笔试题Word文件下载.docx_第1页
第1页 / 共17页
Python面试笔试题Word文件下载.docx_第2页
第2页 / 共17页
Python面试笔试题Word文件下载.docx_第3页
第3页 / 共17页
Python面试笔试题Word文件下载.docx_第4页
第4页 / 共17页
Python面试笔试题Word文件下载.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

Python面试笔试题Word文件下载.docx

《Python面试笔试题Word文件下载.docx》由会员分享,可在线阅读,更多相关《Python面试笔试题Word文件下载.docx(17页珍藏版)》请在冰豆网上搜索。

Python面试笔试题Word文件下载.docx

class 

是否是类型参数 

classinfo 

的子类

issubclass(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<

br/>

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除法返回浮点数

∙类型注解

hello(name:

str) 

str:

'

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

flist(l):

l.append(0)

print(l)

[]

flist(l)

代码2

fstr(s):

+= 

print(s)

hehe'

flist(s)

∙Python唯一支持的参数传递是共享传参,函数形参获得实参中各个引用的副本。

∙Python可变/不可变:

不可变对象->

bool/int/float/tuple/str/frozenset

 

可变对象->

list/dict/set

测试例子1

clear_list(l):

ll 

[1,2,3]

clear_list(ll)

print(ll)

默认参数只计算一次。

测试例子2

flist(l=[1]):

l.append

(1)

flist()

[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:

无论异常有没有发生都会执行的代码,一般处理资源的关闭和释放

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()

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

printid(test1),id(test2)

#方法二:

使用装饰器,建立过实例的就放到instances里面,下次建立的时候先检查里面有没有

defSingleTon(cls,*args,**kwargs):

instances={}

printinstances

def_singleton():

ifclsnotininstances:

instances[cls]=cls(*args,**kwargs)

returninstances[cls]

return_singleton

@SingleTon

classLastClass(object):

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)

classTestClass(object):

__metaclass__=SignalTon

test1.a=2

#方法四:

共享属性 

所谓单例就是所有的引用(实例,对象)拥有相同的属性和方法,同一个类的实例天生都会有相同的方法,那我们只需要保证同一个类所产生的实例都具有相同的属性。

所有实例共享属性最简单直接的方法就是共享__dict__属性指向。

_state={}

def__new__(cls,*args,**kwargs):

obj=object.__new__(cls,*args,**kwargs)

obj.__dict__=cls._state

returnobj

#方法五:

使用同一个模版

#写在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:

]

str="

"

printstr

printleftStrip(str,'

'

printrightStrip(str,'

#输出

H

5.super的原理

#阅读下面的代码,它的输出结果是什么?

classA(object):

def__init__(self):

print"

enterA"

super(A,self).__init__() 

#new

leaveA"

classB(object):

enterB"

super(B,self).__init__() 

leaveB"

classC(A):

enterC"

super(C,self).__init__()

leaveC"

classD(A):

enterD"

super(D,self).__init__()

leaveD"

classE(B,C):

enterE"

super(E,self).__init__() 

#change

leaveE"

classF(E,D):

enterF"

super(F,self).__init__() 

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},{"

b"

30},{"

c"

25}]

alist.sort(key=lambda:

x:

-x.get("

))

printalist

8.合并两个列表排除重复元素

用简洁的方法合并alist=[‘a’,’b’,’c’,’d’,’e’,’f’] 

blist=[‘x’,’y’,’z’,’e’,’f’]并且元素不能重复

alist=['

d'

e'

f'

blist=['

x'

y'

z'

defmerge_list(*args):

s=set()

foriinargs:

s=s.union(i)

returns

merge_list(alist,blist)

9.打乱一个排好序的列表

fromrandomimportshuffle

alist=range(10)

print(alist)

shuffle(alist)

10.简单的实现一个栈结构stack

classStack(object):

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()

11.输入一个日期,返回时一年中的哪一天

fromda

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 电子电路

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1