python常見面試題

轉(zhuǎn)自http://blog.csdn.net/jerry_1126/article/details/44023949

  1. pythonic 簡潔乘客、靈活炸茧、可讀性強(qiáng)
#交換兩個變量值    
a,b = b,a    
#去掉list中的重復(fù)元素    
old_list = [1,1,1,3,4]    
new_list = list(set(old_list))      
#翻轉(zhuǎn)一個字符串    
s = 'abcde'    
ss = s[::-1]     
#用兩個元素之間有對應(yīng)關(guān)系的list構(gòu)造一個dict    
names = ['jianpx', 'yue']    
ages = [23, 40]    
m = dict(zip(names,ages))     
#將數(shù)量較多的字符串相連镇眷,如何效率較高羞反,為什么    
fruits = ['apple', 'banana']    
result = ''.join(fruits)    
#python字符串效率問題之一就是在連接字符串的時(shí)候使用‘+’號观游,例如 s = ‘s1’ + ‘s2’ + ‘s3’ + ...+’sN’稽屏,總共將N個字符串連接起來, 但是使用+號的話抛虫,python需要申請N-1次內(nèi)存空間松靡, 然后進(jìn)行字符串拷貝。原因是字符串對象PyStringObject在python當(dāng)中是不可變 對象建椰,所以每當(dāng)需要合并兩個字符串的時(shí)候雕欺,就要重新申請一個新的內(nèi)存空間 (大小為兩個字符串長度之和)來給這個合并之后的新字符串,然后進(jìn)行拷貝棉姐。 所以用+號效率非常低屠列。建議在連接字符串的時(shí)候使用字符串本身的方法 join(list),這個方法能提高效率伞矩,原因是它只是申請了一次內(nèi)存空間笛洛, 因?yàn)樗梢员闅vlist中的元素計(jì)算出總共需要申請的內(nèi)存空間的大小,一次申請完乃坤。
  1. python調(diào)試工具
PyChecker是一個python代碼的靜態(tài)分析工具苛让,它可以幫助查找python代碼的bug, 會對代碼的復(fù)雜度和格式提出警告    
Pylint   是另外一個工具可以進(jìn)行coding standard檢查。  
  1. GIL
什么是GIL(Global Interpreter Lock)全局解釋器鎖? 簡單地說就是:  
每一個interpreter進(jìn)程,只能同時(shí)僅有一個線程來執(zhí)行, 獲得相關(guān)的鎖, 存取相關(guān)的資源.  
那么很容易就會發(fā)現(xiàn),如果一個interpreter進(jìn)程只能有一個線程來執(zhí)行,   
多線程的并發(fā)則成為不可能, 即使這幾個線程之間不存在資源的競爭.  
從理論上講,我們要盡可能地使程序更加并行, 能夠充分利用多核的功能.  
  1. dict中的items和iteritems
>>> D = {'a':1,'b':2,'c':3,'d':4}    
>>> D.items()          #一次性取出所有    
[('a', 1), ('c', 3), ('b', 2), ('d', 4)]    
>>> D.iteritems()      #迭代對象湿诊,每次取出一個狱杰。用for循環(huán)遍歷出來;    
<dictionary-itemiterator object at 0x00000000026243B8>    
>>> for i in D.iteritems():    
 print i,    
('a', 1) ('c', 3) ('b', 2) ('d', 4)    
>>> for k,v in D.iteritems():    
print k,    
a c b d    
總結(jié):   
1.一般iteritems()迭代的辦法比items()要快枫吧,特別是數(shù)據(jù)庫比較大時(shí)浦旱。  
2.在Python3中一般取消前者函數(shù)  
  1. with statements
>>> with open('text.txt') as myfile:    
while True:    
line = myfile.readline()    
if not line:    
break    
print line,    
with語句使用所謂的上下文管理器對代碼塊進(jìn)行包裝宇色,允許上下文管理器實(shí)現(xiàn)一些設(shè)置和清理操作九杂。    
例如:文件可以作為上下文管理器使用,它們可以關(guān)閉自身作為清理的一部分宣蠕。    
NOTE:在PYTHON2.5中例隆,需要使用from __future__ import with_statement進(jìn)行with語句的導(dǎo)入    
  1. python生成制定長度的斐波那契數(shù)列
def fibs(x):  
    result = [0, 1]  
    for index in range(x-2):  
        result.append(result[-2]+result[-1])  
    return result  
if __name__=='__main__':  
    num = input('Enter one number: ')  
    print fibs(num)  
  1. python生成隨機(jī)數(shù)
>>> import random  
>>> random.random()  
0.29495314937268713  
>>> random.randint(1,11)  
8  
>>> random.choice(range(11))  
3  
  1. 反序迭代一個序列
如果是一個list, 最快的解決方案是:  
list.reverse()  
try:  
    for x in list:  
        “do something with x”  
finally:  
    list.reverse()  
如果不是list, 最通用但是稍慢的解決方案是:  
for i in range(len(sequence)-1, -1, -1):  
x = sequence[i]  
  1. 如何定義一個函數(shù)
def func(arg, *args, **kwagrs):   #普通函數(shù)  
    func_body  
    return   
lambda x: x **2                   #匿名函數(shù)  
  1. <.*?> 和<.*>在正則匹配中的含義
import re  
s = ‘<html><head><title>Title</title>’  
print(re.match(‘<.*>’, s).group())  
會返回一個匹配<html><head><title>Title</title>而不是<html>   
而  
import re  
s = ‘<html><head><title>Title</title>’  
print(re.match(‘<.*?>’, s).group())    
則會返回<html>  
<.*>這種匹配稱作貪心匹配 <.*?>稱作非貪心匹配  
  1. search與match的區(qū)別
>>> import re  
>>> re.match(r'python','Programing Python, should be pythonic')  
>>> obj1 = re.match(r'python','Programing Python, should be pythonic')  #返回None  
>>> obj2 = re.search(r'python','Programing Python, should be pythonic') #找到pythonic  
>>> obj2.group()  
'python'  
#re.match只匹配字符串的開始,如果字符串開始不符合正則表達(dá)式抢蚀,則匹配失敗镀层,函數(shù)返回None;  
#re.search匹配整個字符串,直到找到一個匹配唱逢。 
  1. 中文亂碼問題
在Python3中吴侦,對中文進(jìn)行了全面的支持,但在Python2.x中需要進(jìn)行相關(guān)的設(shè)置才能使用中文坞古。否則會出現(xiàn)亂碼备韧。  
Python默認(rèn)采取的ASCII編碼,字母痪枫、標(biāo)點(diǎn)和其他字符只使用一個字節(jié)來表示织堂,但對于中文字符來說,一個字節(jié)滿足不了需求奶陈。  
為了能在計(jì)算機(jī)中表示所有的中文字符易阳,中文編碼采用兩個字節(jié)表示。如果中文編碼和ASCII混合使用的話吃粒,就會導(dǎo)致解碼錯誤潦俺,從而才生亂碼。  
解決辦法:  
交互式命令中:一般不會出現(xiàn)亂碼徐勃,無需做處理   
py腳本文件中:跨字符集必須做設(shè)置黑竞,否則亂碼  
首先在開頭一句添加:  
# coding = utf-8    
# 或    
# coding = UTF-8    
# 或    
# -*- coding: utf-8 -*-   
其次需將文件保存為UTF-8的格式!  
最后: s.decode('utf-8').encode('gbk')  
  1. lambda函數(shù)疏旨,本實(shí)例實(shí)現(xiàn)了求素?cái)?shù)
函數(shù)使用:  
代碼塊重復(fù)很魂,這時(shí)候必須考慮到函數(shù),降低程序的冗余度  
代碼塊復(fù)雜檐涝,這時(shí)候必須考慮到函數(shù)遏匆,降低程序的復(fù)雜度  
Python有兩種函數(shù),一種是def定義,一種是lambda函數(shù)()  
當(dāng)程序代碼很短谁榜,且該函數(shù)只使用一次幅聘,為了程序的簡潔,及節(jié)省變量內(nèi)存占用空間窃植,引入了匿名函數(shù)這個概念  
>>> nums = range(2,20)  
>>> for i in nums:  
        nums = filter(lambda x:x==i or x % i,nums)  
>>> nums  
[2, 3, 5, 7, 11, 13, 17, 19]  
  1. list和tuple之間的轉(zhuǎn)換
#From list to Tuple                   
tuple(a_list)     
#From Tuple to List  
def to_list(t):   
  return [i if not isinstance(i,tuple) else to_list(i) for i in t]  
  1. 刪除list中的重復(fù)元素
>>> L1 = [4,1,3,2,3,5,1]  
>>> L2 = []  
>>> [L2.append(i) for i in L1 if i not in L2]  
>>> print L2  
[4, 1, 3, 2, 5]  
  1. python中的類型轉(zhuǎn)換
>>> int('1234')                   # 將數(shù)字型字符串轉(zhuǎn)為整形  
1234  
>>> float(12)                     # 將整形或數(shù)字字符轉(zhuǎn)為浮點(diǎn)型  
12.0  
>>> str(98)                       # 將其他類型轉(zhuǎn)為字符串型  
'98'  
>>> list('abcd')                  # 將其他類型轉(zhuǎn)為列表類型  
['a', 'b', 'c', 'd']  
>>> dict.fromkeys(['name','age']) # 將其他類型轉(zhuǎn)為字典類型  
{'age': None, 'name': None}  
>>> tuple([1, 2, 3, 4])           # 將其他類型轉(zhuǎn)為元祖類型  
(1, 2, 3, 4)  
詳細(xì)類型轉(zhuǎn)換
函數(shù)                      描述  
int(x [,base])              將x轉(zhuǎn)換為一個整數(shù)  
long(x [,base] )            將x轉(zhuǎn)換為一個長整數(shù)  
float(x)                    將x轉(zhuǎn)換到一個浮點(diǎn)數(shù)  
complex(real [,imag])       創(chuàng)建一個復(fù)數(shù)  
str(x)                      將對象 x 轉(zhuǎn)換為字符串  
repr(x)                     將對象 x 轉(zhuǎn)換為表達(dá)式字符串  
eval(str)                   用來計(jì)算在字符串中的有效Python表達(dá)式,并返回一個對象  
tuple(s)                    將序列 s 轉(zhuǎn)換為一個元組  
list(s)                     將序列 s 轉(zhuǎn)換為一個列表  
set(s)                      轉(zhuǎn)換為可變集合  
dict(d)                     創(chuàng)建一個字典帝蒿。d 必須是一個序列 (key,value)元組。  
frozenset(s)                轉(zhuǎn)換為不可變集合  
chr(x)                      將一個整數(shù)轉(zhuǎn)換為一個字符  
unichr(x)                   將一個整數(shù)轉(zhuǎn)換為Unicode字符  
ord(x)                      將一個字符轉(zhuǎn)換為它的整數(shù)值  
hex(x)                      將一個整數(shù)轉(zhuǎn)換為一個十六進(jìn)制字符串  
oct(x)                      將一個整數(shù)轉(zhuǎn)換為一個八進(jìn)制字符串  
  1. 獲取python對象類型
>>> type([]);type('');type(0);type({});type(0.0);type((1,))  
<type 'list'>  
<type 'str'>  
<type 'int'>  
<type 'dict'>  
<type 'float'>  
<type 'tuple'>  
  1. copy一個對象
切片S[:]  # 注不能應(yīng)用于字典  
深淺寶貝  # 能應(yīng)用于所有序列和字典  
淺拷貝D.copy()方法  
深拷貝deepcopy(D)方法 
  1. python如何實(shí)現(xiàn)內(nèi)存管理
python內(nèi)部使用引用計(jì)數(shù)巷怜,來保持追蹤內(nèi)存中的對象葛超,Python內(nèi)部記錄了對象有多少個引用,即引用計(jì)數(shù)延塑,當(dāng)對象被創(chuàng)建時(shí)就創(chuàng)建了一個引用計(jì)數(shù)绣张,當(dāng)對象不再需要時(shí),這個對象的引用計(jì)數(shù)為0時(shí)关带,它被垃圾回收侥涵。所有這些都是自動完成,不需要像C一樣,人工干預(yù)芜飘,從而提高了程序員的效率和程序的健壯性务豺。  
  1. range函數(shù)的用法
>>> range(10)  
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  
>>> range(1, 10)  
[1, 2, 3, 4, 5, 6, 7, 8, 9]  
>>> range(0, 9, 2)  
[0, 2, 4, 6, 8]  
>>> range(99,0,-10)  
[99, 89, 79, 69, 59, 49, 39, 29, 19, 9]  
相區(qū)別的是xrange(),每次只取出一個迭代對象,如果是數(shù)據(jù)量比較大時(shí)嗦明,效率較高  
在Python3中冲呢,沒有xrange()函數(shù),其功能放在了range()函數(shù)上  
  1. 異常處理的作用
程序中出現(xiàn)異常情況時(shí)就需要異常處理招狸。比如當(dāng)你打開一個不存在的文件時(shí)敬拓。當(dāng)你的程序中有  
一些無效的語句時(shí),Python會提示你有錯誤存在裙戏。下面是一個拼寫錯誤的例子乘凸,print寫成了Print  
下面是異常最常見的幾種角色  
錯誤處理  
>>>可以在程序代碼中捕捉和相應(yīng)錯誤,或者忽略已發(fā)生的異常累榜。  
>>>如果忽略錯誤营勤,PYTHON默認(rèn)的異常處理行為將啟動:停止程序,打印錯誤信息壹罚。  
>>>如果不想啟動這種默認(rèn)行為葛作,就用try語句來捕捉異常并從異常中恢復(fù)。  
事件通知  
>>>異常也可用于發(fā)出有效狀態(tài)的信號猖凛,而不需在程序間傳遞結(jié)果標(biāo)志位赂蠢。或者刻意對其進(jìn)行測試  
特殊情況處理  
>>>有時(shí)辨泳,發(fā)生了某種很罕見的情況虱岂,很難調(diào)整代碼區(qū)處理。通常會在異常處理中處理菠红,從而省去應(yīng)對特殊情況的代碼  
終止行為  
>>>try/finally語句可確保一定會進(jìn)行需要的結(jié)束運(yùn)算第岖,無論程序是否有異常  
非常規(guī)控制流程  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市试溯,隨后出現(xiàn)的幾起案子蔑滓,更是在濱河造成了極大的恐慌,老刑警劉巖遇绞,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件键袱,死亡現(xiàn)場離奇詭異,居然都是意外死亡试读,警方通過查閱死者的電腦和手機(jī)杠纵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钩骇,“玉大人,你說我怎么就攤上這事√纫伲” “怎么了银亲?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纽匙。 經(jīng)常有香客問我务蝠,道長,這世上最難降的妖魔是什么烛缔? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任馏段,我火速辦了婚禮,結(jié)果婚禮上践瓷,老公的妹妹穿的比我還像新娘院喜。我一直安慰自己,他們只是感情好晕翠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布喷舀。 她就那樣靜靜地躺著,像睡著了一般淋肾。 火紅的嫁衣襯著肌膚如雪硫麻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天樊卓,我揣著相機(jī)與錄音拿愧,去河邊找鬼。 笑死碌尔,一個胖子當(dāng)著我的面吹牛赶掖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播七扰,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼奢赂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颈走?” 一聲冷哼從身側(cè)響起膳灶,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎立由,沒想到半個月后轧钓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锐膜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年毕箍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片道盏。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡而柑,死狀恐怖文捶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媒咳,我是刑警寧澤粹排,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站涩澡,受9級特大地震影響顽耳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妙同,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一射富、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粥帚,春花似錦胰耗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拖陆,卻和暖如春弛槐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背依啰。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工乎串, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人速警。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓叹誉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闷旧。 傳聞我的和親對象是個殘疾皇子长豁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,547評論 1 118
  • Python 是一種相當(dāng)高級的語言,通過 Python 解釋器把符合語法的程序代碼轉(zhuǎn)換成 CPU 能夠執(zhí)行的機(jī)器碼...
    Python程序媛閱讀 1,891評論 0 3
  • 個人筆記忙灼,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,680評論 0 5
  • 1匠襟、What is Python? Do you know really? ( 1 )python 是解釋型腳本語...
    Leo_0626閱讀 364評論 0 2
  • 一直想把我自己的故事寫下來,不敢寫该园。今晚終于開始動筆酸舍,自己都不知道是何種心情,本想用第三視角來描述里初,終是不擅長啃勉。那...
    隱匿者1994閱讀 369評論 0 0