記一次Python後端開發面試的經歷
在拉勾上投了十幾個公司,大部分都被標記為不合適,有兩個給了面試機會,其中一個自己覺得肯定不會去的,也就沒有去面試,另一個經歷了一輪電話面加一輪現場筆試和面試,在此記錄一下面試的內容,做個小的總結。
【04/18】電話面試上來沒廢話,直接開始問問題。
1、is和==的區別?
is判斷兩個引用是否指向的是同一個變量,即內存id是否相等,==則是調用的eq方法,一般是用於判斷值是否相等,也可以重寫eq方法實現想要的效果。
2、dict與list的查找複雜度?
dict用hash實現,查找的時間複雜度是O(1),list則為O(n)。
3、a/b/c三個裝飾器依次裝飾函數fun(),裝飾器的執行順序?
注意裝飾器函數本身一般有兩層,在裝飾的時候外層和內層順序是相反的,詳情可以參考這邊文章python 多個裝飾器的調用順序。
4、如何運行一個字符串?
eval和exec。
5.Python多線程能否充分利用CPU多核心,為什麼?
這裡回答的是GIL相關的東西,可深可淺,自己把握~
6、什麼是上下文管理器?如何實現?
廣泛意義上來說,上下文是指程序運行的環境,Python中常見於打開文件或網絡連接,其實就是with關鍵字,如:
with open("test.txt") as file:
print(file.read())
可以確保文件在最後會被關閉,只要對一個對象實現了enter和exit函數,就可以構造自己的上下文管理器了。
7、同步/異步/阻塞/非阻塞都是什麼?
感覺直接解釋概念不好解釋,這裡我回答的思路是舉例子,異步說白了就是任務不需要同步進行,比如用爬蟲爬取一個數據,然後再保存數據,接下來再去爬另一個數據,這是同步;異步就是爬蟲不用等著數據保存好,爬完一個直接去爬另一個,數據保存的事情交給別的邏輯去慢慢處理;阻塞和非阻塞也是基於此的,同步的情況下會阻塞爬蟲,爬蟲需要等待數據的保存。(這部分是我自己的理解,建議看看專業的說明)
8、如何判斷兩個浮點數是否相等?
之前完全沒想過這個的問題,我的回答就是按一個差不多的精度去比較,比如到小數點第幾位之前都是相等的,就認為兩個數相等,或者Math模塊裡可能有什麼方法可以去精確對比,當時是這麼回答的,現在查了一下基本也是這個思路,Math模塊中有一個isclose函數用來判斷兩個浮點數的值是否接近或相等
9、MySQL的索引一般是怎麼實現的?
B-Tree(一般是B+Tree)和Hash,然後再簡單介紹一下。
10、對於Flask的實現有了解嗎?
只知道WSGI,其餘的不清楚,暫時還沒去深入看Flask的源碼。
【04/20】現場筆試+面試跨了大半個北京城,還跟leader撒謊請假,也是心累。筆試題如下:
1、一個木棍任意截成三段,圍成三角形的概率?
咩咩咩?不知道。(回來查了是25%,具體可以自行搜索,反正脫離數學N年是無論如何都想不出來的)。
2、一個函數RAND7()隨機返回1~7,使用它構造一個RAND10()函數隨機返回10。
一開始寫了個函數如下:
def rand10():
a = rand7() + 3/10
b = rand7() - 4
if b < 0:
b = 0
return a + b
也是腦袋抽了,想得太簡單,這個rand10雖然能返回1~10的隨機數,但每個數出現的概率不是1/10,後面時間快到了檢查的時候才反應過來。正確的思路是:
def rand10():
while 1:
res = (rand7()-1)*7+rand7()
if res < 40:
return res % 10 + 1
3、把一段JAVA代碼改成Python,並增加單元測試。
JAVA代碼本身很簡單,即使沒學過也能看懂,改後的Python代碼如下:
class MyClass:
__current = 0
def next(self):
MyClass.__current += 1
return MyClass.__current
但是對於單元測試則僅限於聽過的地步,需要用到unittest,好像也有別的模塊。
4、給定一個數組,按奇數在前升序,偶數在後降序排列,一行代碼實現。
沒啥好說的,一行代碼必然是列表生成式,假設數組是nums,代碼如下:
sorted([n for n in nums if n % 2]) + sorted([n for n in nums if not n % 2], reverse=True)
5、實現單例。
單例就是說一個class只能有一個instance,實現的方法有很多,例如改寫new方法:
class Singleton(object):
_instance = None
def __new__(cls, *args, **kw):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kw)
return cls._instance
6、有一個問答平臺,每個用戶對一個問題最多只能回答一次,同一個問題最多只能對一個答案點讚;1)設計合適的資料庫結構;2)寫出SQL獲取點讚數最多的10個問題;
我平時也就用資料庫查數據,在設計資料庫上沒有深入研究,因此的我答案就簡單寫了有哪些表,欄位分別是什麼,至於題中的條件限制,就交由後臺的程序邏輯去處理,而不是在資料庫設計層面去限制。因為是自己設計的表結構,SQL本身也就不難。
7、設計一個棧,實現pop/push及max方法,要求能在O(1)時間內取得最大值。
LeetCode原題啊!list怎麼能O(1)取得最大值呢,無非是空間換時間,每push一個數就同時記錄當前的最大值。
8、手寫快排。
呵呵。
1、你的網站,你覺得如果訪問量上去了,最先出現瓶頸問題的點是哪?怎麼優化?
我答的是資料庫,因為好多不必要或者可以使用緩存的地方也頻繁操作資料庫,而且是使用的ORM,但之前從哪看到ORM不能確保對應的SQL語句是最優的,因此可以嘗試使用原生SQL或者增加Redis緩存。
2、如果要擴展後臺伺服器,需要怎麼做?
(話說這不是運維的工作麼。。。)呃,就是增加伺服器啊,然後前面加一層負載均衡,把請求分配給不同的伺服器。(那不同的伺服器怎麼使用你的Session?)再加個Session伺服器。
3、我看你平時刷編程題,有遇到什麼有意思的題目嗎?
LeetCode才開始刷,就舉了兩道Codewars上的題目,我也真是傻了,真的舉了兩道有意思(但自己沒做好)的題。
其他就無非是一些為什麼想做後端開發之類的問題了,個人感覺題目大部分也挺簡單的,我的表現也算中規中矩吧,但面試官說我要進一步加強基礎知識,具體哪方面(資料庫、網絡協議、還是Python本身)又語焉不詳。
原文:https://segmentfault.com/a/1190000014540229
學習Python和網絡爬蟲,關注公眾號:datanami
近期文章:
從0開始玩轉MySQL
Python奇技淫巧101
我是怎麼把一個項目帶崩的
Python 實現多線程下載器
為什麼Django框架持續統治著Python開發世界