Mr.Li--python-面試題集合

想找一份Python開(kāi)發(fā)工作嗎?那你很可能得證明自己知道如何使用Python。下面這些問(wèn)題涉及了與Python相關(guān)的許多技能,問(wèn)題的關(guān)注點(diǎn)主要是語(yǔ)言本身,不是某個(gè)特定的包或模塊。每一個(gè)問(wèn)題都可以擴(kuò)充為一個(gè)教程,如果可能的話。某些問(wèn)題甚至?xí)婕岸鄠€(gè)領(lǐng)域。

問(wèn)題1:什么是python?

Python是一種解釋型語(yǔ)言。這就是說(shuō),與C語(yǔ)言和C的衍生語(yǔ)言不同,Python代碼在運(yùn)行之前不需要編譯。其他解釋型語(yǔ)言還包括PHP和Ruby。

Python是動(dòng)態(tài)類型語(yǔ)言,指的是你在聲明變量時(shí),不需要說(shuō)明變量的類型。你可以直接編寫類似x=111和x="I'm a string"這樣的代碼,程序不會(huì)報(bào)錯(cuò)。

Python非常適合面向?qū)ο蟮木幊蹋∣OP),因?yàn)樗С滞ㄟ^(guò)組合(composition)與繼承(inheritance)的方式定義類(class)。Python中沒(méi)有訪問(wèn)說(shuō)明符(access specifier,類似C++中的public和private),這么設(shè)計(jì)的依據(jù)是“大家都是成年人了”。

在Python語(yǔ)言中,函數(shù)是第一類對(duì)象(first-class objects)。這指的是它們可以被指定給變量,函數(shù)既能返回函數(shù)類型,也可以接受函數(shù)作為輸入。類(class)也是第一類對(duì)象。

Python代碼編寫快,但是運(yùn)行速度比編譯語(yǔ)言通常要慢。好在Python允許加入基于C語(yǔ)言編寫的擴(kuò)展,因此我們能夠優(yōu)化代碼,消除瓶頸,這點(diǎn)通常是可以實(shí)現(xiàn)的。numpy就是一個(gè)很好地例子,它的運(yùn)行速度真的非???,因?yàn)楹芏嗨阈g(shù)運(yùn)算其實(shí)并不是通過(guò)Python實(shí)現(xiàn)的。

Python用途非常廣泛——網(wǎng)絡(luò)應(yīng)用,自動(dòng)化,科學(xué)建模,大數(shù)據(jù)應(yīng)用,等等。它也常被用作“膠水語(yǔ)言”,幫助其他語(yǔ)言和組件改善運(yùn)行狀況。

Python讓困難的事情變得容易,因此程序員可以專注于算法和數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),而不用處理底層的細(xì)節(jié)。

為什么提這個(gè)問(wèn)題

如果你應(yīng)聘的是一個(gè)Python開(kāi)發(fā)崗位,你就應(yīng)該知道這是門什么樣的語(yǔ)言,以及它為什么這么酷。以及它哪里不好。

簡(jiǎn)述函數(shù)式編程

在函數(shù)式編程中,函數(shù)是基本單位,變量只是一個(gè)名稱,而不是一個(gè)存儲(chǔ)單元。除了匿名函數(shù)外,Python還使用fliter(),map(),reduce(),apply()函數(shù)來(lái)支持函數(shù)式編程。

什么是匿名函數(shù),匿名函數(shù)有什么局限性

匿名函數(shù),也就是lambda函數(shù),通常用在函數(shù)體比較簡(jiǎn)單的函數(shù)上。匿名函數(shù)顧名思義就是函數(shù)沒(méi)有名字,因此不用擔(dān)心函數(shù)名沖突。不過(guò)Python對(duì)匿名函數(shù)的支持有限,只有一些簡(jiǎn)單的情況下可以使用匿名函數(shù)。

如何捕獲異常,常用的異常機(jī)制有哪些?

如果我們沒(méi)有對(duì)異常進(jìn)行任何預(yù)防,那么在程序執(zhí)行的過(guò)程中發(fā)生異常,就會(huì)中斷程序,調(diào)用python默認(rèn)的異常處理器,并在終端輸出異常信息。

try...except...finally語(yǔ)句:當(dāng)try語(yǔ)句執(zhí)行時(shí)發(fā)生異常,回到try語(yǔ)句層,尋找后面是否有except語(yǔ)句。找到except語(yǔ)句后,會(huì)調(diào)用這個(gè)自定義的異常處理器。except將異常處理完畢后,程序繼續(xù)往下執(zhí)行。finally語(yǔ)句表示,無(wú)論異常發(fā)生與否,finally中的語(yǔ)句都要執(zhí)行。

assert語(yǔ)句:判斷assert后面緊跟的語(yǔ)句是True還是False,如果是True則繼續(xù)執(zhí)行print,如果是False則中斷程序,調(diào)用默認(rèn)的異常處理器,同時(shí)輸出assert語(yǔ)句逗號(hào)后面的提示信息。

with語(yǔ)句:如果with語(yǔ)句或語(yǔ)句塊中發(fā)生異常,會(huì)調(diào)用默認(rèn)的異常處理器處理,但文件還是會(huì)正常關(guān)閉。

copy()與deepcopy()的區(qū)別

copy是淺拷貝,只拷貝可變對(duì)象的父級(jí)元素。 deepcopy是深拷貝,遞歸拷貝可變對(duì)象的所有元素。

函數(shù)裝飾器有什么作用(??迹?/h1>

裝飾器本質(zhì)上是一個(gè)Python函數(shù),它可以讓其他函數(shù)在不需要做任何代碼變動(dòng)的前提下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對(duì)象。它經(jīng)常用于有切面需求的場(chǎng)景,比如:插入日志、性能測(cè)試、事務(wù)處理、緩存、權(quán)限校驗(yàn)等場(chǎng)景。有了裝飾器,就可以抽離出大量與函數(shù)功能本身無(wú)關(guān)的雷同代碼并繼續(xù)重用。

簡(jiǎn)述Python的作用域以及Python搜索變量的順序

Python作用域簡(jiǎn)單說(shuō)就是一個(gè)變量的命名空間。代碼中變量被賦值的位置,就決定了哪些范圍的對(duì)象可以訪問(wèn)這個(gè)變量,這個(gè)范圍就是變量的作用域。在Python中,只有模塊(module),類(class)以及函數(shù)(def、lambda)才會(huì)引入新的作用域。Python的變量名解析機(jī)制也稱為 LEGB 法則:本地作用域(Local)→當(dāng)前作用域被嵌入的本地作用域(Enclosing locals)→全局/模塊作用域(Global)→內(nèi)置作用域(Built-in)

新式類和舊式類的區(qū)別,如何確保使用的類是新式類

為了統(tǒng)一類(class)和類型(type),python在2.2版本引進(jìn)來(lái)新式類。在2.1版本中,類和類型是不同的。

為了確保使用的是新式類,有以下方法:

放在類模塊代碼的最前面 __metaclass__ = type

從內(nèi)建類object直接或者間接地繼承

在python3版本中,默認(rèn)所有的類都是新式類。

簡(jiǎn)述__new__和__init__的區(qū)別

創(chuàng)建一個(gè)新實(shí)例時(shí)調(diào)用__new__,初始化一個(gè)實(shí)例時(shí)用__init__,這是它們最本質(zhì)的區(qū)別。

new方法會(huì)返回所構(gòu)造的對(duì)象,init則不會(huì).

new函數(shù)必須以cls作為第一個(gè)參數(shù),而init則以self作為其第一個(gè)參數(shù).

Python垃圾回收機(jī)制(???

Python GC主要使用引用計(jì)數(shù)(reference counting)來(lái)跟蹤和回收垃圾。在引用計(jì)數(shù)的基礎(chǔ)上,通過(guò)“標(biāo)記-清除”(mark and sweep)解決容器對(duì)象可能產(chǎn)生的循環(huán)引用問(wèn)題,通過(guò)“分代回收”(generation collection)以空間換時(shí)間的方法提高垃圾回收效率。

1 引用計(jì)數(shù)

PyObject是每個(gè)對(duì)象必有的內(nèi)容,其中ob_refcnt就是做為引用計(jì)數(shù)。當(dāng)一個(gè)對(duì)象有新的引用時(shí),它的ob_refcnt就會(huì)增加,當(dāng)引用它的對(duì)象被刪除,它的ob_refcnt就會(huì)減少.引用計(jì)數(shù)為0時(shí),該對(duì)象生命就結(jié)束了。

優(yōu)點(diǎn):

簡(jiǎn)單 實(shí)時(shí)性 缺點(diǎn):

維護(hù)引用計(jì)數(shù)消耗資源 循環(huán)引用

2 標(biāo)記-清除機(jī)制

基本思路是先按需分配,等到?jīng)]有空閑內(nèi)存的時(shí)候從寄存器和程序棧上的引用出發(fā),遍歷以對(duì)象為節(jié)點(diǎn)、以引用為邊構(gòu)成的圖,把所有可以訪問(wèn)到的對(duì)象打上標(biāo)記,然后清掃一遍內(nèi)存空間,把所有沒(méi)標(biāo)記的對(duì)象釋放。

3 分代技術(shù)

分代回收的整體思想是:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時(shí)間劃分為不同的集合,每個(gè)集合就成為一個(gè)“代”,垃圾收集頻率隨著“代”的存活時(shí)間的增大而減小,存活時(shí)間通常利用經(jīng)過(guò)幾次垃圾回收來(lái)度量。

Python默認(rèn)定義了三代對(duì)象集合,索引數(shù)越大,對(duì)象存活時(shí)間越長(zhǎng)。

Python中的@property有什么作用?如何實(shí)現(xiàn)成員變量的只讀屬性?

@property裝飾器就是負(fù)責(zé)把一個(gè)方法變成屬性調(diào)用,通常用在屬性的get方法和set方法,通過(guò)設(shè)置@property可以實(shí)現(xiàn)實(shí)例成員變量的直接訪問(wèn),又保留了參數(shù)的檢查。另外通過(guò)設(shè)置get方法而不定義set方法可以實(shí)現(xiàn)成員變量的只讀屬性。

*args and **kwargs

*args代表位置參數(shù),它會(huì)接收任意多個(gè)參數(shù)并把這些參數(shù)作為元組傳遞給函數(shù)。**kwargs代表的關(guān)鍵字參數(shù),允許你使用沒(méi)有事先定義的參數(shù)名,另外,位置參數(shù)一定要放在關(guān)鍵字參數(shù)的前面。

有用過(guò)with statement嗎?它的好處是什么?具體如何實(shí)現(xiàn)?

with語(yǔ)句適用于對(duì)資源進(jìn)行訪問(wèn)的場(chǎng)合,確保不管使用過(guò)程中是否發(fā)生異常都會(huì)執(zhí)行必要的“清理”操作,釋放資源,比如文件使用后自動(dòng)關(guān)閉、線程中鎖的自動(dòng)獲取和釋放等。

what will be the output of the code below? explain your answer

defextend_list(val, list=[]):list.append(val)returnlistlist1 = extend_list(10)list2 = extend_list(123, [])list3 = extend_list('a')print(list1)# list1 = [10, 'a']print(list2)# list2 = [123, []]print(list3)# list3 = [10, 'a']classParent(object):x =1classChild1(Parent):passclassChild2(Parent):passprint(Parent.x, Child1.x, Child2.x)# [1,1,1]Child1.x =2print(Parent.x, Child1.x, Child2.x)# [1,2,1]Partent.x =3print(Parent.x, Child1.x, Child2.x)# [3,2,3]


在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(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]]defgetNum(num,data=None):whiledata:ifnum >data[0][-1]:deldata[0]print(data)getNum(num,data=None)elif num


獲取最大公約數(shù)、最小公倍數(shù)

a =36b =21defmaxCommon(a, b):whileb: a,b = b, a%breturnadefminCommon(a, b):c = a*bwhileb: a,b = b, a%breturnc//aif__name__ =='__main__':? ? print(maxCommon(a,b))? ? print(minCommon(a,b))


獲取中位數(shù)

defmedian(data):data.sort()? ? half = len(data) //2return(data[half] + data[~half])/2l = [1,3,4,53,2,46,8,42,82]if__name__ =='__main__':? ? print(median(l))


輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示中1的個(gè)數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。

defgetOneCount(num):ifnum >0:? ? ? ? count = b_num.count('1')? ? ? ? print(b_num)returncountelifnum <0:? ? ? ? b_num = bin(~num)? ? ? ? count =8- b_num.count('1')returncountelse:return8if__name__ =='__main__':? ? print(getOneCount(5))? ? print(getOneCount(-5))? ? print(getOneCount(0))


本文只做拋磚引玉之用,有些見(jiàn)解還不是特別成熟,希望可以為學(xué)習(xí)Python找工作的伙伴們提供一些幫助,面試過(guò)程當(dāng)中最重要的一點(diǎn)是放平心態(tài),求職過(guò)程是雙方的,不需要太過(guò)緊張,把自己掌握的知識(shí)充分表達(dá)出來(lái)就好。只要你是匹千里馬,遲早會(huì)被伯樂(lè)牽出來(lái)遛一遛的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,806評(píng)論 1 118
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 34,740評(píng)論 18 399
  • Swift 介紹 簡(jiǎn)介 Swift 語(yǔ)言由蘋果公司在 2014 年推出,用來(lái)撰寫 OS X 和 iOS 應(yīng)用程序 ...
    大L君閱讀 3,436評(píng)論 3 25
  • 前幾天,晚上下班,去市場(chǎng)買菜,然后回家。進(jìn)屋后,打開(kāi)音樂(lè)。默認(rèn)播放的列表,有很多歌,現(xiàn)在都不喜歡聽(tīng)了,但有幾個(gè)人我...
    魚小哆閱讀 2,240評(píng)論 0 12
  • 我好像已經(jīng)忘卻了最初的自己 也忘卻了那個(gè)最初的夢(mèng)想 我想把他們找回 可,他們能還會(huì)憐憫我這個(gè)可憐蟲嗎? 不知道在什...
    不懂wz閱讀 183評(píng)論 0 1

友情鏈接更多精彩內(nèi)容