這是一年前應聘一家遊戲公司後臺Python工程師的筆試題,由對方發給我,我在當晚花了幾個小時查資料做的。
那會對Python基本就屬於有點基礎語法的認識,發在百度文庫居然瀏覽量-下載量=1,發在blog裏面show下。黑顏色以外的部分以及所有答案是我回答的。
[講解]
什麼是
lambda函數?它有什麼好處?另外
python在函數式編程方面提供了些什麼函數和語
法?
Lambda
是一種單行的表達式函數,主要好處就是能簡化代碼,不需要定義一些簡單功能的
函數
在 Python
中,函數可以作爲參數傳入,也可以作爲結果被返回
提供了 lambada
語法方便編程
提供了以下內置函數:
filter(function, iterable)
map(function, iterable, ...)
reduce(function, iterable[, initializer])
zip([iterable, ...])
詳細說說
tuple、list、dict
的用法,它們的特點;
三者的用法可參考: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++中迭代器
類似,可以使用一些通用函數對其進行遍歷處理
知道
greenlet、stackless
嗎?說說你對線程、協程、進程的理解;
greenlet
類似於
goto 語句的功能,但是在函數或者說微線程之間實現了跳轉,且在結束後
能自動回到調用處
一個
“greenlet” 是一個很小的獨立微線程。可以把它想像成一個堆棧幀,棧底是初始調用,
而棧頂是當前
greenlet 的暫停位置。你使用
greenlet 創建一堆這樣的堆棧,然後在他們之間
跳轉執行。跳轉不是絕對的:一個
greenlet 必須選擇跳轉到選擇好的另一個
greenlet,這會
讓前一個掛起,而後一個恢復。兩 個
greenlet 之間的跳轉稱爲 切換(switch)
。
當你創建一個
greenlet,它得到一個初始化過的空堆棧;當你第一次切換到它,他會啓動指
定的函數,然後切換跳出
greenlet。當最終棧底 函數結束時,
greenlet 的堆棧又編程空的了,
而
greenlet 也就死掉了。greenlet
也會因爲一個未捕捉的異常死掉。
stackless
是
python 的一個協程實現版本?還沒有仔細看。
線程,進程是比較經典的概念了,進程可以包括文件句柄等系統資源的單位,線程一般是
現代
CPU 的基本調度單位
而協程是通過用戶調度,切換的消耗要小於線程/進程的切換。
協程的優勢在於可以自己控制切換,適合於順序執行的一些情況,而線程更加適合並行處
理數據的情況;同時使用協程可以控制調度,減少切換的消耗。
講講對
unicode, gbk, utf-8 等的理解,python2.x
是如何處理編碼問題?
Unicode,GBK
是對字符編碼值的規定,兩者並不兼容。而
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