這篇文章主要講解了“Python經(jīng)典面試題有哪些”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Python經(jīng)典面試題有哪些”吧!
創(chuàng)新互聯(lián)公司服務(wù)項目包括沈陽網(wǎng)站建設(shè)、沈陽網(wǎng)站制作、沈陽網(wǎng)頁制作以及沈陽網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,沈陽網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到沈陽省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!Python面試題(一)之交換變量值
平時時不時會面面實習(xí)生,大多數(shù)的同學(xué)在學(xué)校里都已經(jīng)掌握了Python。面試的時候要求同學(xué)們實現(xiàn)一個簡單的函數(shù),交換兩個變量的值,大多數(shù)的同學(xué)給出的都是如下的答案
實際上,Python中還有更簡潔的更具Python風(fēng)格的實現(xiàn),如下
相比前一種方法,后一種方法節(jié)省一個中間變量,在性能上也優(yōu)于前一種方法。
我們從Python的字節(jié)碼來深入分析一下原因。
dis是個反匯編工具,將Python代碼翻譯成字節(jié)碼指令。這里的輸出如下
通過字節(jié)碼可以看到,swap1和swap2大的區(qū)別在于,swap1中通過ROT_TWO交換棧頂?shù)膬蓚€元素實現(xiàn)x和y值的互換,swap2中引入了tmp變量,多了一次LOAD_FAST, STORE_FAST的操作。執(zhí)行一個ROT_TWO指令比執(zhí)行一個LOAD_FAST+STORE_FAST的指令快,這也是為什么swap1比swap2性能更好的原因。
Python面試題(二) is 和 == 的區(qū)別
面試實習(xí)生的時候,當(dāng)問到 is 和 == 的區(qū)別時,很多同學(xué)都答不上來,搞不清兩者什么時候返回一致,什么時候返回不一致。本文我們來看一下這兩者的區(qū)別。
我們先來看幾個例子:
上面的輸出結(jié)果中為什么有的 is 和 == 的結(jié)果相同,有的不相同呢?我們來看下官方文檔中對于 is 和 == 的解釋。
官方文檔中說 is 表示的是對象標(biāo)示符是否一致,也就是比較兩個對象在內(nèi)存中的地址是否一樣,而 == 是用來檢查兩個對象是否相等。
我們在檢查 a is b 的時候,其實相當(dāng)于檢查 id(a) == id(b)。而檢查 a == b 的時候,實際是調(diào)用了對象 a 的 __eq()__ 方法,a == b 相當(dāng)于 a.__eq__(b)。
一般情況下,如果 a is b 返回True的話,即 a 和 b 指向同一塊內(nèi)存地址的話,a == b 也返回True,即 a 和 b 的值也相等。
好了,看明白上面的解釋后,我們來看下前面的幾個例子
打印出 id(a) 和 id(b) 后就很清楚了。只要 a 和 b 的值相等,a == b 就會返回True,而只有 id(a) 和 id(b) 相等時,a is b 才返回 True。
這里還有一個問題,為什么 a 和 b 都是 "hello" 的時候,a is b 返回True,而 a 和 b都是 "hello world" 的時候,a is b 返回False呢?
這是因為前一種情況下Python的字符串駐留機(jī)制起了作用。對于較小的字符串,為了提高系統(tǒng)性能Python會保留其值的一個副本,當(dāng)創(chuàng)建新的字符串的時候直接指向該副本即可。所以 "hello" 在內(nèi)存中只有一個副本,a 和 b 的 id 值相同,而 "hello world" 是長字符串,不駐留內(nèi)存,Python中各自創(chuàng)建了對象來表示 a 和 b,所以他們的值相同但 id 值不同。
同學(xué)指出:intern機(jī)制和字符串長短無關(guān),在交互模式下,每行字符串字面量都會申請一個新字符串,但是只含大小寫字母、數(shù)字和下劃線的會被intern,也就是維護(hù)了一張dict來使得這些字符串全局唯一)
總結(jié)一下,is 是檢查兩個對象是否指向同一塊內(nèi)存空間,而 == 是檢查他們的值是否相等??梢钥闯?,is 是比 == 更嚴(yán)格的檢查,is 返回True表明這兩個對象指向同一塊內(nèi)存,值也一定相同。
看到這里,大家是不是搞懂了 is 和 == 的區(qū)別呢?
那我們深入一步來思考一下下面這個問題:
Python里和None比較時,為什么是 is None 而不是 == None 呢?
伙伴們會的可以在評論區(qū)留言哦~!
Python面試題(三)可變對象和不可變對象
上一個面試題:Python面試之 is 和 == 的區(qū)別的最后留了一個問題:
Python里和None比較時,為什么是 is None 而不是 == None 呢?
這是因為None在Python里是個單例對象,一個變量如果是None,它一定和None指向同一個內(nèi)存地址。而 == None背后調(diào)用的是__eq__,而__eq__可以被重載,下面是一個 is not None但 == None的例子
Python中有可變對象和不可變對象之分。可變對象創(chuàng)建后可改變但地址不會改變,即變量指向的還是原來的變量;不可變對象創(chuàng)建之后便不能改變,如果改變則會指向一個新的對象。
Python中dict、list是可變對象,str、int、tuple、float是不可變對象。
來看一個字符串的例子
上面的例子里,修改a指向的對象的值會導(dǎo)致拋出異常。
執(zhí)行 a = a + " world"時,先計算等號右邊的表達(dá)式,生成一個新的對象賦值到變量a,因此a指向的對象發(fā)生了改變,id(a) 的值也與原先不同。
再來看一個列表的例子
上面對a修改元素、添加元素,變量a還是指向原來的對象。
將a賦值給b后,變量b和a都指向同一個對象,因此修改b的元素值也會影響a。
變量c是對b的切片操作的返回值,切片操作相當(dāng)于淺拷貝,會生成一個新的對象,因此c指向的對象不再是b所指向的對象,對c的操作不會改變b的值。
理解了上面不可變對象和可變對象的區(qū)別后,我們再來看一個有趣的問題
明明group1和group2是不同的對象(id值不同),為什么調(diào)用group2的add_member方法會影響group1的members?
其中的奧妙就在于__init__函數(shù)的第二個參數(shù)是默認(rèn)參數(shù),默認(rèn)參數(shù)的默認(rèn)值在函數(shù)創(chuàng)建的時候就生成了,每次調(diào)用都是用了這個對象的緩存。我們檢查id(group1.mebers)和id(group2.members),可以發(fā)現(xiàn)他們是相同的
print(id(group1.members)) # 輸出 140127132522040
print(id(group2.members)) # 輸出 140127132522040
所以,group1.members和group2.members指向了同一個對象,對group2.members的修改也會影響group1.members。
感謝各位的閱讀,以上就是“Python經(jīng)典面試題有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Python經(jīng)典面試題有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
名稱欄目:Python經(jīng)典面試題有哪些-創(chuàng)新互聯(lián)
瀏覽路徑:http://www.rwnh.cn/article18/cegogp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、面包屑導(dǎo)航、網(wǎng)站設(shè)計、網(wǎng)站設(shè)計公司、網(wǎng)站導(dǎo)航、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容