在拉勾上投了十幾個公司,大部分都被標記爲不合適,有兩個給了面試機會,其中一個本身以爲確定不會去的,也就沒有去面試,另外一個經歷了一輪電話面加一輪現場筆試和麪試,在此記錄一下面試的內容,作個小的總結。python
上來沒廢話,直接開始問問題。面試
is
和==
的區別?is
判斷兩個引用是否指向的是同一個變量,即內存id
是否相等,==
則是調用的__eq__
方法,通常是用於判斷值是否相等,也能夠重寫__eq__
方法實現想要的效果。數據庫
dict
與list
的查找複雜度?dict
用hash
實現,查找的時間複雜度是O(1)
,list
則爲O(n)
。編程
a/b/c
三個裝飾器依次裝飾函數fun()
,裝飾器的執行順序?注意裝飾器函數自己通常有兩層,在裝飾的時候外層和內層順序是相反的,詳情能夠參考這邊文章python 多個裝飾器的調用順序。segmentfault
eval
和exec
。後端
Python
多線程可否充分利用CPU
多核心,爲何?這裏回答的是GIL
相關的東西,可深可淺,本身把握~數組
普遍意義上來講,上下文是指程序運行的環境,Python
中常見於打開文件或網絡鏈接,其實就是with
關鍵字,如:緩存
with open("test.txt") as file: print(file.read())
能夠確保文件在最後會被關閉,只要對一個對象實現了__enter__
和__exit__
函數,就能夠構造本身的上下文管理器了。服務器
感受直接解釋概念很差解釋,這裏我回答的思路是舉例子,異步說白了就是任務不須要同步進行,好比用爬蟲爬取一個數據,而後再保存數據,接下來再去爬另外一個數據,這是同步;異步就是爬蟲不用等着數據保存好,爬完一個直接去爬另外一個,數據保存的事情交給別的邏輯去慢慢處理;阻塞和非阻塞也是基於此的,同步的狀況下會阻塞爬蟲,爬蟲須要等待數據的保存。(這部分是我本身的理解,建議看看專業的說明)網絡
以前徹底沒想過這個的問題,個人回答就是按一個差很少的精度去比較,好比到小數點第幾位以前都是相等的,就認爲兩個數相等,或者Math
模塊裏可能有什麼方法能夠去精確對比,當時是這麼回答的,如今查了一下基本也是這個思路,Math
模塊中有一個isclose
函數用來判斷兩個浮點數的值是否接近或相等
MySQL
的索引通常是怎麼實現的?B-Tree
(通常是B+Tree
)和Hash
,而後再簡單介紹一下。
Flask
的實現有了解嗎?只知道WSGI
,其他的不清楚,暫時還沒去深刻看Flask
的源碼。
跨了大半個北京城,還跟leader撒謊請假,也是心累。筆試題以下:
咩咩咩?不知道。(回來查了是25%
,具體能夠自行搜索,反正脫離數學N
年是不管如何都想不出來的)。
RAND7()
隨機返回1~7
,使用它構造一個RAND10()
函數隨機返回10
。一開始寫了個函數以下:
def rand10(): a = rand7() 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() # res等機率隨機1~49 if res < 40: # 只取出0~39共40個數,每一個數出現的機率也是相等的 return res % 10 + 1 # 隨機輸出1~10
JAVA
代碼改爲Python
,並增長單元測試。JAVA
代碼自己很簡單,即便沒學過也能看懂,改後的Python
代碼以下:
class MyClass: __current = 0 def next(self): MyClass.__current += 1 return MyClass.__current
可是對於單元測試則僅限於聽過的地步,須要用到unittest
,好像也有別的模塊。
沒啥好說的,一行代碼必然是列表生成式,假設數組是nums
,代碼以下:
sorted([n for n in nums if n % 2]) + sorted([n for n in nums if not n % 2], reverse=True)
單例就是說一個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
SQL
獲取點贊數最多的10
個問題;我平時也就用數據庫查數據,在設計數據庫上沒有深刻研究,所以的我答案就簡單寫了有哪些表,字段分別是什麼,至於題中的條件限制,就交由後臺的程序邏輯去處理,而不是在數據庫設計層面去限制。由於是本身設計的表結構,SQL
自己也就不難。
pop/push
及max
方法,要求能在O(1)
時間內取得最大值。LeetCode
原題啊!list
怎麼能O(1)
取得最大值呢,無非是空間換時間,每push
一個數就同時記錄當前的最大值。
呵呵。
我答的是數據庫,由於好多沒必要要或者可使用緩存的地方也頻繁操做數據庫,並且是使用的ORM
,但以前從哪看到ORM
不能確保對應的SQL
語句是最優的,所以能夠嘗試使用原生SQL
或者增長Redis
緩存。
(話說這不是運維的工做麼。。。)呃,就是增長服務器啊,而後前面加一層負載均衡,把請求分配給不一樣的服務器。(那不一樣的服務器怎麼使用你的Session
?)再加個Session
服務器。
LeetCode
纔開始刷,就舉了兩道Codewars
上的題目,我也真是傻了,真的舉了兩道有意思(但本身沒作好)的題。
其餘就無非是一些爲何想作後端開發之類的問題了,我的感受題目大部分也挺簡單的,個人表現也算中規中矩吧,但面試官說我要進一步增強基礎知識,具體哪方面(數據庫、網絡協議、仍是Python
自己)又語焉不詳。