激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語(yǔ)言編程技術(shù)及教程分享平臺(tái)!
分類(lèi)導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - Python程序員面試題 你必須提前準(zhǔn)備!(答案及解析)

Python程序員面試題 你必須提前準(zhǔn)備!(答案及解析)

2021-01-08 00:05水木華章 Python

這篇文章主要為大家解析了你必須提前準(zhǔn)備的Python程序員面試題答案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

在發(fā)布《Python程序員面試,這些問(wèn)題你必須提前準(zhǔn)備!》一文后,應(yīng)廣大程序員朋友的強(qiáng)烈要求,小編就Python程序員面試必備問(wèn)題整理了一份參考答案,希望能對(duì)準(zhǔn)備換工作的程序員朋友有所幫助。如對(duì)答案有疑問(wèn),歡迎留言討論。

小編將這些面試問(wèn)題大致分為四類(lèi):

什么(what)?如何做(how)?說(shuō)區(qū)別/談優(yōu)勢(shì)(difference)以及實(shí)踐操作(practice)。

What?

1. 什么是Python?

Python是一種編程語(yǔ)言,它有對(duì)象、模塊、線程、異常處理和自動(dòng)內(nèi)存管理。可以加入與其他語(yǔ)言的對(duì)比。下面是回答這一問(wèn)題的幾個(gè)關(guān)鍵點(diǎn):

a. Python是一種解釋型語(yǔ)言,python代碼在運(yùn)行之前不需要編譯。

b. Python是動(dòng)態(tài)類(lèi)型語(yǔ)言,在聲明變量時(shí),不需要說(shuō)明變量的類(lèi)型。

c. Python適合面向?qū)ο蟮木幊蹋驗(yàn)樗С滞ㄟ^(guò)組合與繼承的方式定義類(lèi)。

d. 在Python語(yǔ)言中,函數(shù)是第一類(lèi)對(duì)象。

e. Python代碼編寫(xiě)快,但是運(yùn)行速度比編譯語(yǔ)言通常要慢。

f. Python用途廣泛,常被用作“膠水語(yǔ)言”,可幫助其他語(yǔ)言和組件改善運(yùn)行狀況。

g. 使用Python,程序員可以專(zhuān)注于算法和數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),而不用處理底層的細(xì)節(jié)。

2. 什么是Python自省?

python自省是python具有的一種能力,使程序員面向?qū)ο蟮恼Z(yǔ)言所寫(xiě)的程序在運(yùn)行時(shí),能夠獲得對(duì)象的類(lèi)python型。Python是一種解釋型語(yǔ)言。為程序員提供了極大的靈活性和控制力。

3. 什么是PEP 8?

PEP8是一種編程規(guī)范,內(nèi)容是一些關(guān)于如何讓你的程序更具可讀性的建議。

4. 什么是pickling和unpickling?

Pickle模塊讀入任何Python對(duì)象,將它們轉(zhuǎn)換成字符串,然后使用dump函數(shù)將其轉(zhuǎn)儲(chǔ)到一個(gè)文件中——這個(gè)過(guò)程叫做pickling。反之從存儲(chǔ)的字符串文件中提取原始Python對(duì)象的過(guò)程,叫做unpickling。

5. 什么是Python裝飾器?

Python裝飾器是Python中的特有變動(dòng),可以使修改函數(shù)變得更容易。

6. 什么是Python的命名空間?

在Python中,所有的名字都存在于一個(gè)空間中,它們?cè)谠摽臻g中存在和被操作——這就是命名空間。它就好像一個(gè)盒子,每一個(gè)變量名字都對(duì)應(yīng)裝著一個(gè)對(duì)象。當(dāng)查詢(xún)變量的時(shí)候,會(huì)從該盒子里面尋找相應(yīng)的對(duì)象。

7. 什么是字典推導(dǎo)式和列表推導(dǎo)式?

它們是可以輕松創(chuàng)建字典和列表的語(yǔ)法結(jié)構(gòu)。

8. Lambda函數(shù)是什么?

這是一個(gè)常被用于代碼中的單個(gè)表達(dá)式的匿名函數(shù)。

9. *args,**kwargs?參數(shù)是什么?

如果我們不確定要往函數(shù)中傳入多少個(gè)參數(shù),或者我們想往函數(shù)中以列表和元組的形式傳參數(shù)時(shí),那就使要用*args;如果我們不知道要往函數(shù)中傳入多少個(gè)關(guān)鍵詞參數(shù),或者想傳入字典的值作為關(guān)鍵詞參數(shù)時(shí),那就要使用**kwargs。

10. 什么是Pass語(yǔ)句?

Pass是一個(gè)在Python中不會(huì)被執(zhí)行的語(yǔ)句。在復(fù)雜語(yǔ)句中,如果一個(gè)地方需要暫時(shí)被留白,它常常被用于占位符。

11. unittest是什么?

在Python中,unittest是Python中的單元測(cè)試框架。它擁有支持共享搭建、自動(dòng)測(cè)試、在測(cè)試中暫停代碼、將不同測(cè)試迭代成一組,等等的功能。

11. 構(gòu)造器是什么?

構(gòu)造器是實(shí)現(xiàn)迭代器的一種機(jī)制。它功能的實(shí)現(xiàn)依賴(lài)于yield表達(dá)式,除此之外它跟普通的函數(shù)沒(méi)有兩樣。

12. doc string是什么?

Python中文檔字符串被稱(chēng)為docstring,它在Python中的作用是為函數(shù)、模塊和類(lèi)注釋生成文檔。

13. 負(fù)索引是什么?

Python中的序列索引可以是正也可以是負(fù)。如果是正索引,0是序列中的第一個(gè)索引,1是第二個(gè)索引。如果是負(fù)索引,(-1)是最后一個(gè)索引而(-2)是倒數(shù)第二個(gè)索引。

14. 模塊和包是什么?

在Python中,模塊是搭建程序的一種方式。每一個(gè)Python代碼文件都是一個(gè)模塊,并可以引用其他的模塊,比如對(duì)象和屬性。

一個(gè)包含許多Python代碼的文件夾是一個(gè)包。一個(gè)包可以包含模塊和子文件夾。

15. 垃圾回收是什么?

在Python中,為了解決內(nèi)存泄露問(wèn)題,采用了對(duì)象引用計(jì)數(shù),并基于引用計(jì)數(shù)實(shí)現(xiàn)自動(dòng)垃圾回收。

16. CSRF是什么?

CSRF是偽造客戶(hù)端請(qǐng)求的一種攻擊,CSRF的英文全稱(chēng)是Cross Site Request Forgery,字面上的意思是跨站點(diǎn)偽造請(qǐng)求。

How?

1. 如何讓你的程序更具可讀性?

適當(dāng)?shù)丶尤敕乔皩?dǎo)空格,適當(dāng)?shù)目招幸约耙恢碌拿?/p>

2. Python是如何被解釋的?

Python是一種解釋性語(yǔ)言,它的源代碼可以直接運(yùn)行。Python解釋器會(huì)將源代碼轉(zhuǎn)換成中間語(yǔ)言,之后再翻譯成機(jī)器碼再執(zhí)行。

3. 如何在Python中拷貝一個(gè)對(duì)象?

如果要在Python中拷貝一個(gè)對(duì)象,大多時(shí)候你可以用copy.copy()或者copy.deepcopy()。但并不是所有的對(duì)象都可以被拷貝。

4. 如何用Python刪除一個(gè)文件?

使用函數(shù)os.remove("file")

5. 如何將一個(gè)數(shù)字轉(zhuǎn)換成一個(gè)字符串?

你可以使用自帶函數(shù)str()將一個(gè)數(shù)字轉(zhuǎn)換為字符串。如果你想要八進(jìn)制或者十六進(jìn)制數(shù),可以用oct()或hex()。

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

Python的內(nèi)存管理是由私有heap空間管理的。所有的Python對(duì)象和數(shù)據(jù)結(jié)構(gòu)都在一個(gè)私有heap中。程序員沒(méi)有訪問(wèn)該heap的權(quán)限,只有解釋器才能對(duì)它進(jìn)行操作。為Python的heap空間分配內(nèi)存是由Python的內(nèi)存管理模塊進(jìn)行的,其核心API會(huì)提供一些訪問(wèn)該模塊的方法供程序員使用。Python有自帶的垃圾回收系統(tǒng),它回收并釋放沒(méi)有被使用的內(nèi)存,讓它們能夠被其他程序使用。

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

以list作為參數(shù)將tuple類(lèi)初始化,將返回tuple類(lèi)型

以tuple作為參數(shù)將list類(lèi)初始化,將返回list類(lèi)型

8. Python里面如何生成隨機(jī)數(shù)?

在python中用于生成隨機(jī)數(shù)的模塊是random,在使用前需要import. 如下例子可以酌情列舉:

random.random():生成一個(gè)0-1之間的隨機(jī)浮點(diǎn)數(shù)

random.uniform(a, b):生成[a,b]之間的浮點(diǎn)數(shù)

random.randint(a, b):生成[a,b]之間的整數(shù)

random.randrange(a, b, step):在指定的集合[a,b)中,以step為基數(shù)隨機(jī)取一個(gè)數(shù)

random.choice(sequence):從特定序列中隨機(jī)取一個(gè)元素,這里的序列可以是字符串,列表,元組等

9. 如何在一個(gè)function里面設(shè)置一個(gè)全局的變量

如果要給全局變量在一個(gè)函數(shù)里賦值,必須使用global語(yǔ)句。global VarName的表達(dá)式會(huì)告訴Python, VarName是一個(gè)全局變量,這樣Python就不會(huì)在局部命名空間里尋找這個(gè)變量了

10. Python如何實(shí)現(xiàn)單例模式?其他23種設(shè)計(jì)模式python如何實(shí)現(xiàn)?

單例模式主要有四種方法:__new__、共享屬性、裝飾器、import。

其他23種設(shè)計(jì)模式可基本分為創(chuàng)建型、結(jié)構(gòu)型和行為型模式。

創(chuàng)建模式,提供實(shí)例化的方法,為適合的狀況提供相應(yīng)的對(duì)象創(chuàng)建方法。

結(jié)構(gòu)化模式,通常用來(lái)處理實(shí)體之間的關(guān)系,使得這些實(shí)體能夠更好地協(xié)同工作。

行為模式,用于在不同的實(shí)體建進(jìn)行通信,為實(shí)體之間的通信提供更容易,更靈活的通信方法。

各模式的實(shí)現(xiàn)可根據(jù)其特點(diǎn)編寫(xiě)代碼(限于篇幅,此處不做示例)

11. 如何判斷單向鏈表中是否有環(huán)

首先遍歷鏈表,尋找是否有相同地址,借此判斷鏈表中是否有環(huán)。如果程序進(jìn)入死循環(huán),則需要一塊空間來(lái)存儲(chǔ)指針,遍歷新指針時(shí)將其和儲(chǔ)存的舊指針比對(duì),若有相同指針,則該鏈表有環(huán),否則將這個(gè)新指針存下來(lái)后繼續(xù)往下讀取,直到遇見(jiàn)NULL,這說(shuō)明這個(gè)鏈表無(wú)環(huán)。

12. 如何遍歷一個(gè)內(nèi)部未知的文件夾?

常用的有以下這幾種辦法:os.path.walk(),os.walk(),listdir

13. mysql數(shù)據(jù)庫(kù)如何分區(qū)、分表?

分表可以通過(guò)三種方式:mysql集群、自定義規(guī)則和merge存儲(chǔ)引擎。

分區(qū)有四類(lèi):

RANGE 分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。

LIST 分區(qū):類(lèi)似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇。

HASH分區(qū):基于用戶(hù)定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。

KEY 分區(qū):類(lèi)似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL 服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。

14. 如何對(duì)查詢(xún)命令進(jìn)行優(yōu)化?

a. 應(yīng)盡量避免全表掃描,首先應(yīng)考慮在 where 及 order by 涉及的列上建立索。

b. 應(yīng)盡量避免在 where 子句中對(duì)字段進(jìn)行 null 值判斷,避免使用!=或<>操作符,避免使用 or 連接條件,或在where子句中使用參數(shù)、對(duì)字段進(jìn)行表達(dá)式或函數(shù)操作,否則會(huì)導(dǎo)致權(quán)標(biāo)掃描

c. 不要在 where 子句中的“=”左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算,否則系統(tǒng)將可能無(wú)法正確使用索引。

d. 使用索引字段作為條件時(shí),如果該索引是復(fù)合索引,那么必須使用到該索引中的第一個(gè)字段作為條件時(shí)才能保證系統(tǒng)使用該索引,否則該索引將不會(huì)被使用。

e. 很多時(shí)候可考慮用 exists 代替 in

f. 盡量使用數(shù)字型字段

g. 盡可能的使用 varchar/nvarchar 代替 char/nchar

h. 任何地方都不要使用 select * from t ,用具體的字段列表代替“*”,不要返回用不到的任何字段。

i. 盡量使用表變量來(lái)代替臨時(shí)表。

j. 避免頻繁創(chuàng)建和刪除臨時(shí)表,以減少系統(tǒng)表資源的消耗。

k. 盡量避免使用游標(biāo),因?yàn)橛螛?biāo)的效率較差。

l. 在所有的存儲(chǔ)過(guò)程和觸發(fā)器的開(kāi)始處設(shè)置 SET NOCOUNT ON ,在結(jié)束時(shí)設(shè)置 SET NOCOUNT OFF

m. 盡量避免大事務(wù)操作,提高系統(tǒng)并發(fā)能力。

n. 盡量避免向客戶(hù)端返回大數(shù)據(jù)量,若數(shù)據(jù)量過(guò)大,應(yīng)該考慮相應(yīng)需求是否合理。

15. 如何理解開(kāi)源?

開(kāi)源,即開(kāi)放源代碼。開(kāi)源誕生于軟件行業(yè),它不僅僅代表軟件源代碼的開(kāi)放,本身即意味著自由、共享和充分利用資源。開(kāi)源是一種精神,是一種文化,如今已經(jīng)成為軟件業(yè)發(fā)展的大勢(shì)所趨。

16. 如何理解MVC/MTV框架?

MVC就是把Web應(yīng)用分為模型(M),控制器(C)和視圖(V)三層,他們之間以一種插件式的、松耦合的方式連接在一起。MTV模式本質(zhì)上和MVC是一樣的,也是為了各組件間保持松耦合關(guān)系,只是定義上有些許不同。

17. MSSQL的死鎖是如何產(chǎn)生的?

如下是死鎖產(chǎn)生的四個(gè)必要條件:

互斥條件:指進(jìn)程對(duì)所分配到的資源進(jìn)行排它性使用,即在一段時(shí)間內(nèi)某資源只由一個(gè)進(jìn)程占用。如果此時(shí)還有其它進(jìn)程請(qǐng)求資源,則請(qǐng)求者只能等待,直至占有資源的進(jìn)程用畢釋放。

請(qǐng)求和保持條件:指進(jìn)程已經(jīng)保持至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源已被其它進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程阻塞,但又對(duì)自己已獲得的其它資源保持不放。

不剝奪條件:指進(jìn)程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時(shí)由自己釋放。

環(huán)路等待條件:指在發(fā)生死鎖時(shí),必然存在一個(gè)進(jìn)程——資源的環(huán)形鏈,即進(jìn)程集合{P0,P1,P2,···,Pn}中的P0正在等待一個(gè)P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源。

18. Sql注入是如何產(chǎn)生的,如何防止?

程序開(kāi)發(fā)過(guò)程中不注意規(guī)范書(shū)寫(xiě)sql語(yǔ)句和對(duì)特殊字符進(jìn)行過(guò)濾,導(dǎo)致客戶(hù)端可以通過(guò)全局變量POST和GET提交一些sql語(yǔ)句正常執(zhí)行。產(chǎn)生Sql注入。下面是防止辦法:

a. 過(guò)濾掉一些常見(jiàn)的數(shù)據(jù)庫(kù)操作關(guān)鍵字,或者通過(guò)系統(tǒng)函數(shù)來(lái)進(jìn)行過(guò)濾。

b. 在PHP配置文件中將Register_globals=off;設(shè)置為關(guān)閉狀態(tài)

c. SQL語(yǔ)句書(shū)寫(xiě)的時(shí)候盡量不要省略小引號(hào)(tab鍵上面那個(gè))和單引號(hào)

d. 提高數(shù)據(jù)庫(kù)命名技巧,對(duì)于一些重要的字段根據(jù)程序的特點(diǎn)命名,取不易被猜到的

e. 對(duì)于常用的方法加以封裝,避免直接暴漏SQL語(yǔ)句

f. 開(kāi)啟PHP安全模式:Safe_mode=on;

g. 打開(kāi)magic_quotes_gpc來(lái)防止SQL注入

h. 控制錯(cuò)誤信息:關(guān)閉錯(cuò)誤提示信息,將錯(cuò)誤信息寫(xiě)到系統(tǒng)日志。

i. 使用mysqli或pdo預(yù)處理。

19. xxs如何預(yù)防?

XSS漏洞難以檢測(cè),但是為了WEB安全仍需要盡力避免:

針對(duì)反射型和存儲(chǔ)型XSS,需要服務(wù)端和前端共同預(yù)防,針對(duì)用戶(hù)輸入的數(shù)據(jù)做解析和轉(zhuǎn)義,對(duì)于前端開(kāi)發(fā)而言,則是善于使用escape,針對(duì)data URI內(nèi)容做正則判斷,禁止用戶(hù)輸入非顯示信息。

對(duì)于DOM XSS,由于造成XSS的原因在于用戶(hù)的輸入,因此在前端,需要特別注意用戶(hù)輸入源,并對(duì)可能造成的XSS的操作需要進(jìn)行字串轉(zhuǎn)義。

20. 如何生成共享秘鑰? 如何防范中間人攻擊?

密鑰的生成是通過(guò)使用全局配置命令完成的:對(duì)于不可輸出密鑰是<crypto key generate rsa label {label string},而對(duì)于可輸出密鑰則是<crypto key generate rsa exportable label {label string}>。標(biāo)記(label)是可選擇的;如果沒(méi)有指定標(biāo)記,那么密鑰名稱(chēng)將是hostname.domain-name。

對(duì)于中間人的攻擊,可以采用如下防范手段:

a. 通過(guò)采用動(dòng)態(tài)ARP檢測(cè)、DHCP Snooping等控制操作來(lái)加強(qiáng)網(wǎng)絡(luò)基礎(chǔ)設(shè)施

b. 采用傳輸加密

c. 使用CASBs(云訪問(wèn)安全代理)

d. 創(chuàng)建RASP(實(shí)時(shí)應(yīng)用程序自我保護(hù))

e. 阻止自簽名證書(shū)

f. 強(qiáng)制使用SSL pinning

g.  安裝DAM(數(shù)據(jù)庫(kù)活動(dòng)監(jiān)控)

21. 如何管理不同版本的代碼?

進(jìn)行版本管理。可舉例告知如何使用Git(或是其他工具)進(jìn)行追蹤。

Difference

1. 數(shù)組和元組之間的區(qū)別?

數(shù)組在python中叫作列表。列表可以修改,而元組不可以修改,如果元組中僅有一個(gè)元素,則要在元素后加上逗號(hào)。元組和列表的查詢(xún)方式一樣。元組只可讀不可修改,如果程序中的數(shù)據(jù)不允許修改可用元組。

2. _new_和_init_的區(qū)別?

__init__是當(dāng)實(shí)例對(duì)象創(chuàng)建完成后被調(diào)用的,然后設(shè)置對(duì)象屬性的一些初始值。

__new__是在實(shí)例創(chuàng)建之前被調(diào)用的,因?yàn)樗娜蝿?wù)就是創(chuàng)建實(shí)例然后返回該實(shí)例,是個(gè)靜態(tài)方法。

也就是,__new__在__init__之前被調(diào)用,__new__的返回值(實(shí)例)將傳遞給__init__方法的第一個(gè)參數(shù),然后__init__給這個(gè)實(shí)例設(shè)置一些參數(shù)。

3. Python中單下劃線和雙下劃綫的區(qū)別?

"單下劃線" 開(kāi)始的成員變量叫做保護(hù)變量,意思是只有類(lèi)對(duì)象和子類(lèi)對(duì)象自己能訪問(wèn)到這些變量;

"雙下劃線" 開(kāi)始的是私有成員,意思是只有類(lèi)對(duì)象自己能訪問(wèn),連子類(lèi)對(duì)象也不能訪問(wèn)到這個(gè)數(shù)據(jù)。

4. 淺拷貝與深拷貝的區(qū)別是?

在python中,對(duì)象賦值實(shí)際上是對(duì)象的引用。淺拷貝,沒(méi)有拷貝子對(duì)象,所以原始數(shù)據(jù)改變,子對(duì)象會(huì)改變,而深拷貝,包含對(duì)象里面的自對(duì)象的拷貝,所以原始對(duì)象的改變不會(huì)造成深拷貝里任何子元素的改變。

5. 使用裝飾器的單例和使用其他方法的單例,在后續(xù)使用中,有何區(qū)別?

Import方法改變了類(lèi)本身,new方法,但是只是把所有實(shí)例對(duì)象共享屬性,每次產(chǎn)生一個(gè)新對(duì)象。算作偽單例,共享屬性方法實(shí)例化了許多個(gè)相同屬性。所以,裝飾器方法最為實(shí)用。

6. 多進(jìn)程與多線程的區(qū)別?

a. 簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線程。

b. 線程的劃分尺度小于進(jìn)程,使得多線程程序的并發(fā)性高。

c. 另外,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線程共享內(nèi)存,從而極大地提高了程序的運(yùn)行效率。

d. 線程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的。每個(gè)獨(dú)立的線程有一個(gè)程序運(yùn)行的入口、順序執(zhí)行序列和程序的出口。但是線程不能夠獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制。

e. 從邏輯角度來(lái)看,多線程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行。但操作系統(tǒng)并沒(méi)有將多個(gè)線程看做多個(gè)獨(dú)立的應(yīng)用,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線程的重要區(qū)別。

7. select和epoll的區(qū)別?

a. select實(shí)現(xiàn)需要自己不斷輪詢(xún)所有fd集合,直到設(shè)備就緒,期間可能要睡眠和喚醒多次交替。而epoll其實(shí)也需要調(diào)用epoll_wait不斷輪詢(xún)就緒鏈表,期間也可能多次睡眠和喚醒交替,但是它是設(shè)備就緒時(shí),調(diào)用回調(diào)函數(shù),把就緒fd放入就緒鏈表中,并喚醒在epoll_wait中進(jìn)入睡眠的進(jìn)程。雖然都要睡眠和交替,但是select在“醒著”的時(shí)候要遍歷整個(gè)fd集合,而epoll在“醒著”的時(shí)候只要判斷一下就緒鏈表是否為空就行了,這節(jié)省了大量的CPU時(shí)間。

b. select每次調(diào)用都要把fd集合從用戶(hù)態(tài)往內(nèi)核態(tài)拷貝一次,并且要把current往設(shè)備等待隊(duì)列中掛一次,而epoll只要一次拷貝,而且把current往等待隊(duì)列上掛也只掛一次(在epoll_wait的開(kāi)始,注意這里的等待隊(duì)列并不是設(shè)備等待隊(duì)列,只是一個(gè)epoll內(nèi)部定義的等待隊(duì)列)。這也能節(jié)省不少的開(kāi)銷(xiāo)。

8. TCP和UDP的區(qū)別?邊緣觸發(fā)和水平觸發(fā)的區(qū)別?

a. 基本區(qū)別:

基于連接與無(wú)連接

TCP要求系統(tǒng)資源較多,UDP較少;

UDP程序結(jié)構(gòu)較簡(jiǎn)單

流模式(TCP)與數(shù)據(jù)報(bào)模式(UDP);

TCP保證數(shù)據(jù)正確性,UDP可能丟包

TCP保證數(shù)據(jù)順序,UDP不保證

b. 編程中的區(qū)別

socket()的參數(shù)不同

UDP Server不需要調(diào)用listen和accept

UDP收發(fā)數(shù)據(jù)用sendto/recvfrom函數(shù)

TCP:地址信息在connect/accept時(shí)確定

UDP:在sendto/recvfrom函數(shù)中每次均 需指定地址信息

UDP:shutdown函數(shù)無(wú)效

9. HTTP連接:get和post的區(qū)別?

GET請(qǐng)求,請(qǐng)求的數(shù)據(jù)會(huì)附加在URL之后,以?分割URL和傳輸數(shù)據(jù),多個(gè)參數(shù)用&連接。URL的編碼格式采用的是ASCII編碼,而不是uniclde,即是說(shuō)所有的非ASCII字符都要編碼之后再傳輸。

POST請(qǐng)求:POST請(qǐng)求會(huì)把請(qǐng)求的數(shù)據(jù)放置在HTTP請(qǐng)求包的包體中。上面的item=bandsaw就是實(shí)際的傳輸數(shù)據(jù)。

因此,GET請(qǐng)求的數(shù)據(jù)會(huì)暴露在地址欄中,而POST請(qǐng)求則不會(huì)。

10. varchar與char的區(qū)別?

char 長(zhǎng)度是固定的,不管你存儲(chǔ)的數(shù)據(jù)是多少他都會(huì)都固定的長(zhǎng)度。而varchar則處可變長(zhǎng)度但他要在總長(zhǎng)度上加1字符,這個(gè)用來(lái)存儲(chǔ)位置。所以在處理速度上char要比varchar快速很多,但是對(duì)費(fèi)存儲(chǔ)空間,所以對(duì)存儲(chǔ)不大,但在速度上有要求的可以使用char類(lèi)型,反之可以用varchar類(lèi)型。

11. BTree索引和hash索引的區(qū)別?

Hash 索引因其結(jié)構(gòu)的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節(jié)點(diǎn)到枝節(jié)點(diǎn),最后才能訪問(wèn)到頁(yè)節(jié)點(diǎn)這樣多次的IO訪問(wèn),所以 Hash 索引的查詢(xún)效率要遠(yuǎn)高于 B-Tree 索引。但也有如下明顯的缺點(diǎn):

a. Hash 索引僅僅能滿(mǎn)足"=","IN"和"<=>"查詢(xún),不能使用范圍查詢(xún)。

b. Hash 索引無(wú)法被用來(lái)避免數(shù)據(jù)的排序操作。

c. Hash 索引不能利用部分索引鍵查詢(xún)。

d. Hash 索引在任何時(shí)候都不能避免表掃描。

e. Hash 索引遇到大量Hash值相等的情況后性能并不一定就會(huì)比B-Tree索引高。

12. primary key和unique的區(qū)別?

a. 作為Primary Key的域/域組不能為null,而Unique Key可以。

b. 在一個(gè)表中只能有一個(gè)Primary Key,而多個(gè)Unique Key可以同時(shí)存在。

C. 邏輯設(shè)計(jì)上講,Primary Key一般在邏輯設(shè)計(jì)中用作記錄標(biāo)識(shí),這也是設(shè)置Primary Key的本來(lái)用意,而Unique Key只是為了保證域/域組的唯一性。

13. ecb和cbc模式有什么區(qū)別?

ECB:是一種基礎(chǔ)的加密方式,密文被分割成分組長(zhǎng)度相等的塊(不足補(bǔ)齊),然后單獨(dú)一個(gè)個(gè)加密,一個(gè)個(gè)輸出組成密文。

CBC:是一種循環(huán)模式,前一個(gè)分組的密文和當(dāng)前分組的明文異或操作后再加密,這樣做的目的是增強(qiáng)破解難度。ECB和CBC的加密結(jié)果是不一樣的,兩者的模式不同,而且CBC會(huì)在第一個(gè)密碼塊運(yùn)算時(shí)加入一個(gè)初始化向量。

14. 對(duì)稱(chēng)加密與非對(duì)稱(chēng)加密的區(qū)別?

對(duì)稱(chēng)加密,需要對(duì)加密和解密使用相同密鑰的加密算法。由于其速度快,對(duì)稱(chēng)性加密通常在消息發(fā)送方需要加密大量數(shù)據(jù)時(shí)使用。所以,對(duì)稱(chēng)性加密也稱(chēng)為密鑰加密。

而非對(duì)稱(chēng)加密算法需要兩個(gè)密鑰:公開(kāi)密鑰和私有密鑰。公開(kāi)密鑰與私有密鑰是一對(duì),如果用公開(kāi)密鑰對(duì)數(shù)據(jù)進(jìn)行加密,只有用對(duì)應(yīng)的私有密鑰才能解密;如果用私有密鑰對(duì)數(shù)據(jù)進(jìn)行加密,那么只有用對(duì)應(yīng)的公開(kāi)密鑰才能解密。

15. Xrange和range的區(qū)別?

range([start,] stop[, step]),根據(jù)start與stop指定的范圍以及step設(shè)定的步長(zhǎng),生成一個(gè)序列。xrange 用法與 range 完全相同,所不同的是生成的不是一個(gè)list對(duì)象,而是一個(gè)生成器。要生成很大的數(shù)字序列的時(shí)候,用xrange會(huì)比range性能優(yōu)很多,因?yàn)椴恍枰簧蟻?lái)就開(kāi)辟一塊很大的內(nèi)存空間。range會(huì)直接生成一個(gè)list對(duì)象,而xrange則不會(huì)直接生成一個(gè)list,而是每次調(diào)用返回其中的一個(gè)值。

16. os與sys模塊的區(qū)別?

前者提供了一種方便的使用操作系統(tǒng)函數(shù)的方法。后者提供訪問(wèn)由解釋器使用或維護(hù)的變量和與解釋器進(jìn)行交互的函數(shù)。

17. NoSQL和關(guān)系數(shù)據(jù)庫(kù)的區(qū)別?

a. SQL數(shù)據(jù)存在特定結(jié)構(gòu)的表中;而NoSQL則更加靈活和可擴(kuò)展,存儲(chǔ)方式可以省是JSON文檔、哈希表或者其他方式。

b. 在SQL中,必須定義好表和字段結(jié)構(gòu)后才能添加數(shù)據(jù),例如定義表的主鍵(primary key),索引(index),觸發(fā)器(trigger),存儲(chǔ)過(guò)程(stored procedure)等。表結(jié)構(gòu)可以在被定義之后更新,但是如果有比較大的結(jié)構(gòu)變更的話就會(huì)變得比較復(fù)雜。在NoSQL中,數(shù)據(jù)可以在任何時(shí)候任何地方添加,不需要先定義表。

c. SQL中如果需要增加外部關(guān)聯(lián)數(shù)據(jù)的話,規(guī)范化做法是在原表中增加一個(gè)外鍵,關(guān)聯(lián)外部數(shù)據(jù)表。而在NoSQL中除了這種規(guī)范化的外部數(shù)據(jù)表做法以外,我們還能用如下的非規(guī)范化方式把外部數(shù)據(jù)直接放到原數(shù)據(jù)集中,以提高查詢(xún)效率。缺點(diǎn)也比較明顯,更新審核人數(shù)據(jù)的時(shí)候?qū)?huì)比較麻煩。

d. SQL中可以使用JOIN表鏈接方式將多個(gè)關(guān)系數(shù)據(jù)表中的數(shù)據(jù)用一條簡(jiǎn)單的查詢(xún)語(yǔ)句查詢(xún)出來(lái)。NoSQL暫未提供類(lèi)似JOIN的查詢(xún)方式對(duì)多個(gè)數(shù)據(jù)集中的數(shù)據(jù)做查詢(xún)。所以大部分NoSQL使用非規(guī)范化的數(shù)據(jù)存儲(chǔ)方式存儲(chǔ)數(shù)據(jù)。

e. SQL中不允許刪除已經(jīng)被使用的外部數(shù)據(jù),而NoSQL中則沒(méi)有這種強(qiáng)耦合的概念,可以隨時(shí)刪除任何數(shù)據(jù)。

f. SQL中如果多張表數(shù)據(jù)需要同批次被更新,即如果其中一張表更新失敗的話其他表也不能更新成功。這種場(chǎng)景可以通過(guò)事務(wù)來(lái)控制,可以在所有命令完成后再統(tǒng)一提交事務(wù)。而NoSQL中沒(méi)有事務(wù)這個(gè)概念,每一個(gè)數(shù)據(jù)集的操作都是原子級(jí)的。

g. 在相同水平的系統(tǒng)設(shè)計(jì)的前提下,因?yàn)镹oSQL中省略了JOIN查詢(xún)的消耗,故理論上性能上是優(yōu)于SQL的。

Practice

這種實(shí)踐操作類(lèi)題目比較豐富多樣,如下幾類(lèi)比較常見(jiàn):

1. 補(bǔ)充缺失的代碼

例如:

Python程序員面試題 你必須提前準(zhǔn)備!(答案及解析)

?
1
2
3
4
5
6
7
8
def print_directory_contents(sPath):
 import os         
 for sChild in os.listdir(sPath):   
  sChildPath = os.path.join(sPath,sChild)
  if os.path.isdir(sChildPath):
   print_directory_contents(sChildPath)
  else:
   print sChildPath

2. 下面這段代碼的輸出結(jié)果是什么?請(qǐng)解釋。

例如:

Python程序員面試題 你必須提前準(zhǔn)備!(答案及解析)

?
1
list1 = [10, 'a']list2 = [123]list3 = [10, 'a']

新的默認(rèn)列表只在函數(shù)被定義的那一刻創(chuàng)建一次。當(dāng)extendList被沒(méi)有指定特定參數(shù)list調(diào)用時(shí),這組list的值隨后將被使用。這是因?yàn)閹в心J(rèn)參數(shù)的表達(dá)式在函數(shù)被定義的時(shí)候被計(jì)算,不是在調(diào)用的時(shí)候被計(jì)算。

3. 下面的代碼能夠運(yùn)行么?請(qǐng)解釋?zhuān)?/p>

例如:

Python程序員面試題 你必須提前準(zhǔn)備!(答案及解析)

能夠運(yùn)行。當(dāng)key缺失時(shí),執(zhí)行DefaultDict類(lèi),字典的實(shí)例將自動(dòng)實(shí)例化這個(gè)數(shù)列。

4. 將函數(shù)按照?qǐng)?zhí)行效率高低排序,并證明自己的答案是正確的。

例如:

Python程序員面試題 你必須提前準(zhǔn)備!(答案及解析)

按執(zhí)行效率從高到低排列:f2、f1和f3。要證明這個(gè)答案是正確的,你應(yīng)該知道如何分析自己代碼的性能。Python中有一個(gè)很好的程序分析包,可以滿(mǎn)足這個(gè)需求。

Python程序員面試題 你必須提前準(zhǔn)備!(答案及解析)

……

以上就是小編整理的Python面試常用問(wèn)題和參考答案,供廣大Python程序員參考,希望能提供一點(diǎn)助力。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品18久久久久久久 | 电影一级毛片 | 91精品国产综合久久婷婷香蕉 | 欧美成人se01短视频在线看 | 精品国产91久久久久久久 | 精品久久久久久中文字幕 | 国产精品成人免费一区久久羞羞 | 精品一区二区三区毛片 | av在线免费电影 | 国产精品久久久免费看 | 黄在线观看在线播放720p | 午夜精品网站 | 亚洲精品动漫在线观看 | 韩国精品一区二区三区四区五区 | 99久久久精品免费观看国产 | 成人三级视频网站 | 一区二区三区视频在线观看 | 欧美精品一区二区久久 | 欧美成人黄色小视频 | 午夜精品在线视频 | 国产视频导航 | 亚洲日韩中文字幕一区 | 国产 一区 精品 | 欧美一级免费在线观看 | 日本网站在线播放 | 最近日本电影hd免费观看 | 成人午夜小视频 | 国产精品啪一品二区三区粉嫩 | 久久久久久久久浪潮精品 | 黄色毛片一级 | 免费一级毛片在线播放不收费 | 亚洲xxx视频| 老师你怎么会在这第2季出现 | 久草中文网 | 亚洲啊v在线观看 | 国内毛片视频 | 久久精精 | 中国av一级片 | 久久久久中精品中文字幕19 | 少妇一级淫片免费放4p | 午夜久久电影 |