Python開發面試題
Python 語言
類變數和例項變數
@staticmethod 和 @classmethod
閉包,裝飾器,迭代器,yield,生成器,記憶體管理GC?
staticmethod和裝飾器的區別?
*args
和**kwargs
鴨子型別
@property 和 @setter
簡要描述Python的垃圾回收機制(garbage collection)
__new__
和__init__
的區別。Python裡面如何拷貝一個物件?
自省
寫一個bottle繫結 url path的 decorator 或者口述一下原理。
標準庫執行緒安全的佇列是哪一個?不安全的是哪一個?logging是執行緒安全的嗎?
python適合的場景有哪些?當遇到計算密集型任務怎麼辦?
python高併發解決方案?我希望聽到twisted->tornado->gevent,能扯到golang,erlang更好
解釋一下 Gevent 和 threading / multiprocessing 的關係
GIL
ORM
metaclass
descriptor
corountine
pythonic
Web 開發框架
Flask 原始碼?
解釋一下 WSGI 和 FastCGI 的關係
Django 和 Tornado 的關係、差別
restfull 風格的api怎麼寫
網頁嵌入的im原理
作業系統原理
- 程序間通訊
多程序和多執行緒
epoll,select的區別?邊緣觸發,水平觸發區別?
負載均衡的幾種演算法?
計算密集型,IO密集型任務怎麼辦?
time_wait
是什麼情況?出現過多的close_wait
可能是什麼原因?
演算法
快速排序
冒泡
二分法
動態規劃
計算機網路
協議的本質?
TCP/IP
- tcp/udp的區別?tcp粘包是怎麼回事,如何處理?udp有粘包嗎?
HTTP(含2.0)
1、post 和 get方法區別
- 從輸入URL到頁面載入完成發生了什麼?
資料庫(儲存)SQL/cache/nosql
儲存可能包含rdbms,nosql以及快取等,我以mysql,redis舉例
mysql相關
- 增刪改查
觸發器
SQL 語法、調優
SQLAlchemy 的用法
談談mysql字符集和排序規則?
varchar與char的區別是什麼?大小限制?utf8字符集下varchar最多能存多少個字元
primary key和unique的區別?
外來鍵有什麼用,是否該用外來鍵?外來鍵一定需要索引嗎?
myisam與innodb的區別?innodb的兩階段鎖定協議是什麼情況?
索引有什麼用,大致原理是什麼?設計索引有什麼注意點?
redis相關
什麼場景用redis,為什麼mysql不適合?
談談redis的事務?用事務模擬原子+1操作?原子操作還有其它解決方案嗎?
redis記憶體滿了會怎麼樣?
設計模式
單例模式
裝飾器、面向切面程式設計 AOP
網路安全
web安全相關
解釋一下 cookie 和 session 的關係
xsrf 的攻擊和防範方法解釋一下
sql注入是怎麼產生的,如何防止?
xss如何預防?htmlescape後能否避免xss?
csrf是什麼?django是如何防範的?
密碼技術
什麼是分組加密?加密模式有哪些?ecb和cbc模式有什麼區別?為什麼需要iv向量?
簡單說說https的過程?
對稱加密與非對稱加密區別?
4.如何生成共享祕鑰? 如何防範中間人攻擊?
其他
bottleneck
rush condition的處理方法,scale的方向
做個短連結服務
golang,rust是否瞭解?
numpy,pandas是啥?
訊息佇列?
——————
—————————–
高併發的解決方案?
1.使用代理伺服器,“根據因特網流量狀況以及內容型別將請求導向特定的Web伺服器”(注:《HTTP權威指南》“6.2 為什麼使用代理”,P141)。
HTTP/0.9?
HTTP/0.9 報文也由請求和響應組成, 但請求中只包含方法和請求 URL, 響應中只包含實體。 它沒有版本資訊(它是第一個, 而且是當時唯一的版本), 沒有狀態碼或原因短語, 也沒有首部。
但這種簡單協議無法提供更多的靈活性, 也無法實現本書中描述的大部分 HTTP 特性和應用。 這裡對其進行簡要的描述, 是因為仍然有一些客戶端、 伺服器和其他應用程式在使用這個協議, 應用程式的編寫者應該清楚它的侷限性。
(注:《HTTP權威指南》“3.2.5 版本0.9的報文”,P55-P56。)
冪等性?
即使在非錯誤情況下, 連線也可以在任意時刻關閉。 HTTP 應用程式要做好正確處理非預期關閉的準備。 如果在客戶端執行事務的過程中, 傳輸連線關閉了, 那麼,除非事務處理會帶來一些副作用, 否則客戶端就應該重新開啟連線, 並重試一次。
對管道化連線來說, 這種情況更加嚴重一些。 客戶端可以將大量請求放入佇列中排隊, 但源端伺服器可以關閉連線, 這樣就會留下大量未處理的請求, 需要重新排程。
副作用是很重要的問題。 如果在傳送出一些請求資料之後, 收到返回結果之前, 連線關閉了, 客戶端就無法百分之百地確定伺服器端實際激活了多少事務。 有些事務,比如 GET 一個靜態的 HTML 頁面, 可以反覆執行多次, 也不會有什麼變化。 而其他一些事務, 比如向一個線上書店 POST 一張訂單, 就不能重複執行, 不然會有下多張訂單的危險。
如果一個事務, 不管是執行一次還是很多次, 得到的結果都相同, 這個事務就是冪等的。 實現者們可以認為 GET、HEAD、 PUT、 DELETE、 TRACE 和 OPTIONS 方法都共享這一特性。 19 客戶端不應該以管道化方式傳送非冪等請求(比如 POST)。否則, 傳輸連線的過早終止就會造成一些不確定的後果。 要傳送一條非冪等請求,就需要等待來自前一條請求的響應狀態。儘管使用者 Agent 代理可能會讓操作員來選擇是否對請求進行重試, 但一定不能自動重試非冪等方法或序列。 比如, 大多數瀏覽器都會在過載一個快取的 POST 響應時提供一個對話方塊, 詢問使用者是否希望再次發起事務處理
(注:《HTTP權威指南》“4.7.3 連線關閉容限、 重試以及冪等性”,P107-P108。)
post、get、put、head、delete這五種HTTP方法以及它們之間的相同點和不同點?
一旦 Web 伺服器收到了請求, 就可以根據方法、 資源、 首部和可選的主體部分來對請求進行處理了。
有些方法(比如 POST) 要求請求報文中必須帶有實體主體部分的資料。 其他一些方法(比如 OPTIONS) 允許有請求的主體部分, 也允許沒有。 少數方法(比如GET) 禁止在請求報文中包含實體的主體資料。
語言基礎、HTTP基礎epoll、select是個啥?
gevent用過沒,咋實現的?
redis用過沒,講講怎麼用的?
多程序、協程如何使用?
訊息佇列用過沒?
django、flask、tornado這幾個框架有啥特點?
Python有哪些資料結構?
面試官不會僅僅問你flask提供的API怎麼用,而是會繼續深入的問下去flask的原始碼裡怎麼設計這個API的,甚至問到如果你來設計這個API,你會怎麼設計,這個設計需要用到Python的那些東西等等,會不斷的把思維發散開去。。如果你不知道怎麼學,去看下招聘資訊,比如這是一段我從某招聘網站上覆制下來的招Python Web開發崗位的要求:
- 熟練掌握Python,熟悉python非同步IO、多執行緒、多程序程式設計;
- 熟悉一種web開發框架(Django/Flask/Tornado),參與過實際的python web開發;
- 瞭解前端開發技術,熟悉HTTP協議,TCP/IP,HTML, 瞭解Ajax, oauth,Ajax, Jquery等,熟悉前後端的互動過程;
- 熟悉一種常用的ORM框架,不限於 peewee/SQLAlchemy;
- 熟悉常用的資料結構演算法、oo思想、一般設計模式,瞭解作業系統原理;
7.有比較強的trouble shooting能力,善於通過錯誤跟蹤和日誌分析快速解決問題。
差不多是這樣的。。所以,我的建議是,需要了解的基礎只是還是瞭解下吧,不需要非常深入,但某些概念還是要搞熟悉。
背概念+程式碼實現。
比如生成器,需要知道的有這些:
1.概念(或者說特性)-儲存之前的資料,然後在下一次呼叫時能在上一次呼叫產生的資料的基礎之上進行計算,這種函式在Python中稱為生成器。
2.程式碼實現:簡單的就是怎麼使用生成器,建立一個生成器等。難度大的玩法就多了,比如,自己實現一個擁有生成器功能的函式;再比如,使用生成器實現迭代器,再再比如使用生成器模擬執行緒併發等等。
3.一般面試,如果問到生成器,肯定會問到的是第一部分關於生成器的概念(或者說特性),然後問的深一點就會涉及到這些特性有什麼用途,能用來實現什麼東西,這個就是第二部分的東西了。
建議去刷LeetCode,做完easy和medium這兩個難度級別的題就可以,最好多做幾遍,把各種解法都想通了,那面試和筆試中資料結構和演算法的部分基本就沒問題了。。