是什麼(what)前端
如何作(how)java
說區別/談優點(difference)python
實踐操做(practice)mysql
1. 什麼是Python?程序員
Python是一種編程語言,它有對象、模塊、線程、異常處理和自動內存管理。能夠加入與其餘語言的對比。下面是回答這一問題的幾個關鍵點:面試
a. Python是一種解釋型語言,python代碼在運行以前不須要編譯。算法
b. Python是動態類型語言,在聲明變量時,不須要說明變量的類型。sql
c. Python適合面向對象的編程,由於它支持經過組合與繼承的方式定義類。數據庫
d. 在Python語言中,函數是第一類對象。編程
e. Python代碼編寫快,可是運行速度比編譯語言一般要慢。
f. Python用途普遍,常被用做「膠水語言」,可幫助其餘語言和組件改善運行情況。
g. 使用Python,程序員能夠專一於算法和數據結構的設計,而不用處理底層的細節。
2. 什麼是Python自省?
python自省是python具備的一種能力,使程序員面向對象的語言所寫的程序在運行時,可以得到對象的類python型。Python是一種解釋型語言。爲程序員提供了極大的靈活性和控制力。
3. 什麼是PEP 8?
PEP8是一種編程規範,內容是一些關於如何讓你的程序更具可讀性的建議。
4. 什麼是pickling和unpickling?
Pickle模塊讀入任何Python對象,將它們轉換成字符串,而後使用dump函數將其轉儲到一個文件中——這個過程叫作pickling。反之從存儲的字符串文件中提取原始Python對象的過程,叫作unpickling。
5. 什麼是Python裝飾器?
Python裝飾器是Python中的特有變更,可使修改函數變得更容易。
6. 什麼是Python的命名空間?
在Python中,全部的名字都存在於一個空間中,它們在該空間中存在和被操做——這就是命名空間。它就好像一個盒子,每個變量名字都對應裝着一個對象。當查詢變量的時候,會從該盒子裏面尋找相應的對象。
7. 什麼是字典推導式和列表推導式?
它們是能夠輕鬆建立字典和列表的語法結構。
8. Lambda函數是什麼?
這是一個常被用於代碼中的單個表達式的匿名函數。
9. *args,**kwargs?參數是什麼?
若是咱們不肯定要往函數中傳入多少個參數,或者咱們想往函數中以列表和元組的形式傳參數時,那就使要用*args;若是咱們不知道要往函數中傳入多少個關鍵詞參數,或者想傳入字典的值做爲關鍵詞參數時,那就要使用**kwargs。
10. 什麼是Pass語句?
Pass是一個在Python中不會被執行的語句。在複雜語句中,若是一個地方須要暫時被留白,它經常被用於佔位符。
11. unittest是什麼?
在Python中,unittest是Python中的單元測試框架。它擁有支持共享搭建、自動測試、在測試中暫停代碼、將不一樣測試迭代成一組,等等的功能。
11. 構造器是什麼?
構造器是實現迭代器的一種機制。它功能的實現依賴於yield表達式,除此以外它跟普通的函數沒有兩樣。
12. doc string是什麼?
Python中文檔字符串被稱爲docstring,它在Python中的做用是爲函數、模塊和類註釋生成文檔。
13. 負索引是什麼?
Python中的序列索引能夠是正也能夠是負。若是是正索引,0是序列中的第一個索引,1是第二個索引。若是是負索引,(-1)是最後一個索引而(-2)是倒數第二個索引。
14. 模塊和包是什麼?
在Python中,模塊是搭建程序的一種方式。每個Python代碼文件都是一個模塊,並能夠引用其餘的模塊,好比對象和屬性。
一個包含許多Python代碼的文件夾是一個包。一個包能夠包含模塊和子文件夾。
15. 垃圾回收是什麼?
在Python中,爲了解決內存泄露問題,採用了對象引用計數,並基於引用計數實現自動垃圾回收。
16. CSRF是什麼?
CSRF是僞造客戶端請求的一種攻擊,CSRF的英文全稱是Cross Site Request Forgery,字面上的意思是跨站點僞造請求。
1
HOW
1. 如何讓你的程序更具可讀性?
適當地加入非前導空格,適當的空行以及一致的命名。
2. Python是如何被解釋的?
Python是一種解釋性語言,它的源代碼能夠直接運行。Python解釋器會將源代碼轉換成中間語言,以後再翻譯成機器碼再執行。
3. 如何在Python中拷貝一個對象?
若是要在Python中拷貝一個對象,大多時候你能夠用copy.copy()或者copy.deepcopy()。但並非全部的對象均可以被拷貝。
4. 如何用Python刪除一個文件?
使用函數os.remove("file")
5. 如何將一個數字轉換成一個字符串?
你可使用自帶函數str()將一個數字轉換爲字符串。若是你想要八進制或者十六進制數,能夠用oct()或hex()。
6. Python是如何進行內存管理的?
Python的內存管理是由私有heap空間管理的。全部的Python對象和數據結構都在一個私有heap中。程序員沒有訪問該heap的權限,只有解釋器才能對它進行操做。爲Python的heap空間分配內存是由Python的內存管理模塊進行的,其核心API會提供一些訪問該模塊的方法供程序員使用。Python有自帶的垃圾回收系統,它回收並釋放沒有被使用的內存,讓它們可以被其餘程序使用。
7. 如何實現tuple和list的轉換?
以list做爲參數將tuple類初始化,將返回tuple類型
以tuple做爲參數將list類初始化,將返回list類型
8. Python裏面如何生成隨機數?
在python中用於生成隨機數的模塊是random,在使用前須要import. 以下例子能夠酌情列舉:
random.random():生成一個0-1之間的隨機浮點數
random.uniform(a, b):生成[a,b]之間的浮點數
random.randint(a, b):生成[a,b]之間的整數
random.randrange(a, b, step):在指定的集合[a,b)中,以step爲基數隨機取一個數
random.choice(sequence):從特定序列中隨機取一個元素,這裏的序列能夠是字符串,列表,元組等
9. 如何在一個function裏面設置一個全局的變量
若是要給全局變量在一個函數裏賦值,必須使用global語句。global VarName的表達式會告訴Python, VarName是一個全局變量,這樣Python就不會在局部命名空間裏尋找這個變量了
10. Python如何實現單例模式?其餘23種設計模式python如何實現?
單例模式主要有四種方法:__new__、共享屬性、裝飾器、import。
其餘23種設計模式可基本分爲建立型、結構型和行爲型模式。
建立模式,提供實例化的方法,爲適合的情況提供相應的對象建立方法。
結構化模式,一般用來處理實體之間的關係,使得這些實體可以更好地協同工做。
行爲模式,用於在不一樣的實體建進行通訊,爲實體之間的通訊提供更容易,更靈活的通訊方法。
各模式的實現可根據其特色編寫代碼(限於篇幅,此處不作示例)
11. 如何判斷單向鏈表中是否有環
首先遍歷鏈表,尋找是否有相同地址,藉此判斷鏈表中是否有環。若是程序進入死循環,則須要一塊空間來存儲指針,遍歷新指針時將其和儲存的舊指針比對,如有相同指針,則該鏈表有環,不然將這個新指針存下來後繼續往下讀取,直到碰見NULL,這說明這個鏈表無環。
12. 如何遍歷一個內部未知的文件夾?
經常使用的有如下這幾種辦法:os.path.walk(),os.walk(),listdir
13. mysql數據庫如何分區、分表?
分表能夠經過三種方式:mysql集羣、自定義規則和merge存儲引擎。
分區有四類:
RANGE 分區:基於屬於一個給定連續區間的列值,把多行分配給分區。
LIST 分區:相似於按RANGE分區,區別在於LIST分區是基於列值匹配一個離散值集合中的某個值來進行選擇。
HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,該表達式使用將要插入到表中的這些行的列值進行計算。這個函數能夠包含MySQL 中有效的、產生非負整數值的任何表達式。
KEY 分區:相似於按HASH分區,區別在於KEY分區只支持計算一列或多列,且MySQL 服務器提供其自身的哈希函數。必須有一列或多列包含整數值。
14. 如何對查詢命令進行優化?
a. 應儘可能避免全表掃描,首先應考慮在 where 及 order by 涉及的列上創建索。
b. 應儘可能避免在 where 子句中對字段進行 null 值判斷,避免使用!=或<>操做符,避免使用 or 鏈接條件,或在where子句中使用參數、對字段進行表達式或函數操做,不然會致使權標掃描
c. 不要在 where 子句中的「=」左邊進行函數、算術運算或其餘表達式運算,不然系統將可能沒法正確使用索引。
d. 使用索引字段做爲條件時,若是該索引是複合索引,那麼必須使用到該索引中的第一個字段做爲條件時才能保證系統使用該索引,不然該索引將不會被使用。
e. 不少時候可考慮用 exists 代替 in
f. 儘可能使用數字型字段
g. 儘量的使用 varchar/nvarchar 代替 char/nchar
h. 任何地方都不要使用 select * from t ,用具體的字段列表代替「*」,不要返回用不到的任何字段。
i. 儘可能使用表變量來代替臨時表。
j. 避免頻繁建立和刪除臨時表,以減小系統表資源的消耗。
k. 儘可能避免使用遊標,由於遊標的效率較差。
l. 在全部的存儲過程和觸發器的開始處設置 SET NOCOUNT ON ,在結束時設置 SET NOCOUNT OFF
m. 儘可能避免大事務操做,提升系統併發能力。
n. 儘可能避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。
15. 如何理解開源?
開源,即開放源代碼。開源誕生於軟件行業,它不只僅表明軟件源代碼的開放,自己即意味着自由、共享和充分利用資源。開源是一種精神,是一種文化,現在已經成爲軟件業發展的大勢所趨。
16. 如何理解MVC/MTV框架?
MVC就是把Web應用分爲模型(M),控制器(C)和視圖(V)三層,他們之間以一種插件式的、鬆耦合的方式鏈接在一塊兒。MTV模式本質上和MVC是同樣的,也是爲了各組件間保持鬆耦合關係,只是定義上有些許不一樣。
17. MSSQL的死鎖是如何產生的?
以下是死鎖產生的四個必要條件:
互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。若是此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對本身已得到的其它資源保持不放。
不剝奪條件:指進程已得到的資源,在未使用完以前,不能被剝奪,只能在使用完時由本身釋放。
環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。
18. Sql注入是如何產生的,如何防止?
程序開發過程當中不注意規範書寫sql語句和對特殊字符進行過濾,致使客戶端能夠經過全局變量POST和GET提交一些sql語句正常執行。產生Sql注入。下面是防止辦法:
a. 過濾掉一些常見的數據庫操做關鍵字,或者經過系統函數來進行過濾。
b. 在PHP配置文件中將Register_globals=off;設置爲關閉狀態
c. SQL語句書寫的時候儘可能不要省略小引號(tab鍵上面那個)和單引號
d. 提升數據庫命名技巧,對於一些重要的字段根據程序的特色命名,取不易被猜到的
e. 對於經常使用的方法加以封裝,避免直接暴漏SQL語句
f. 開啓PHP安全模式:Safe_mode=on;
g. 打開magic_quotes_gpc來防止SQL注入
h. 控制錯誤信息:關閉錯誤提示信息,將錯誤信息寫到系統日誌。
i. 使用mysqli或pdo預處理。
19. xxs如何預防?
XSS漏洞難以檢測,可是爲了WEB安全仍須要盡力避免:
針對反射型和存儲型XSS,須要服務端和前端共同預防,針對用戶輸入的數據作解析和轉義,對於前端開發而言,則是善於使用escape,針對data URI內容作正則判斷,禁止用戶輸入非顯示信息。
對於DOM XSS,因爲形成XSS的緣由在於用戶的輸入,所以在前端,須要特別注意用戶輸入源,並對可能形成的XSS的操做須要進行字串轉義。
20. 如何生成共享祕鑰? 如何防範中間人攻擊?
密鑰的生成是經過使用全局配置命令完成的:對於不可輸出密鑰是<crypto key generate rsa label {label string},而對於可輸出密鑰則是<crypto key generate rsa exportable label {label string}>。標記(label)是可選擇的;若是沒有指定標記,那麼密鑰名稱將是hostname.domain-name。
對於中間人的攻擊,能夠採用以下防範手段:
a. 經過採用動態ARP檢測、DHCP Snooping等控制操做來增強網絡基礎設施
b. 採用傳輸加密
c. 使用CASBs(雲訪問安全代理)
d. 建立RASP(實時應用程序自我保護)
e. 阻止自簽名證書
f. 強制使用SSL pinning
g. 安裝DAM(數據庫活動監控)
21. 如何管理不一樣版本的代碼?
進行版本管理。可舉例告知如何使用Git(或是其餘工具)進行追蹤。
2
Difference
1. 數組和元組之間的區別?
數組在python中叫做列表。列表能夠修改,而元組不能夠修改,若是元組中僅有一個元素,則要在元素後加上逗號。元組和列表的查詢方式同樣。元組只可讀不可修改,若是程序中的數據不容許修改可用元組。
2. _new_和_init_的區別?
__init__是當實例對象建立完成後被調用的,而後設置對象屬性的一些初始值。
__new__是在實例建立以前被調用的,由於它的任務就是建立實例而後返回該實例,是個靜態方法。
也就是,__new__在__init__以前被調用,__new__的返回值(實例)將傳遞給__init__方法的第一個參數,而後__init__給這個實例設置一些參數。
3. Python中單下劃線和雙下劃綫的區別?
"單下劃線" 開始的成員變量叫作保護變量,意思是隻有類對象和子類對象本身能訪問到這些變量;
"雙下劃線" 開始的是私有成員,意思是隻有類對象本身能訪問,連子類對象也不能訪問到這個數據。
4. 淺拷貝與深拷貝的區別是?
在python中,對象賦值其實是對象的引用。淺拷貝,沒有拷貝子對象,因此原始數據改變,子對象會改變,而深拷貝,包含對象裏面的自對象的拷貝,因此原始對象的改變不會形成深拷貝里任何子元素的改變。
5. 使用裝飾器的單例和使用其餘方法的單例,在後續使用中,有何區別?
Import方法改變了類自己,new方法,可是隻是把全部實例對象共享屬性,每次產生一個新對象。算做僞單例,共享屬性方法實例化了許多個相同屬性。因此,裝飾器方法最爲實用。
6. 多進程與多線程的區別?
a. 簡而言之,一個程序至少有一個進程,一個進程至少有一個線程。
b. 線程的劃分尺度小於進程,使得多線程程序的併發性高。
c. 另外,進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率。
d. 線程在執行過程當中與進程仍是有區別的。每一個獨立的線程有一個程序運行的入口、順序執行序列和程序的出口。可是線程不可以獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制。
e. 從邏輯角度來看,多線程的意義在於一個應用程序中,有多個執行部分能夠同時執行。但操做系統並無將多個線程看作多個獨立的應用,來實現進程的調度和管理以及資源分配。這就是進程和線程的重要區別。
7. select和epoll的區別?
a. select實現須要本身不斷輪詢全部fd集合,直到設備就緒,期間可能要睡眠和喚醒屢次交替。而epoll其實也須要調用epoll_wait不斷輪詢就緒鏈表,期間也可能屢次睡眠和喚醒交替,可是它是設備就緒時,調用回調函數,把就緒fd放入就緒鏈表中,並喚醒在epoll_wait中進入睡眠的進程。雖然都要睡眠和交替,可是select在「醒着」的時候要遍歷整個fd集合,而epoll在「醒着」的時候只要判斷一下就緒鏈表是否爲空就好了,這節省了大量的CPU時間。
b. select每次調用都要把fd集合從用戶態往內核態拷貝一次,而且要把current往設備等待隊列中掛一次,而epoll只要一次拷貝,並且把current往等待隊列上掛也只掛一次(在epoll_wait的開始,注意這裏的等待隊列並非設備等待隊列,只是一個epoll內部定義的等待隊列)。這也能節省很多的開銷。
8. TCP和UDP的區別?邊緣觸發和水平觸發的區別?
a. 基本區別:
基於鏈接與無鏈接
TCP要求系統資源較多,UDP較少;
UDP程序結構較簡單
流模式(TCP)與數據報模式(UDP);
TCP保證數據正確性,UDP可能丟包
TCP保證數據順序,UDP不保證
b. 編程中的區別
socket()的參數不一樣
UDP Server不須要調用listen和accept
UDP收發數據用sendto/recvfrom函數
TCP:地址信息在connect/accept時肯定
UDP:在sendto/recvfrom函數中每次均 需指定地址信息
UDP:shutdown函數無效
9. HTTP鏈接:get和post的區別?
GET請求,請求的數據會附加在URL以後,以?分割URL和傳輸數據,多個參數用&鏈接。URL的編碼格式採用的是ASCII編碼,而不是uniclde,便是說全部的非ASCII字符都要編碼以後再傳輸。
POST請求:POST請求會把請求的數據放置在HTTP請求包的包體中。上面的item=bandsaw就是實際的傳輸數據。
所以,GET請求的數據會暴露在地址欄中,而POST請求則不會。
10. varchar與char的區別?
char 長度是固定的,無論你存儲的數據是多少他都會都固定的長度。而varchar則處可變長度但他要在總長度上加1字符,這個用來存儲位置。因此在處理速度上char要比varchar快速不少,可是對費存儲空間,因此對存儲不大,但在速度上有要求的可使用char類型,反之能夠用varchar類型。
11. BTree索引和hash索引的區別?
Hash 索引因其結構的特殊性,其檢索效率很是高,索引的檢索能夠一次定位,不像B-Tree 索引須要從根節點到枝節點,最後才能訪問到頁節點這樣屢次的IO訪問,因此 Hash 索引的查詢效率要遠高於 B-Tree 索引。但也有以下明顯的缺點:
a. Hash 索引僅僅能知足"=","IN"和"<=>"查詢,不能使用範圍查詢。
b. Hash 索引沒法被用來避免數據的排序操做。
c. Hash 索引不能利用部分索引鍵查詢。
d. Hash 索引在任什麼時候候都不能避免表掃描。
e. Hash 索引遇到大量Hash值相等的狀況後性能並不必定就會比B-Tree索引高。
12. primary key和unique的區別?
a. 做爲Primary Key的域/域組不能爲null,而Unique Key能夠。
b. 在一個表中只能有一個Primary Key,而多個Unique Key能夠同時存在。
C. 邏輯設計上講,Primary Key通常在邏輯設計中用做記錄標識,這也是設置Primary Key的原本用意,而Unique Key只是爲了保證域/域組的惟一性。
13. ecb和cbc模式有什麼區別?
ECB:是一種基礎的加密方式,密文被分割成分組長度相等的塊(不足補齊),而後單獨一個個加密,一個個輸出組成密文。
CBC:是一種循環模式,前一個分組的密文和當前分組的明文異或操做後再加密,這樣作的目的是加強破解難度。ECB和CBC的加密結果是不同的,二者的模式不一樣,並且CBC會在第一個密碼塊運算時加入一個初始化向量。
14. 對稱加密與非對稱加密的區別?
對稱加密,須要對加密和解密使用相同密鑰的加密算法。因爲其速度快,對稱性加密一般在消息發送方須要加密大量數據時使用。因此,對稱性加密也稱爲密鑰加密。
而非對稱加密算法須要兩個密鑰:公開密鑰和私有密鑰。公開密鑰與私有密鑰是一對,若是用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;若是用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。
15. Xrange和range的區別?
range([start,] stop[, step]),根據start與stop指定的範圍以及step設定的步長,生成一個序列。xrange 用法與 range 徹底相同,所不一樣的是生成的不是一個list對象,而是一個生成器。要生成很大的數字序列的時候,用xrange會比range性能優不少,由於不須要一上來就開闢一塊很大的內存空間。range會直接生成一個list對象,而xrange則不會直接生成一個list,而是每次調用返回其中的一個值。
16. os與sys模塊的區別?
前者提供了一種方便的使用操做系統函數的方法。後者提供訪問由解釋器使用或維護的變量和與解釋器進行交互的函數。
17. NoSQL和關係數據庫的區別?
a. SQL數據存在特定結構的表中;而NoSQL則更加靈活和可擴展,存儲方式能夠省是JSON文檔、哈希表或者其餘方式。
b. 在SQL中,必須定義好表和字段結構後才能添加數據,例如定義表的主鍵(primary key),索引(index),觸發器(trigger),存儲過程(stored procedure)等。表結構能夠在被定義以後更新,可是若是有比較大的結構變動的話就會變得比較複雜。在NoSQL中,數據能夠在任什麼時候候任何地方添加,不須要先定義表。
c. SQL中若是須要增長外部關聯數據的話,規範化作法是在原表中增長一個外鍵,關聯外部數據表。而在NoSQL中除了這種規範化的外部數據表作法之外,咱們還能用以下的非規範化方式把外部數據直接放到原數據集中,以提升查詢效率。缺點也比較明顯,更新審覈人數據的時候將會比較麻煩。
d. SQL中可使用JOIN表連接方式將多個關係數據表中的數據用一條簡單的查詢語句查詢出來。NoSQL暫未提供相似JOIN的查詢方式對多個數據集中的數據作查詢。因此大部分NoSQL使用非規範化的數據存儲方式存儲數據。
e. SQL中不容許刪除已經被使用的外部數據,而NoSQL中則沒有這種強耦合的概念,能夠隨時刪除任何數據。
f. SQL中若是多張表數據須要同批次被更新,即若是其中一張表更新失敗的話其餘表也不能更新成功。這種場景能夠經過事務來控制,能夠在全部命令完成後再統一提交事務。而NoSQL中沒有事務這個概念,每個數據集的操做都是原子級的。
g. 在相同水平的系統設計的前提下,由於NoSQL中省略了JOIN查詢的消耗,故理論上性能上是優於SQL的。
3
Practice
這種實踐操做類題目比較豐富多樣,以下幾類比較常見:
1. 補充缺失的代碼
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. 下面這段代碼的輸出結果是什麼?請解釋。
例如:
list1 = [10, 'a']list2 = [123]list3 = [10, 'a']
新的默認列表只在函數被定義的那一刻建立一次。當extendList被沒有指定特定參數list調用時,這組list的值隨後將被使用。這是由於帶有默認參數的表達式在函數被定義的時候被計算,不是在調用的時候被計算。
3. 下面的代碼可以運行麼?請解釋?
例如:
可以運行。當key缺失時,執行DefaultDict類,字典的實例將自動實例化這個數列。
4. 將函數按照執行效率高低排序,並證實本身的答案是正確的。
例如:
按執行效率從高到低排列:f二、f1和f3。要證實這個答案是正確的,你應該知道如何分析本身代碼的性能。Python中有一個很好的程序分析包,能夠知足這個需求。