深入解答關(guān)于Python的11道基本面試題
前言
本文給大家深入的解答了關(guān)于Python的11道基本面試題,通過(guò)這些面試題大家能對(duì)python進(jìn)一步的了解和學(xué)習(xí),下面話(huà)不多說(shuō),來(lái)看看詳細(xì)的介紹吧。
一、單引號(hào),雙引號(hào),三引號(hào)的區(qū)別
分別闡述3種引號(hào)用的場(chǎng)景和區(qū)別
1),單引號(hào)和雙引號(hào)主要用來(lái)表示字符串
比如:
- 單引號(hào):'python'
- 雙引號(hào):"python"
2).三引號(hào)
- 三單引號(hào):'''python ''',也可以表示字符串一般用來(lái)輸入多行文本,或者用于大段的注釋
- 三雙引號(hào):"""python""",一般用在類(lèi)里面,用來(lái)注釋類(lèi),這樣省的寫(xiě)文檔,直接用類(lèi)的對(duì)象__doc__訪(fǎng)問(wèn)獲得文檔
區(qū)別:
若你的字符串里面本身包含單引號(hào),必須用雙引號(hào)
比如: "can't find the log\n"
二、Python的參數(shù)傳遞是值傳遞還是引用傳遞
舉例說(shuō)明Python函數(shù)參數(shù)傳遞的幾種形式,并說(shuō)明函數(shù)傳參是值傳遞還是引用傳遞
1).Python的參數(shù)傳遞有:
位置參數(shù)
默認(rèn)參數(shù),
可變參數(shù),
關(guān)鍵字參數(shù)
2).函數(shù)的傳值到底是值傳遞還是引用傳遞,要分情況
a.不可變參數(shù)用值傳遞:
像整數(shù)和字符串這樣的不可變對(duì)象,是通過(guò)拷貝進(jìn)行傳遞的,因?yàn)槟銦o(wú)論如何都不可能在原處改變不可變對(duì)象
b.可變參數(shù)是用引用傳遞的
比如像列表,字典這樣的對(duì)象是通過(guò)引用傳遞,和C語(yǔ)言里面的用指針傳遞數(shù)組很相似,可變對(duì)象能在函數(shù)內(nèi)部改變.
三、什么是lambda函數(shù)?它有什么好處?
舉例說(shuō)明lambda的用法,并說(shuō)明用lambda的優(yōu)點(diǎn)
1).lambda的用法:
lambda是匿名函數(shù),用法如下:lambda arg1,arg2..argN:expression using args
2).優(yōu)點(diǎn)
lambda能和def做同樣種類(lèi)的工作,特別是對(duì)于那些邏輯簡(jiǎn)單的函數(shù),直接用lambda會(huì)更簡(jiǎn)潔,而且省去取函數(shù)名的麻煩(給函數(shù)取名是個(gè)技術(shù)活)
四、字符串格式化:%和.format的區(qū)別
字符串的format函數(shù)非常靈活,很強(qiáng)大,可以接受的參數(shù)不限個(gè)數(shù),并且位置可以不按順序,而且有較為強(qiáng)大的格式限定符(比如:填充,對(duì)齊,精度等)
五、Python是如何進(jìn)行內(nèi)存管理的
1).對(duì)象的引用計(jì)數(shù)機(jī)制
Python內(nèi)部使用引用計(jì)數(shù),來(lái)保持追蹤內(nèi)存中的對(duì)象,所有對(duì)象都有引用計(jì)數(shù)。
引用計(jì)數(shù)增加的情況:
- 一個(gè)對(duì)象分配一個(gè)新名稱(chēng)
- 將其放入一個(gè)容器中(如列表、元組或字典)
引用計(jì)數(shù)減少的情況:
- 使用del語(yǔ)句對(duì)對(duì)象別名顯示的銷(xiāo)毀
- 引用超出作用域或被重新賦值
2).垃圾回收
當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)歸零時(shí),它將被垃圾收集機(jī)制處理掉。
3).內(nèi)存池機(jī)制
Python提供了對(duì)內(nèi)存的垃圾收集機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng):
- Pymalloc機(jī)制:為了加速Python的執(zhí)行效率,Python引入了一個(gè)內(nèi)存池機(jī)制,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放。
- 對(duì)于Python對(duì)象,如整數(shù),浮點(diǎn)數(shù)和List,都有私有內(nèi)存池,對(duì)象間不共享他們的內(nèi)存池。也就是說(shuō)如果你分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點(diǎn)數(shù)。
六、寫(xiě)一個(gè)函數(shù), 輸入一個(gè)字符串, 返回倒序排列的結(jié)果
輸入: string_reverse(‘abcdef’)
, 返回: ‘fedcba’,寫(xiě)出你能想到的多種方法
1).利用字符串本身的翻轉(zhuǎn)
def string_reverse1(text='abcdef'): return text[::-1]
2).把字符串變成列表,用列表的reverse函數(shù)
3).新建一個(gè)列表,從后往前取
4).利用雙向列表deque中的extendleft函數(shù)
5).遞歸
七、按升序合并如下兩個(gè)list, 并去除重復(fù)的元素
list1 = [2, 3, 8, 4, 9, 5, 6] list2 = [5, 6, 10, 17, 11, 2]
1).最簡(jiǎn)單的方法用set
list3=list1+list2 print set(list3)
2).遞歸
先選一個(gè)中間數(shù),然后一邊是小的數(shù)字,一邊是大的數(shù)字,然后再循環(huán)遞歸,排完序(是不是想起了c里面的冒泡)
八、以下的代碼的輸出將是什么? 說(shuō)出你的答案并解釋
class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1.x, Child2.x >> 1 1 1 1 2 1 3 2 3
解答:
使你困惑或是驚奇的是關(guān)于最后一行的輸出是 3 2 3 而不是 3 2 1。為什么改變了 Parent.x 的值還會(huì)改變 Child2.x 的值,但是同時(shí) Child1.x 值卻沒(méi)有改變?
這個(gè)答案的關(guān)鍵是,在 Python中,類(lèi)變量在內(nèi)部是作為字典處理的。如果一個(gè)變量的名字沒(méi)有在當(dāng)前類(lèi)的字典中發(fā)現(xiàn),將搜索祖先類(lèi)(比如父類(lèi))直到被引用的變量名被找到.
- 首先,在父類(lèi)中設(shè)置 x = 1 會(huì)使得類(lèi)變量 x 在引用該類(lèi)和其任何子類(lèi)中的值為 1。這就是因?yàn)榈谝粋€(gè) print 語(yǔ)句的輸出是 1 1 1
- 然后,如果任何它的子類(lèi)重寫(xiě)了該值(例如,我們執(zhí)行語(yǔ)句
Child1.x = 2
)該值僅僅在子類(lèi)中被改變。這就是為什么第二個(gè) print 語(yǔ)句的輸出是 1 2 1 - 最后,如果該值在父類(lèi)中被改變(例如,我們執(zhí)行語(yǔ)句
Parent.x = 3
),這個(gè)改變會(huì)影響到任何未重寫(xiě)該值的子類(lèi)當(dāng)中的值(在這個(gè)示例中被影響的子類(lèi)是 Child2)。這就是為什么第三個(gè) print 輸出是 3 2 3
九、下面的代碼報(bào)錯(cuò)
list = ['a', 'b', 'c', 'd', 'e'] print list[10:]
不會(huì)報(bào)錯(cuò),而且會(huì)輸出一個(gè) [],并且不會(huì)導(dǎo)致一個(gè) IndexError
解答:
當(dāng)試圖訪(fǎng)問(wèn)一個(gè)超過(guò)列表索引值的成員將導(dǎo)致 IndexError(比如訪(fǎng)問(wèn)以上列表的 list[10])。盡管如此,試圖訪(fǎng)問(wèn)一個(gè)列表的以超出列表長(zhǎng)度數(shù)作為開(kāi)始索引的切片將不會(huì)導(dǎo)致 IndexError,并且將僅僅返回一個(gè)空列表
一個(gè)討厭的小問(wèn)題是它會(huì)導(dǎo)致出現(xiàn) bug ,并且這個(gè)問(wèn)題是難以追蹤的,因?yàn)樗谶\(yùn)行時(shí)不會(huì)引發(fā)錯(cuò)誤
十、說(shuō)出下面list1,list2,list3的輸出值
def extendList(val, list=[]): list.append(val) return list list1 = extendList(10) list2 = extendList(123,[]) list3 = extendList('a') print "list1 = %s" % list1 print "list2 = %s" % list2 print "list3 = %s" % list3 >> list1 = [10, 'a'] list2 = [123] list3 = [10, 'a']
許多人會(huì)錯(cuò)誤的認(rèn)為 list1 應(yīng)該等于 [10] 以及 list3 應(yīng)該等于 ['a']。認(rèn)為 list 的參數(shù)會(huì)在 extendList 每次被調(diào)用的時(shí)候會(huì)被設(shè)置成它的默認(rèn)值 []。
盡管如此,實(shí)際發(fā)生的事情是,新的默認(rèn)列表僅僅只在函數(shù)被定義時(shí)創(chuàng)建一次。隨后當(dāng) extendList 沒(méi)有被指定的列表參數(shù)調(diào)用的時(shí)候,其使用的是同一個(gè)列表。這就是為什么當(dāng)函數(shù)被定義的時(shí)候,表達(dá)式是用默認(rèn)參數(shù)被計(jì)算,而不是它被調(diào)用的時(shí)候。
因此,list1 和 list3 是操作的相同的列表。而list2是操作的它創(chuàng)建的列表(通過(guò)傳遞它自己的空列表作為list參數(shù)的值)
所以這一點(diǎn)一定要切記切記.下面我們把list置為None就可以避免一些麻煩了
十一、寫(xiě)出你認(rèn)為最Pythonic的代碼
Pythonic編程風(fēng)格是Python的一種追求的風(fēng)格,精髓就是追求直觀(guān),簡(jiǎn)潔而容易讀.
下面是一些比較好的例子
1).交互變量
非Pythonic
temp = a a = b b = temp pythonic: a,b=b,a
2).判斷其值真假
name = 'Tim' langs = ['AS3', 'Lua', 'C'] info = {'name': 'Tim', 'sex': 'Male', 'age':23 } 非Pythonic if name != '' and len(langs) > 0 and info != {}: print('All True!') pythonic: if name and langs and info: print('All True!')
3).列表推導(dǎo)式
[x for x in range(1,100) if x%2==0]
4).zip創(chuàng)建鍵值對(duì)
keys = ['Name', 'Sex', 'Age'] values = ['Jack', 'Male', 23] dict(zip(keys,values))
pythonic的代碼很多,這里舉幾個(gè)典型的例子
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
python使用pandas處理excel文件轉(zhuǎn)為csv文件的方法示例
這篇文章主要介紹了python使用pandas處理excel文件轉(zhuǎn)為csv文件的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07基于opencv的selenium滑動(dòng)驗(yàn)證碼的實(shí)現(xiàn)
這篇文章主要介紹了基于opencv的selenium滑動(dòng)驗(yàn)證碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07python?tornado協(xié)程調(diào)度原理示例解析
這篇文章主要為大家介紹了python?tornado協(xié)程調(diào)度原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09使用python+Pyqt5實(shí)現(xiàn)串口調(diào)試助手
這篇文章主要介紹了使用python+Pyqt5實(shí)現(xiàn)串口調(diào)試助手,串口通訊程序首先要對(duì)串口進(jìn)行設(shè)置,如波特率、數(shù)據(jù)位、停止位、校驗(yàn)位等,需要的朋友可以參考下2022-04-04linux下安裝python3和對(duì)應(yīng)的pip環(huán)境教程詳解
這篇文章主要介紹了linux下安裝python3和對(duì)應(yīng)的pip環(huán)境,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07幾個(gè)適合python初學(xué)者的簡(jiǎn)單小程序,看完受益匪淺!(推薦)
這篇文章主要介紹了幾個(gè)適合python初學(xué)者的簡(jiǎn)單小程序,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04Win7下Python與Tensorflow-CPU版開(kāi)發(fā)環(huán)境的安裝與配置過(guò)程
這篇文章主要介紹了Win7下Python與Tensorflow-CPU版安裝與配置心得,需要的朋友可以參考下2018-01-01Pandas常用的數(shù)據(jù)結(jié)構(gòu)和常用的數(shù)據(jù)分析技術(shù)
Pandas是Python中用于數(shù)據(jù)處理和分析的強(qiáng)大庫(kù),其最常用的數(shù)據(jù)結(jié)構(gòu)是Series和DataFrame。Series類(lèi)似于一維數(shù)組,可以表示一列數(shù)據(jù);DataFrame類(lèi)似于二維表格,可以表示多列數(shù)據(jù)2023-04-04