Steven最近在考慮換工作,突然接到了平安的面試邀請,也沒怎麼特別的準備就跑過去面試了,結果聊了一個小時之後被無情刷掉,不過還是想把這次的一些考點放在這裏供大家以後參考。btw:面試我的竟然是個妹子,剛開始進來的時候我還以爲先是HR面,結果人家一開始問技術問題,肅然起敬。
先是問道:
1.Python裏面的數據類型有哪些?
分析:其實這個問題並不難,除了基礎的int/float/bool/字符串/None之外就是Python特有的字典/列表/元組/set 類型
2.然後面試官接着問:那麼你能告訴我list和set的區別嗎?
分析:這個問題問的比較細,因爲平時沒有用到set類型,所以當時回答不上來,事後我去網上查了一些,其實也很簡單,list是有序的數組,可以有重複的數據,可以通過下標來訪問,但是set是無序的,但是數據不允許重複,不可通過下標來訪問,另外一點set語句執行效率更高。我們可以做一個測試:
python -m timeit -n 1000 "[x for x in range(1000) if x in range(500,1500)]"
輸出結果如下:
可以清晰的看到:執行1000次循環足足花了18s的時間
再用set來測試一下:
python -m timeit -n 1000 "set(range(1000)).intersection(range(500,1500))"
set語句幾乎是在我敲下回車鍵之後瞬間執行完的。所以他們的效率不可同日而語。
當時因爲不清楚set類型的區別,所以我說的是List和dict的區別,list佔用空間小,但是插入和查詢數據更慢,然後面試官緊追不捨,爲什麼dict的效率更高一些呢,又把我問懵了,後來我查了一些,其實是因爲dict 是參考的hashmap的方式,時間複雜度O1,但是list的複雜度是On,自然dict的查詢和插入效率更高。
3.因爲我的簡歷上寫着用過Selenium和BeautifulSoup,面試官問道:那你知道這兩個的區別嗎?
說真的,這個是之前上數據分析課的時候老師講過,我真的忘了,具體的大家感興趣的話可以自行搜狗,我這裏就不誤導大家了。
part II 開始寫幾個程序吧
4.給出幾個數字0,1,1,2,3,5,8 ,寫一個函數來輸出第n個數字。
分析:這個很明顯的是求Fibbonacci數列的,直接寫:
def fib(n):
if n ==0:
return 0
elif n==1:
return 1
else:
return fib(n-2) + fib(n-1)
5.請寫一個裝飾器
分析:裝飾器是Python比較高級一點的特性,是通過閉包的方式來實現的,主要是防止重複修改代碼。
def login(fn):
def inner():
username = raw_input('請輸入用戶名:')
pwd = raw_input('請輸入密碼:')
if username == 'admin' and pwd == '123456':
fn()
else:
print('登陸失敗,請重試')
return inner
@login
def delete():
print("刪除中,請稍後")
delete()
6.給出一個list,請根據list裏面字典的值進行排序。
分析:這個考察的是我們對於基礎的數據類型的使用,做法也有很多種,但是當時有限的時間內,我沒有足夠的時間思考,所以給出的答案應該是錯誤的。後面研究之後 發現了一個可以很好解決這個問題的解法。
a= [{'a':1},{'b':3},{'c':2}]
c = {}
for l in a:
c.update(l)
c2 = sorted(c.items(),key=lambda x:x[1])
7.list列表去重的問題:
給定一個列表['a','a','b','b','c'],請給出去除重複值之後的列表
分析:前面也提到之前因爲是沒有接觸過set的,所以這裏面有個最簡單的set解決方式,我不知道,於是只能通過for循環的方式來解決問題,但是面試官顯然對我當時的解法不滿意。
解答:
lis1 = ['a','a','b','b','c']
s = set(lis1)
lis2 = list(s)
解法二:我們可以藉助字典的方式來解決:
d1 = dict.fromkeys(lis1)
lis2 = list(d1)
代碼的問題到這裏就結束了,感覺做的面試官不算太滿意
part III、聊項目
基於我之前的項目,面試官問我做的項目裏面設計了哪些表,js用的怎麼樣,Ajax在這個項目裏面用到沒有,其實Ajax之前開發web項目用過,但是後來不熟悉了,所以這個項目沒用到。
最後聊到的一個項目裏面她問到這個項目裏面用到哪些服務,我說了Mysql、Redis、RabbitMQ,最後一個問題是這些服務之間用的什麼協議呢? 我說是HTTP協議,她說不對,我有點懵,這個我真沒關注到,後來查了一下是說,RabbitMQ和其他系統通訊用的比較多的是STOMP/AMQP1.0等等。
後面就是讓我問她有沒有什麼問題,面試就這樣結束了,持續了將近一個小時。但是因爲敗在了一些細節上,所以總結出來的是什麼呢?越是大公司會越是注重基礎,所以大家在平常的工作和學習中一定要注意基礎知識的積累,及時查漏補缺。這樣才能在機會到來的時候一躍而起。