去年的Python工程師面試題

這是一年前應聘一家遊戲公司後臺Python工程師的筆試題,由對方發給我,我在當晚花了幾個小時查資料做的。

那會對Python基本就屬於有點基礎語法的認識,發在百度文庫居然瀏覽量-下載量=1,發在blog裏面show下。黑顏色以外的部分以及所有答案是我回答的。



[講解]
什麼是 lambda函數?它有什麼好處?另外 python在函數式編程方面提供了些什麼函數和語
法?
Lambda 是一種單行的表達式函數,主要好處就是能簡化代碼,不需要定義一些簡單功能的
函數
Python 中,函數可以作爲參數傳入,也可以作爲結果被返回
提供了 lambada 語法方便編程
提供了以下內置函數:
filter(function, iterable)
map(function, iterable, ...)
reduce(function, iterable[, initializer])
zip([iterable, ...])
詳細說說 tuplelistdict 的用法,它們的特點;
三者的用法可參考:http://blog.sina.com.cn/s/blog_540775a30101bhhx.html
Tuple 一旦創建即不能進行修改(刪除/增加/修改元素),但是其訪問效率較高,且能保護常
量數據不被更改,所以適合於存儲一些常量數據
List 適合於需要動態增刪改的數據集,但不適用於需要查找的使用;因爲其實現類似於 C
中的數組,也不適應於需要經常在 list 之間插入數據的場景。
Dict 就像很多語言中的 hash,可能在內部使用了紅黑樹或者其他數據結構存儲了數據,以
達到快速定位的功能
說說 python 中裝飾器、迭代器的用法;描述下 dict items() 方法與 iteritems() 方法的不
同;
裝飾器即是裝飾器在 python 中的使用,主要用於爲類/函數動態添加新的功能,python
的用法如下:
def deco(func):
def _deco():
print("before myfunc() called.")
func()
print(" after myfunc() called.")
# 不需要返回func,實際上應返回原函數的返回值
return _deco
@deco
def myfunc():
print(" myfunc() called.")
return 'ok'
myfunc()
如果 obj 實現了__iter__以及 Next(), 我們可以使用 iter(obj)來獲取迭代器: 並可以使用如下
方法進行訪問:
fetch = iter(seq)
while 1:
try:
i = fetch.next()
except StopIteration:
break
#do_something_to(i)
dict items()返回的是一個包含<KEY, VALUE>pair list 對象
dict iteritems()返回的是一個可以遍歷<KEY, VALUE>pair的迭代器 iterator,C++中迭代器
類似,可以使用一些通用函數對其進行遍歷處理
知道 greenletstackless 嗎?說說你對線程、協程、進程的理解;
greenlet 類似於 goto 語句的功能,但是在函數或者說微線程之間實現了跳轉,且在結束後
能自動回到調用處
一個 “greenlet” 是一個很小的獨立微線程。可以把它想像成一個堆棧幀,棧底是初始調用,
而棧頂是當前 greenlet 的暫停位置。你使用 greenlet 創建一堆這樣的堆棧,然後在他們之間
跳轉執行。跳轉不是絕對的:一個 greenlet 必須選擇跳轉到選擇好的另一個 greenlet,這會
讓前一個掛起,而後一個恢復。兩 個 greenlet 之間的跳轉稱爲 切換(switch)
當你創建一個 greenlet,它得到一個初始化過的空堆棧;當你第一次切換到它,他會啓動指
定的函數,然後切換跳出 greenlet。當最終棧底 函數結束時, greenlet 的堆棧又編程空的了,
greenlet 也就死掉了。greenlet 也會因爲一個未捕捉的異常死掉。
stackless python 的一個協程實現版本?還沒有仔細看。
線程,進程是比較經典的概念了,進程可以包括文件句柄等系統資源的單位,線程一般是
現代 CPU 的基本調度單位
而協程是通過用戶調度,切換的消耗要小於線程/進程的切換。
協程的優勢在於可以自己控制切換,適合於順序執行的一些情況,而線程更加適合並行處
理數據的情況;同時使用協程可以控制調度,減少切換的消耗。
講講對 unicode, gbk, utf-8 等的理解,python2.x 是如何處理編碼問題?
UnicodeGBK 是對字符編碼值的規定,兩者並不兼容。而 UTF-8 則是對於 Unicode 編碼的具
體表現形式
Unicode 有多種表達方式,包括 UCS2,UCS4,UTF-8,UTF-7;其中手機短信就是由 ASCII(只存在
ASCII 編碼)UCS2 編碼混合(存在任意個非 ASCII 編碼)
UTF-8 使用 1-4 個字節來存儲單個字符,應該是目前最流行的字符集。Linux 默認字符集就是
UTF-8
一般代碼頭行加入 # -*- coding: utf-8 -*-
保證 python 編輯器的編碼正確,或使用 u’中文保證被轉換成 unicode

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章