日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python面试常用二十题总结

發(fā)布時(shí)間:2024/7/5 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python面试常用二十题总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.請至少用一種方法下面字符串的反轉(zhuǎn)?

1).A[::-1]

2).交換前后字母的位置

t = list(A)

l = len(t)

for i, j inzip(range(l - 1, 0, -1), range(l // 2)):

??????? t[i], t[j] = t[j], t[i]

return"".join(t)

3). 遞歸的方式, 每次輸出一個(gè)字符

defstring_reverse3(string):?

??? if len(string) <= 1:?

??????? return string?

??? return string_reverse3(string[1:]) +string[0]

2.請手寫一個(gè)lambda函數(shù)

Sum = Lambda a,b:a+b

3.請手寫一個(gè)函數(shù),用來取出1—100(均包含)中9的倍數(shù)或者有數(shù)字9的所有整數(shù)

For I inxrange(1,101):

?????? If i%9 == 0 or “9” in str(I):

???????????? Print i

4.? Python里面如何實(shí)現(xiàn)tuple和list的轉(zhuǎn)換

直接用tuplelist函數(shù)

5.? Python里面match()和search()的區(qū)別?

re模塊中match(pattern,string[,flags]),檢查string的開頭是否與pattern匹配。

re模塊中research(pattern,string[,flags]),string搜索pattern的第一個(gè)匹配值。

6.請用至少一種方法刪除下面list里面的重復(fù)元素

1).A=list(set(A))

2).A =[1,2,3,4,5,1,5]

List = []

for i in A:

??? if I not in List:

??? ?????? List.append(i)

print List

?

7.請簡述python中單例模式的特點(diǎn),并手寫一個(gè)單例模式?

單例模式的要點(diǎn)有三個(gè);一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。

classSingleton(object):

__instance=None

def__init__(self):

?????? pass

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

?????? if Singleton.__instance is None:

???????????? Singleton.__instance=object.__new__(cls,*args,**kwd)

?????? return Singleton.__instance

8.請簡述值傳遞和引用傳遞的區(qū)別?

值傳遞僅僅傳遞的是值

引用傳遞,傳遞的是內(nèi)存地址,修改后會改變內(nèi)存地址對應(yīng)儲存的值。

9.請手寫一個(gè)匹配ip的正則表達(dá)式?

^(?:(?:1[0-9][0-9]\.)|(?:2[0-4][0-9]\.)|(?:25[0-5]\.)|(?:[1-9][0-9]\.)|(?:[0-9]\.)){3}(?:(?:1[0-9][0-9])|(?:2[0-4][0-9])|(?:25[0-5])|(?:[1-9][0-9])|(?:[0-9]))$

^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$'

10.mysql數(shù)據(jù)庫的優(yōu)化?

1. 優(yōu)化索引、SQL 語句、分析慢查詢;

2. 設(shè)計(jì)表的時(shí)候嚴(yán)格根據(jù)數(shù)據(jù)庫的設(shè)計(jì)范式來設(shè)計(jì)數(shù)據(jù)庫;

3. 使用緩存,把經(jīng)常訪問到的數(shù)據(jù)而且不需要經(jīng)常變化的數(shù)據(jù)放在緩存中,能節(jié)約磁盤IO

4. 優(yōu)化硬件;采用SSD,使用磁盤隊(duì)列技術(shù)(RAID0,RAID1,RDID5)等;

5. 采用MySQL 內(nèi)部自帶的表分區(qū)技術(shù),把數(shù)據(jù)分層不同的文件,能夠提高磁盤的讀取效率;

6. 垂直分表;把一些不經(jīng)常讀的數(shù)據(jù)放在一張表里,節(jié)約磁盤I/O

7. 主從分離讀寫;采用主從復(fù)制把數(shù)據(jù)庫的讀操作和寫入操作分離開來;

8. 分庫分表分機(jī)器(數(shù)據(jù)量特別大),主要的的原理就是數(shù)據(jù)路由;

9. 選擇合適的表引擎,參數(shù)上的優(yōu)化;

10. 進(jìn)行架構(gòu)級別的緩存,靜態(tài)化和分布式;

11. 不采用全文索引;

12. 采用更快的存儲方式,例如NoSQL存儲經(jīng)常訪問的數(shù)

?

11.進(jìn)程間通信(IPC)有那些方式?

1.??? 管道(Pipe):管道可用于具有親緣關(guān)系進(jìn)程間的通信,允許一個(gè)進(jìn)程和另一個(gè)與它有共同祖先的進(jìn)程之間進(jìn)行通信。

2.??? 命名管道(named pipe):命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關(guān)系進(jìn)程間的通信。命名管道在文件系統(tǒng)中有對應(yīng)的文件名。命名管道通過命令mkfifo或系統(tǒng)調(diào)用mkfifo來創(chuàng)建。

3.??? 信號(Signal):信號是比較復(fù)雜的通信方式,用于通知接受進(jìn)程有某種事件發(fā)生,除了用于進(jìn)程間通信外,進(jìn)程還可以發(fā)送信號給進(jìn)程本身;linux除了支持Unix早期信號語義函數(shù)sigal外,還支持語義符合Posix.1標(biāo)準(zhǔn)的信號函數(shù)sigaction(實(shí)際上,該函數(shù)是基于BSD的,BSD為了實(shí)現(xiàn)可靠信號機(jī)制,又能夠統(tǒng)一對外接口,用sigaction函數(shù)重新實(shí)現(xiàn)了signal函數(shù))。

4.??? 消息(Message)隊(duì)列:消息隊(duì)列是消息的鏈接表,包括Posix消息隊(duì)列system V消息隊(duì)列。有足夠權(quán)限的進(jìn)程可以向隊(duì)列中添加消息,被賦予讀權(quán)限的進(jìn)程則可以讀走隊(duì)列中的消息。消息隊(duì)列克服了信號承載信息量少,管道只能承載無格式字節(jié)流以及緩沖區(qū)大小受限等缺

5.??? 共享內(nèi)存:使得多個(gè)進(jìn)程可以訪問同一塊內(nèi)存空間,是最快的可用IPC形式。是針對其他通信機(jī)制運(yùn)行效率較低而設(shè)計(jì)的。往往與其它通信機(jī)制,如信號量結(jié)合使用,來達(dá)到進(jìn)程間的同步及互斥。

6.??? 內(nèi)存映射(mapped memory):內(nèi)存映射允許任何多個(gè)進(jìn)程間通信,每一個(gè)使用該機(jī)制的進(jìn)程通過把一個(gè)共享的文件映射到自己的進(jìn)程地址空間來實(shí)現(xiàn)它。

7.??? 信號量(semaphore):主要作為進(jìn)程間以及同一進(jìn)程不同線程之間的同步手段。

8.??? 套接口(Socket):更為一般的進(jìn)程間通信機(jī)制,可用于不同機(jī)器之間的進(jìn)程間通信。起初是由Unix系統(tǒng)的BSD分支開發(fā)出來的,但現(xiàn)在一般可以移植到其它類Unix系統(tǒng)上:LinuxSystem V的變種都支持套接字

?

12.簡述這兩個(gè)參數(shù)是什么意思:*args,**kwargs?我們?yōu)槭裁匆褂盟鼈?#xff1f;

*args 當(dāng)我們不知道要有多少個(gè)參數(shù)傳給函數(shù),或者我們想把一個(gè)列表或者tuple存起來以后傳給函數(shù)。

**kwargs當(dāng)我們不知道有多少個(gè)關(guān)鍵字參數(shù)要傳給函數(shù),或者我們想把字典存起來以后傳給函數(shù)

13.談?wù)勀銓ython多線程的理解?

Python多線程下,每個(gè)線程的執(zhí)行方式:

1、獲取GIL

2、執(zhí)行代碼直到sleep或者是python虛擬機(jī)將其掛起。

3、釋放GIL

1CPU密集型代碼(各種循環(huán)處理、計(jì)數(shù)等等),在這種情況下,由于計(jì)算工作多,ticks計(jì)數(shù)很快就會達(dá)到閾值,然后觸發(fā)GIL的釋放與再競爭(多個(gè)線程來回切換當(dāng)然是需要消耗資源的),所以python下的多線程對CPU密集型代碼并不友好。???????

2IO密集型代碼(文件處理、網(wǎng)絡(luò)爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會進(jìn)行IO等待,造成不必要的時(shí)間浪費(fèi),而開啟多線程能在線程A等待時(shí),自動切換到線程B,可以不浪費(fèi)CPU的資源,從而能提升程序執(zhí)行效率)。所以python的多線程對IO密集型代碼比較友好。

而在python3.x中,GIL不使用ticks計(jì)數(shù),改為使用計(jì)時(shí)器(執(zhí)行時(shí)間達(dá)到閾值后,當(dāng)前線程釋放GIL),這樣對CPU密集型程序更加友好,但依然沒有解決GIL導(dǎo)致的同一時(shí)間只能執(zhí)行一個(gè)線程的問題,所以效率依然不盡如人意。??????? ?????????????????????????

多核多線程比單核多線程更差,原因是單核下多線程,每次釋放GIL,喚醒的那個(gè)線程都能獲取到GIL鎖,所以能夠無縫執(zhí)行,但多核下,CPU0釋放GIL后,其他CPU上的線程都會進(jìn)行競爭,但GIL可能會馬上又被CPU0拿到,導(dǎo)致其他幾個(gè)CPU上被喚醒后的線程會醒著等待到切換時(shí)間后又進(jìn)入待調(diào)度狀態(tài),這樣會造成線程顛簸(thrashing),導(dǎo)致效率更低。

14.redis中的事務(wù)和mysql中的事務(wù)有什么區(qū)別?

1、Redis中的事務(wù)(transaction)是一組命令的集合。事務(wù)同命令一樣都是Redis最小的執(zhí)行單位,一個(gè)事務(wù)中的命令要么都執(zhí)行,要么都不執(zhí)行。Redis事務(wù)的實(shí)現(xiàn)需要用到?MULTI??EXEC?兩個(gè)命令,事務(wù)開始的時(shí)候先向Redis服務(wù)器發(fā)送?MULTI?命令,然后依次發(fā)送需要在本次事務(wù)中處理的命令,最后再發(fā)送?EXEC?命令表示事務(wù)命令結(jié)束。

2、mysql的事務(wù)特性,要求這組操作,要不全都成功,要不全都失敗,這樣就避免了某個(gè)操作成功某個(gè)操作失敗。利于數(shù)據(jù)的安全

15.請簡述什么是三次握手和四次揮手?為什么要這樣?

建立連接的過程是利用客戶服務(wù)器模式,假設(shè)主機(jī)A為客戶端,主機(jī)B為服務(wù)器端。

1TCP的三次握手過程:主機(jī)AB發(fā)送連接請求;主機(jī)B對收到的主機(jī)A的報(bào)文段進(jìn)行確認(rèn);主機(jī)A再次對主機(jī)B的確認(rèn)進(jìn)行確認(rèn)。

2)采用三次握手是為了防止失效的連接請求報(bào)文段突然又傳送到主機(jī)B,因而產(chǎn)生錯(cuò)誤。失效的連接請求報(bào)文段是指:主機(jī)A發(fā)出的連接請求沒有收到主機(jī)B的確認(rèn),于是經(jīng)過一段時(shí)間后,主機(jī)A又重新向主機(jī)B發(fā)送連接請求,且建立成功,順序完成數(shù)據(jù)傳輸。考慮這樣一種特殊情況,主機(jī)A第一次發(fā)送的連接請求并沒有丟失,而是因?yàn)榫W(wǎng)絡(luò)節(jié)點(diǎn)導(dǎo)致延遲達(dá)到主機(jī)B,主機(jī)B以為是主機(jī)A又發(fā)起的新連接,于是主機(jī)B同意連接,并向主機(jī)A發(fā)回確認(rèn),但是此時(shí)主機(jī)A根本不會理會,主機(jī)B就一直在等待主機(jī)A發(fā)送數(shù)據(jù),導(dǎo)致主機(jī)B的資源浪費(fèi)。

3)采用兩次握手不行,原因就是上面說的失效的連接請求的特殊情況,因此采用三次握手剛剛好,兩次可能出現(xiàn)失效,四次甚至更多次則沒必要,反而復(fù)雜了。

四次揮手:

先由客戶端向服務(wù)器端發(fā)送一個(gè)FIN,請求關(guān)閉數(shù)據(jù)傳輸。

當(dāng)服務(wù)器接收到客戶端的FIN時(shí),向客戶端發(fā)送一個(gè)ACK,其中ack的值等于FIN+SEQ

然后服務(wù)器向客戶端發(fā)送一個(gè)FIN,告訴客戶端應(yīng)用程序關(guān)閉。

當(dāng)客戶端收到服務(wù)器端的FIN是,回復(fù)一個(gè)ACK給服務(wù)器端。其中ack的值等于FIN+SEQ

為什么要4次揮手?

確保數(shù)據(jù)能夠完成傳輸

16.python是如何進(jìn)行內(nèi)存管理的?

一、垃圾回收:python不像C++Java等語言一樣,他們可以不用事先聲明變量類型而直接對變量進(jìn)行賦值。對Python語言來講,對象的類型和內(nèi)存都是在運(yùn)行時(shí)確定的。這也是為什么我們稱Python語言為動態(tài)類型的原因(這里我們把動態(tài)類型可以簡單的歸結(jié)為對變量內(nèi)存地址的分配是在運(yùn)行時(shí)自動判斷變量類型并對變量進(jìn)行賦值)。

二、引用計(jì)數(shù):Python采用了類似Windows內(nèi)核對象一樣的方式來對內(nèi)存進(jìn)行管理。每一個(gè)對象,都維護(hù)這一個(gè)對指向該對對象的引用的計(jì)數(shù)。當(dāng)變量被綁定在一個(gè)對象上的時(shí)候,該變量的引用計(jì)數(shù)就是1(還有另外一些情況也會導(dǎo)致變量引用計(jì)數(shù)的增加),系統(tǒng)會自動維護(hù)這些標(biāo)簽,并定時(shí)掃描,當(dāng)某標(biāo)簽的引用計(jì)數(shù)變?yōu)?/span>0的時(shí)候,該對就會被回收。

三、內(nèi)存池機(jī)制Python的內(nèi)存機(jī)制以金字塔行,-1-2層主要有操作系統(tǒng)進(jìn)行操作,

  第0層是C中的mallocfree等內(nèi)存分配和釋放函數(shù)進(jìn)行操作;

  第1層和第2層是內(nèi)存池,有Python的接口函數(shù)PyMem_Malloc函數(shù)實(shí)現(xiàn),當(dāng)對象小于256K時(shí)有該層直接分配內(nèi)存;

  第3層是最上層,也就是我們對Python對象的直接操作;

C 中如果頻繁的調(diào)用 malloc free 時(shí),是會產(chǎn)生性能問題的.再加上頻繁的分配與釋放小塊的內(nèi)存會產(chǎn)生內(nèi)存碎片. Python 在這里主要干的工作有:

  如果請求分配的內(nèi)存在1~256字節(jié)之間就使用自己的內(nèi)存管理系統(tǒng),否則直接使用 malloc.

  這里還是會調(diào)用 malloc 分配內(nèi)存,但每次會分配一塊大小為256k的大塊內(nèi)存.

  經(jīng)由內(nèi)存池登記的內(nèi)存到最后還是會回收到內(nèi)存池,并不會調(diào)用 C free 釋放掉.以便下次使用.對于簡單的Python對象,例如數(shù)值、字符串,元組(tuple不允許被更改)采用的是復(fù)制的方式(深拷貝?),也就是說當(dāng)將另一個(gè)變量B賦值給變量A時(shí),雖然AB的內(nèi)存空間仍然相同,但當(dāng)A的值發(fā)生變化時(shí),會重新給A分配空間,AB的地址變得不再相同

17.談?wù)勀銓€程安全的理解?

線程安全是在多線程的環(huán)境下,能夠保證多個(gè)線程同時(shí)執(zhí)行時(shí)程序依舊運(yùn)行正確, 而且要保證對于共享的數(shù)據(jù)可以由多個(gè)線程存取,但是同一時(shí)刻只能有一個(gè)線程進(jìn)行存取。多線程環(huán)境下解決資源競爭問題的辦法是加鎖來保證存取操作的唯一性。

18.事務(wù)的特性?

1、原子性(Atomicity):事務(wù)中的全部操作在數(shù)據(jù)庫中是不可分割的,要么全部完成,要么均不執(zhí)行。

2、一致性(Consistency):幾個(gè)并行執(zhí)行的事務(wù),其執(zhí)行結(jié)果必須與按某一順序串行執(zhí)行的結(jié)果相一致。

3、隔離性(Isolation):事務(wù)的執(zhí)行不受其他事務(wù)的干擾,事務(wù)執(zhí)行的中間結(jié)果對其他事務(wù)必須是透明的。

4、持久性(Durability):對于任意已提交事務(wù),系統(tǒng)必須保證該事務(wù)對數(shù)據(jù)庫的改變不被丟失,即使數(shù)據(jù)庫出現(xiàn)故障

18.什么是阻塞,什么是非阻塞?

阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起。函數(shù)只有在得到結(jié)果之后才會返回。有人也許會把阻塞調(diào)用和同步調(diào)用等同起來,實(shí)際上他是不同的。對于同步調(diào)用來說,很多時(shí)候當(dāng)前線程還是激活的,只是從邏輯上當(dāng)前函數(shù)沒有返回而已。例如,我們在CSocket中調(diào)用Receive函數(shù),如果緩沖區(qū)中沒有數(shù)據(jù),這個(gè)函數(shù)就會一直等待,直到有數(shù)據(jù)才返回。而此時(shí),當(dāng)前線程還會繼續(xù)處理各種各樣的消息。如果主窗口和調(diào)用函數(shù)在同一個(gè)線程中,除非你在特殊的界面操作函數(shù)中調(diào)用,其實(shí)主界面還是應(yīng)該可以刷新。socket接收數(shù)據(jù)的另外一個(gè)函數(shù)recv則是一個(gè)阻塞調(diào)用的例子。當(dāng)socket工作在阻塞模式的時(shí)候,如果沒有數(shù)據(jù)的情況下調(diào)用該函數(shù),則當(dāng)前線程就會被掛起,直到有數(shù)據(jù)為止。

非阻塞和阻塞的概念相對應(yīng),指在不能立刻得到結(jié)果之前,該函數(shù)不會阻塞當(dāng)前線程,而會立刻返回。

對象的阻塞模式和阻塞函數(shù)調(diào)用。對象是否處于阻塞模式和函數(shù)是不是阻塞調(diào)用有很強(qiáng)的相關(guān)性,但是并不是一一對應(yīng)的。阻塞對象上可以有非阻塞的調(diào)用方式,我們可以通過一定的API去輪詢狀態(tài),在適當(dāng)?shù)臅r(shí)候調(diào)用阻塞函數(shù),就可以避免阻塞。而對于非阻塞對象,調(diào)用特殊的函數(shù)也可以進(jìn)入阻塞調(diào)用。函數(shù)select就是這樣的一個(gè)例子。

19.父子進(jìn)程間有哪些異同,是否共享數(shù)據(jù)?(共享哪些數(shù)據(jù)?)

子進(jìn)程會復(fù)制父進(jìn)程所有可寫的資源,包括:

堆、棧、數(shù)據(jù)段、未初始化數(shù)據(jù)段、打開的文件描述符、信號安裝過的 handler、共享庫、ipc(共享內(nèi)存、消息隊(duì)列、信號量)。注意未決信號不會繼承過來, 新進(jìn)程會重置它的未決信號鏈;

子進(jìn)程和父進(jìn)程共享:

所有只讀的資源都不用復(fù)制, 父子進(jìn)程共享, 包括正文段和字符串常量

子進(jìn)程不會從父進(jìn)程繼承:

進(jìn)程 id、各種鎖(內(nèi)存鎖、文件鎖)、定時(shí)器、未決信號

20.Mysql的常用引擎及選擇?

常用:InnoDB MyISAM

一、 InnoDB 支持事務(wù),MyISAM 不支持,這一點(diǎn)是非常之重要。事務(wù)是一種高級的處理方式,如在一些列增刪改中只要哪個(gè)出錯(cuò)還可以回滾還原,而 MyISAM就不可以了;

二、MyISAM 適合查詢以及插入為主的應(yīng)用,InnoDB適合頻繁修改以及涉及到安全性較高的應(yīng)用;

三、InnoDB 支持外鍵,MyISAM 不支持;

四、MyISAM 是默認(rèn)引擎,InnoDB需要指定;

五、InnoDB 不支持 FULLTEXT 類型的索引;

六、InnoDB 中不保存表的行數(shù),如select count(*) from table 時(shí),InnoDB;需要掃描一遍整個(gè)表來計(jì)算有多少行,但是 MyISAM 只要簡單的讀出保存好的行數(shù)即可。注意的是,當(dāng) count(*)語句包含 where 條件時(shí) MyISAM 也需要掃描整個(gè)表;

七、對于自增長的字段,InnoDB中必須包含只有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯(lián)合索引;

八、清空整個(gè)表時(shí),InnoDB是一行一行的刪除,效率非常慢。MyISAM則會重

建表;

九、InnoDB 支持行鎖(某些情況下還是鎖整表,如update table set a=1 where user like '%lee%'

總結(jié)

以上是生活随笔為你收集整理的Python面试常用二十题总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。