2025年P(guān)ython面試筆試題_第1頁
2025年P(guān)ython面試筆試題_第2頁
2025年P(guān)ython面試筆試題_第3頁
2025年P(guān)ython面試筆試題_第4頁
2025年P(guān)ython面試筆試題_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第一題如下兩段代碼,運(yùn)行結(jié)束後的成果是什么?與否相似?原因是什么?代碼一代碼二第二題4G內(nèi)存怎么讀取一種5G的數(shù)據(jù)?第三題淺述深淺拷貝答案第一題成果不相似第一段成果為:[{'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)相稱于執(zhí)行了淺拷貝,每變化一次a中num的值,所有a的值都將變化第二題實(shí)現(xiàn)措施有兩種。實(shí)現(xiàn)措施一:措施一的實(shí)現(xiàn)思緒是通過生成器,一次讀取少許數(shù)據(jù),原則答案是根據(jù)文獻(xiàn)實(shí)現(xiàn),這裏給出的例子是咸魚學(xué)習(xí)bobby老師的課程時(shí)記錄的例子,不懂得怎樣使用生成器完畢這個(gè)需求的朋友可以參照:實(shí)現(xiàn)措施二:在linux系統(tǒng)下使用split可以分割文獻(xiàn),對(duì)于多行文獻(xiàn)可以使用按行分割的方式,對(duì)于單行的大文獻(xiàn)可以采用按文獻(xiàn)大小分割。按文獻(xiàn)行數(shù)分割:split-l300large_file.logsmallfile_prefix按文獻(xiàn)大小分割:split-b10mlarge_file.logsmallfile_prefix之後再按文獻(xiàn)讀取即可。第一題下圖中的打印成果分別是什么?第二題Python中靜態(tài)措施、類措施、組員函數(shù)作用是什么?第三題說說對(duì)缺省參數(shù)的理解?*args是什么?**kwargs是什么?答案第一題前三個(gè)是True,最終一種會(huì)報(bào)錯(cuò)。具前三個(gè)為何輸出True,不理解的可以參照下圖:圖來源于bobby老師的異步IO編程課件最終一種為何報(bào)錯(cuò),我們可以先看下issubclass的使用方法:issubclass措施用于判斷參數(shù)

class

與否是類型參數(shù)

classinfo

的子類

issubclass(class,

classinfo)

參數(shù)

class

--

類。

classinfo

--

類。

返回值

假如

class

classinfo

的子類返回

True,否則返回

False。

而在題目中b并不是一種類,因此報(bào)錯(cuò)。第二題我們先理清晰靜態(tài)函數(shù)、類函數(shù)分別是什么?靜態(tài)措施是一種一般函數(shù),就位于類定義的命名空間中,它不會(huì)對(duì)任何實(shí)例類型進(jìn)行操作。使用裝飾器@staticmethod定義靜態(tài)措施。類對(duì)象和實(shí)例都可以調(diào)用靜態(tài)措施。類措施是將類自身作為對(duì)象進(jìn)行操作的措施。類措施使用@classmethod裝飾器定義,其第一種參數(shù)是類,約定寫為cls。第三題缺省參數(shù)是指在調(diào)用函數(shù)的時(shí)候沒有傳入?yún)?shù)的狀況下,調(diào)用默認(rèn)的參數(shù),在調(diào)用函數(shù)的同步賦值時(shí),所傳入的參數(shù)會(huì)替代默認(rèn)參數(shù)。*args是不定長(zhǎng)參數(shù),可以表達(dá)輸入?yún)?shù)是不確定的,可以任意多種**kwargs是關(guān)鍵詞參數(shù),賦值的時(shí)候是以鍵=值的方式,參數(shù)是可以任意多對(duì)。以上兩個(gè)的使用是在定義函數(shù)的時(shí)候不確定會(huì)傳入多少參數(shù)時(shí)使用。什么是鴨子類型?當(dāng)看到一只鳥,走起來像鴨子、游泳起來像鴨子、叫起來像鴨子那么這只鳥就可以被稱之為鴨子關(guān)注點(diǎn)在對(duì)象的行為,而不是類型(ducktyping)例如file,StringIO,socket對(duì)象都支持read/write措施(filelikeobject)例如定義了

_iter_

魔術(shù)措施的對(duì)象可以使用for鴨子類型更關(guān)注接口而非類型。什么是monkeypatch?那些地方用到了?自已怎樣實(shí)現(xiàn)?所謂猴子補(bǔ)丁就是運(yùn)行時(shí)替代gevent庫需要修改內(nèi)置的socketfromgeventimportmonkey;monkey.patch_socket()自已實(shí)現(xiàn)猴子補(bǔ)丁:import

time

print(time.time())

def

_time():

return

1234

time.time

=

_time

print(time.time)什么是自???運(yùn)行時(shí)判斷一種對(duì)象的類型能力Python一切皆對(duì)象,用type,id,isinstance獲取對(duì)象類型信息Inspect模塊提供了更多獲取對(duì)象信息的函數(shù)什么是列表或字典推導(dǎo)?類似:

[iforiinrange(10)ifi%2==0]一種迅速生成list/dict/set的措施,用來替代map/filter

python<br/>a=[1,2,3]<br/>b=['a','b','c']<br/>d={k:vfork,vinzip(b,a)}<br/>print(d)<br/>返回生成器:

(iforiinrange(10)ifi%2==0)Python2/3的差異點(diǎn)print成為函數(shù)編碼問題,Python3不再有Unicode對(duì)象,默認(rèn)str就是UnicodeUnicode(給人看的)

->

encode

->

字節(jié)串(給計(jì)算機(jī)看的)

傳播的時(shí)候使用字節(jié)串,操作的時(shí)候使用UnicodePython3除法返回浮點(diǎn)數(shù)類型注解def

hello(name:

str)

->

str:

return

'hello'

+

name優(yōu)化的super()以便調(diào)用父類函數(shù)高級(jí)解包操作:

a,b,*res=range(10)限定關(guān)鍵詞參數(shù)Python3重新拋出異常不會(huì)丟失棧信息(raisefrom)一切返回迭代器:range,zip,map,dict.valuesyieldform鏈接子生成器asyncio內(nèi)置庫,asyn/await原生協(xié)程支持異步編程兼容Python2/3的工具six模塊2to3等工具轉(zhuǎn)換代碼_future_函數(shù)-如下代碼分別輸出什么?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唯一支持的參數(shù)傳遞是共享傳參,函數(shù)形參獲得實(shí)參中各個(gè)引用的副本。Python可變/不可變:不可變對(duì)象->bool/int/float/tuple/str/frozenset

可變對(duì)象->list/dict/set#

測(cè)試?yán)?

def

clear_list(l):

l

=

[]

ll

=

[1,2,3]

clear_list(ll)

print(ll)

#

[1,2,3]默認(rèn)參數(shù)只計(jì)算一次。#

測(cè)試?yán)?

def

flist(l=[1]):

l.append(1)

print(l)

flist()

flist()

#

[1,

1]

#

[1,

1,

1]函數(shù)-Python*args**kwargs都是什么?用來處理可變參數(shù)args被打包成tuplekwargs被打包成dictPython異常機(jī)制-什么是Python異常?Python使用異常處理錯(cuò)誤(有些語言使用錯(cuò)誤碼)BaseExceptionSystemExit/KeyboardInterrupt/GeneratorExitExceptionPython異常機(jī)制-什么時(shí)候需要捕捉異常網(wǎng)絡(luò)祈求(超時(shí)、連接錯(cuò)誤等)資源訪問(權(quán)限問題,資源不存在)代碼邏輯(越界訪問,keyerror)Python異常機(jī)制-怎樣處理異常?try:

#

fun

-

也許會(huì)拋出異常的代碼

except

(Exception1,

Exception2)

as

e:

#

可以捕捉多種異常并處理

#

異常處理代碼

else:

#

pass

異常沒有發(fā)生時(shí)候的代碼邏輯

finally:

#

pass

無論異常有無發(fā)生都會(huì)執(zhí)行的代碼,一般處理資源的關(guān)閉和釋放Python異常機(jī)制-怎樣自定義異常?繼承Exception實(shí)現(xiàn)自定義異常給異常加上某些附加信息處理某些業(yè)務(wù)有關(guān)的特定異常(raiseMyException)GIL-什么是CPythonGIL?Cpython解釋器的內(nèi)存管理并不是線程安全保護(hù)多線程狀況下對(duì)Python對(duì)象進(jìn)行訪問Cpython使用簡(jiǎn)樸的所機(jī)制防止多種線程同步執(zhí)行字節(jié)碼GIL影響是?GIL限制了程序的多核執(zhí)行同一時(shí)間只能有一種線程執(zhí)行字節(jié)碼CPU密集程序難以運(yùn)用多核優(yōu)勢(shì)IO期間會(huì)釋放GIL,對(duì)IO密集程序影響不大怎樣規(guī)避GIL影響?CPU密集可以使用多進(jìn)程+進(jìn)程池IO密集使用多線程/協(xié)程cython擴(kuò)展怎樣剖析程序性能?二八定律,大部分時(shí)間耗時(shí)在少許代碼上內(nèi)置的profile/cprofile等工具使用pyflame的火焰圖工具什么是生成器生成器就是可以生成值得函數(shù)當(dāng)一種函數(shù)裏有了yield關(guān)鍵字就成了生成器生成器可以掛起執(zhí)行并且保持目前執(zhí)行的狀態(tài)服務(wù)器端優(yōu)化措施數(shù)據(jù)構(gòu)造與算法優(yōu)化數(shù)據(jù)庫層:索引優(yōu)化,慢查詢消除,批量操作減少IO,Nosql網(wǎng)絡(luò)IO:批量操作,pipline操作減少IO緩存:使用內(nèi)存數(shù)據(jù)庫redis異步:asyncio,celery并發(fā):gevent、多線程為何寫單元測(cè)試?防止三無代碼(無文檔,無注釋,無單測(cè))保證代碼邏輯的對(duì)的性單測(cè)影響設(shè)計(jì),易測(cè)代碼往往是高內(nèi)聚低耦合的回歸測(cè)試,防止改一處整個(gè)服務(wù)不可用單元測(cè)試庫有哪些?nose/pytest較為常用moke模塊用來模擬替代網(wǎng)絡(luò)祈求coverage記錄測(cè)試覆蓋率1.怎樣反向迭代一種序列#假如是一種list,最快的措施使用reverse

tempList=[1,2,3,4]

tempList.reverse()

forxintempList:

printx#假如不是list,需要手動(dòng)重排

templist=(1,2,3,4)

foriinrange(len(templist)-1,-1,-1):

printtemplist[i]2.怎樣查詢和替代一種文本中的字符串#最簡(jiǎn)樸的措施使用replace()

tempstr="helloyouhellopythonareyouok"

printtempstr.replace("you","python")#還可以使用正則,有個(gè)sub()

tempstr="helloyouhellopythonareyouok"

importre

rex=r'(hello|Use)'

printre.sub(rex,"Bye",tempstr)3.使用python實(shí)現(xiàn)單例模式#措施一:可以使用__new__措施

#在__new__措施中把類實(shí)例綁定到類變量_instance上,假如cls._instance為None表達(dá)該類還沒有實(shí)例化過,實(shí)例化該類并返回。假如cls_instance不為None表達(dá)該類已實(shí)例化,直接返回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)#措施二:使用裝飾器,建立過實(shí)例的就放到instances裏面,下次建立的時(shí)候先檢查裏面有無

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__(元類)有關(guān)元類看看這個(gè)吧;

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)#措施四:共享屬性

所謂單例就是所有的引用(實(shí)例,對(duì)象)擁有相似的屬性和措施,同一種類的實(shí)例天生都會(huì)有相似的措施,那我們只需要保證同一種類所產(chǎn)生的實(shí)例都具有相似的屬性。所有實(shí)例共享屬性最簡(jiǎn)樸直接的措施就是共享__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()

#寫在要使用這個(gè)實(shí)例的py文獻(xiàn)裏面,在不一樣的引用的地方都引用相似的實(shí)例,以此實(shí)現(xiàn)單例模式

frommysingletonimportmy_singleton

my_singleton.foo()4.重新實(shí)現(xiàn)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

H5.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

leaveF6.閉包常用的裝飾器就是閉包的一種

defmake_adder(addend):

defadder(addend):

returnaddend+addend

returnadder

P1=make_adder(5)

P2=make_adder(4)

printp1(10)

#輸出15

printp2(10)

#輸出14閉包(Closure)是詞法閉包(LexicalClosure)的簡(jiǎn)稱,是引用了自由變量的函數(shù)。這個(gè)被引用的自由變量將和這個(gè)函數(shù)一同存在,雖然已經(jīng)離開了發(fā)明它的環(huán)境也不例外

7.給列表中的字典排序list對(duì)象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"))

printalist8.合并兩個(gè)列表排除反復(fù)元素用簡(jiǎn)潔的措施合并alist=[‘a(chǎn)’,’b’,’c’,’d’,’e’,’f’]

blist=[‘x’,’y’,’z’,’e’,’f’]并且元素不能反復(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.簡(jiǎn)樸的實(shí)現(xiàn)一種棧構(gòu)造stackclassStack(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.輸入一種曰期,返回時(shí)一年中的哪一天fromdatetimeimportdatetime

defwhich_day(year,month,day):

return(datetime(year,month,day)-datetime(year,1,1)).days+1

print(which_day(,1,15))12.把字符串”k1:1|k2:2|k3:3”處理成python字典的形式:{k1:1,k2:2,k3:3}defstring_to_dict(string):

d={}

forkvinstring.split("|"):

k,v=kv.split(":")

ifv.isdigit():

v=int(v)

d[k]=v

returnd

print(string_to_dict("k1:1|k2:2|k3:3"))13.判斷輸入的值與否在矩陣之中(楊氏矩陣)在一種二維數(shù)組之中,每一行都按照從走到右遞增的次序排序,每一列到按照從上到下的次序排序.請(qǐng)完畢一種函數(shù),輸入這樣的一種二維手術(shù)和一種整數(shù),判斷數(shù)組中與否具有該整數(shù)#處理數(shù)組矩陣

arr=[[1,4,7,10,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]]

defget_num(num,data=None):

whiledata:

ifnum>data[0][-1]:

deldata[0]

elifnum<data[0][-1]:

data=list(zip(*data))

deldata[-1]

data=list(zip(*data))

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論