60道硬核Python面試題,論面霸是如何煉成的

說(shuō)實(shí)話,都9012了,還在用這種背題式的方法來(lái)考核程序員,實(shí)在太不切合程序員的實(shí)際工作了……
文末給出了一種更極客的考核方式,Talk is cheap,Show me the code(寫代碼,憋bb) —— 寫得出工作代碼,就說(shuō)明你有工作能力;寫不出,書背的再溜也不行
面試官只需要:節(jié)選一段工作代碼,然后把原有代碼刪除,讓面試者自己寫代碼實(shí)現(xiàn);或是保留一段有bug的代碼,讓面試者修改即可 —— 這都是最常見(jiàn)的程序員工作場(chǎng)景,最能考核面試者的真實(shí)代碼能力;而且題目隨處可見(jiàn),扒一下你的產(chǎn)品代碼就能找到。
不用付出10個(gè)下午尷尬而不失禮貌的微笑,招聘的效率、準(zhǔn)確率、靠譜程度都會(huì)更高,面試者和面試官也都會(huì)更省心,相信更多企業(yè)能發(fā)現(xiàn)這個(gè)系統(tǒng)的價(jià)值。
(正題開(kāi)始:精選自個(gè)大公司經(jīng)典面試題,版權(quán)歸原作者所有。)
1. Python 的特點(diǎn)和優(yōu)點(diǎn)是什么?
答案:太長(zhǎng),略
2. 什么是lambda函數(shù)?它有什么好處?
lambda 函數(shù)是一個(gè)可以接收任意多個(gè)參數(shù)(包括可選參數(shù))并且返回單個(gè)表達(dá)式值的函數(shù)。 lambda 函數(shù)不能包含命令,它們所包含的表達(dá)式不能超過(guò)一個(gè)。不要試圖向lambda函數(shù)中塞入太多的東西;如果你需要更復(fù)雜的東西,應(yīng)該定義一個(gè)普通函數(shù),然后想讓它多長(zhǎng)就多長(zhǎng)。
lambda函數(shù)可以接受任意個(gè)參數(shù),包括可選參數(shù),但是表達(dá)式只有一個(gè):
>>> g = lambda x, y: xy* >>> g(3,4) 12 >>> g = lambda x, y=0, z=0: x+y+z >>> g(1) 1 >>> g(3, 4, 7) 14
也能夠直接使用lambda函數(shù),不把它賦值給變量:
>>> (lambdax,y=0,z=0:x+y+z)(3,5,6) 14
如果你的函數(shù)非常簡(jiǎn)單,只有一個(gè)表達(dá)式,不包含命令,可以考慮lambda函數(shù)。否則,你還是定義函數(shù)才對(duì),畢竟函數(shù)沒(méi)有這么多限制。
3. 深拷貝和淺拷貝的區(qū)別是什么?
深拷貝是將對(duì)象本身復(fù)制給另一個(gè)對(duì)象。這意味著如果對(duì)對(duì)象的副本進(jìn)行更改時(shí)不會(huì)影響原對(duì)象。在 Python 中,我們使用 deepcopy()函數(shù)進(jìn)行深拷貝,使用方法如下:
>>> import copy >>> b=copy.deepcopy(a)
淺拷貝是將對(duì)象的引用復(fù)制給另一個(gè)對(duì)象。因此,如果我們?cè)诟北局羞M(jìn)行更改,則會(huì)影響原對(duì)象。使用 copy()函數(shù)進(jìn)行淺拷貝,使用方法如下:
>>> b=copy.copy(a)
4. Python異常處理的用法和作用
- 執(zhí)行try下的語(yǔ)句,如果引發(fā)異常,則執(zhí)行過(guò)程會(huì)跳到except語(yǔ)句。對(duì)每個(gè)except分支順序嘗試執(zhí)行,如果引發(fā)的異常與except中的異常組匹配,執(zhí)行相應(yīng)的語(yǔ)句。
- 如果所有的except都不匹配,則異常會(huì)傳遞到下一個(gè)調(diào)用本代碼的最高層try代碼中。
- try下的語(yǔ)句正常執(zhí)行,則執(zhí)行else塊代碼。如果發(fā)生異常,就不會(huì)執(zhí)行
- 如果存在finally語(yǔ)句,最后總是會(huì)執(zhí)行。
5. Python里面如何生成隨機(jī)數(shù)?
答:random模塊
**隨機(jī)整數(shù):**random.randint(a,b):返回隨機(jī)整數(shù)x,a<=x<=b
random.randrange(start,stop,[,step]):返回一個(gè)范圍在(start,stop,step)之間的隨機(jī)整數(shù),不包括結(jié)束值。
**隨機(jī)實(shí)數(shù):**random.random( ):返回0到1之間的浮點(diǎn)數(shù)
random.uniform(a,b):返回指定范圍內(nèi)的浮點(diǎn)數(shù)
6. 如何在Python中實(shí)現(xiàn)多線程?
**a. **Python有一個(gè)multi-threading包,但是如果你想讓multi-thread加速你的代碼,那么使用它通常不是一個(gè)好主意。
b. Python有一個(gè)名為GlobalInterpreter Lock(GIL)的結(jié)構(gòu)。 GIL確保只有一個(gè)“線程”可以在任何時(shí)候執(zhí)行。一個(gè)線程獲取GIL,做一點(diǎn)工作,然后將GIL傳遞到下一個(gè)線程。
c. 這種情況很快發(fā)生,因此對(duì)于人眼看來(lái),您的線程似乎并行執(zhí)行,但它們實(shí)際上只是輪流使用相同的CPU核心。
d. 所有這些GIL傳遞都增加了執(zhí)行的開(kāi)銷。這意味著如果您想讓代碼運(yùn)行得更快,那么使用線程包通常不是一個(gè)好主意。
7. 如何在python中使用三元運(yùn)算符?
三元運(yùn)算符是用于顯示條件語(yǔ)句的運(yùn)算符。這包含用于評(píng)估為true或false值的語(yǔ)句。
句法:三元操作符語(yǔ)法如下,
[on_true] if [expression] else [on_false]
例:
x,y = 25,50 big = x if x < y else y
如果x <y為真,則返回值為big= x,如果不正確則返回big = y作為結(jié)果。
8. 用一個(gè)例子解釋Python中的繼承。
繼承允許一個(gè)類獲得另一個(gè)類的所有成員(比如屬性和方法)。繼承提供代碼可重用性,使創(chuàng)建和維護(hù)應(yīng)用程序變得更容易。我們繼承的類稱為super-class,繼承的類稱為派生/子類。
以下是Python支持的不同類型的繼承:
**a. **單一繼承 - 派生類獲取單個(gè)超類的成員。
b. Multi-level繼承 - 從基類base1繼承的派生類d1,d2繼承自base2。
c. 分層繼承 - 從一個(gè)基類可以繼承任意數(shù)量的子類
d. 多重繼承 - 派生類從多個(gè)基類繼承。
9. 解釋Flask是什么及其好處?
Flask是基于“Werkzeug,Jinja2和良好意圖”BSD許可證的Python網(wǎng)絡(luò)微框架。 Werkzeug和Jinja2是它的兩個(gè)依賴項(xiàng)。這意味著它對(duì)外部庫(kù)幾乎沒(méi)有依賴性。它使框架變得輕盈,只是少量依賴于更新和更少的安全性錯(cuò)誤。
會(huì)話基本上允許您記住從一個(gè)請(qǐng)求到另一個(gè)請(qǐng)求的信息。在flask中,會(huì)話使用簽名的cookie,以便用戶可以查看會(huì)話內(nèi)容并進(jìn)行修改。當(dāng)且僅當(dāng)有密鑰Flask.secret_key,用戶可以修改會(huì)話。
10. Python中的字典是什么?
Python中的內(nèi)置數(shù)據(jù)類型稱為字典。它定義了鍵和值之間的one-to-one關(guān)系。字典包含一對(duì)鍵及其對(duì)應(yīng)的值。字典由鍵來(lái)索引。
我們來(lái)舉個(gè)例子:
以下示例包含一些鍵,Country, Capital & PM,它們的相應(yīng)值分別是印度,德里和莫迪。
dict={‘Country’:‘India’,‘Capital’:‘Delhi’,‘PM’:‘Modi’} print dict[Country] India print dict[Capital] Delhi print dict[PM] Modi
11. 什么是負(fù)指數(shù),為什么使用它們?
Python中的序列是索引的,它由正數(shù)和負(fù)數(shù)組成。正的數(shù)字使用’0’作為第一個(gè)索引,'1’作為第二個(gè)索引,以此類推。
負(fù)數(shù)的索引從’-1’開(kāi)始,表示序列中的最后一個(gè)索引,’ - 2’作為倒數(shù)第二個(gè)索引,依次類推。
12. 如何用Python來(lái)進(jìn)行查詢和替換一個(gè)文本字符串?
可以使用sub()方法來(lái)進(jìn)行查詢和替換,sub方法的格式為:
a. sub(replacement, string[,count=0])
b. replacement是被替換成的文本
c. string是需要被替換的文本
d. count是一個(gè)可選參數(shù),指最大被替換的數(shù)量
13. 解釋一下python的and-or語(yǔ)法
與C表達(dá)式 bool ? a : b類似,但是bool and a or b,當(dāng) a 為假時(shí),不會(huì)象C表達(dá)式 bool ? a : b 一樣工作
應(yīng)該將 and-or 技巧封裝成一個(gè)函數(shù):
defchoose(bool, a,b):return(booland[a]or[b])[0]
因?yàn)?[a] 是一個(gè)非空列表,它永遠(yuǎn)不會(huì)為假。甚至 a 是 0 或 ‘’ 或其它假值,列表[a]為真,因?yàn)樗幸粋€(gè)元素。
14. 請(qǐng)寫出一段Python代碼實(shí)現(xiàn)刪除一個(gè)list里面的重復(fù)元素
1,使用set函數(shù),set(list)
2,使用字典函數(shù),
>>>a=[1,2,4,2,4,5,6,5,7,8,9,0] >>> b={} >>>b=b.fromkeys(a) >>>c=list(b.keys()) >>> c
15. 單引號(hào),雙引號(hào),三引號(hào)的區(qū)別?
單引號(hào)和雙引號(hào)是等效的,如果要換行,需要符號(hào)(),三引號(hào)則可以直接換行,并且可以包含注釋
如果要表示Let’s go 這個(gè)字符串
單引號(hào):s4 = ‘Let\’s go’
**雙引號(hào):**s5 = “Let’s go”
s6 = ‘I realy like“python”!’
這就是單引號(hào)和雙引號(hào)都可以表示字符串的原因了。
16. 當(dāng)退出 Python 時(shí)是否釋放所有內(nèi)存分配?
答案是否定的。那些具有對(duì)象循環(huán)引用或者全局命名空間引用的變量,在 Python 退出是往往不會(huì)被釋放
另外不會(huì)釋放 C 庫(kù)保留的部分內(nèi)容。
17. Python里面search()和match()的區(qū)別?
match()函數(shù)只檢測(cè)RE是不是在string的開(kāi)始位置匹配,search()會(huì)掃描整個(gè)string查找匹配, 也就是說(shuō)match()只有在0位置匹配成功的話才有返回,如果不是開(kāi)始位置匹配成功的話,match()就返回none 。
18. 如何在Python中隨機(jī)化列表中的項(xiàng)目?
考慮下面顯示的示例:
from random import shuffle x = [‘Keep’, ‘The’, ‘Blue’, ‘Flag’,‘Flying’, ‘High’] shuffle(x) print(x)
以下代碼的輸出如下。
[‘Flying’, ‘Keep’, ‘Blue’, ‘High’, ‘The’,‘Flag’]
19. 在python中編譯和鏈接的過(guò)程是什么?
編譯和鏈接允許正確編譯新擴(kuò)展而不會(huì)出現(xiàn)任何錯(cuò)誤,并且只有在通過(guò)編譯過(guò)程時(shí)才能進(jìn)行鏈接。如果使用動(dòng)態(tài)加載,則它取決于系統(tǒng)提供的樣式。 python解釋器可用于提供配置設(shè)置文件的動(dòng)態(tài)加載,并將重建解釋器。
這需要的步驟如下:
a. 使用任何名稱以及系統(tǒng)編譯器支持的任何語(yǔ)言創(chuàng)建文件。例如file.c或file.cpp
b. 將此文件放在正在使用的發(fā)行版的Modules /目錄中。
c. 在Modules /目錄中存在的Setup.local文件中添加一行。
d. 使用spam file.o運(yùn)行該文件
e. 成功運(yùn)行此重建解釋程序后,在top-level目錄中使用make命令。
f. 如果文件已更改,則使用命令“make Makefile”運(yùn)行rebuildMakefile。
20. Python解釋“re”模塊的split(), sub(), subn()方法。
要修改字符串,Python的“re”模塊提供了3種方法。他們是:
split() - 使用正則表達(dá)式將“split”給定字符串放入列表中。
sub() - 查找正則表達(dá)式模式匹配的所有子字符串,然后用不同的字符串替換它們
subn() - 它類似于 sub(),并且還返回新字符串和替換的序號(hào)。
21. range和xrange之間有什么區(qū)別?
在大多數(shù)情況下,xrange和range在功能方面完全相同,它們都提供了一種生成整數(shù)列表供您使用的方法。唯一的區(qū)別是range返回一個(gè)Python列表對(duì)象,xrange返回一個(gè)xrange對(duì)象。
這意味著xrange實(shí)際上并不像run-time那樣生成靜態(tài)列表。它使用稱為yielding的特殊技術(shù)根據(jù)需要?jiǎng)?chuàng)建值。該技術(shù)與一種稱為生成器的對(duì)象一起使用。這意味著,如果你有一個(gè)非常巨大的范圍,你想生成一個(gè)列表,比如10億,xrange就是要使用的功能。
如果你有一個(gè)真正的內(nèi)存敏感系統(tǒng),例如你正在使用的手機(jī),尤其如此,因?yàn)閞ange將使用盡可能多的內(nèi)存來(lái)創(chuàng)建整數(shù)數(shù)組,這可能導(dǎo)致內(nèi)存錯(cuò)誤并導(dǎo)致崩潰程序。
22. Django,Pyramid和Flask之間的差異。
Flask是“microframework”,主要用于具有更簡(jiǎn)單要求的小型應(yīng)用程序。在Flask中,您必須使用外部庫(kù)。
Pyramid適用于大型應(yīng)用程序。它提供了靈活性,并允許開(kāi)發(fā)人員為他們的項(xiàng)目使用正確的工具。開(kāi)發(fā)人員可以選擇數(shù)據(jù)庫(kù),URL結(jié)構(gòu),模板樣式等。
Django也可以像Pyramid一樣用于更大的應(yīng)用程序。
23. 列出Django中的繼承樣式。
在Django中,有三種可能的繼承樣式:
**抽象基類:**當(dāng)您只希望父類包含您不想為每個(gè)子模型鍵入的信息時(shí),使用此樣式。
Multi-table繼承:使用此樣式如果您是sub-classing現(xiàn)有模型并且需要每個(gè)模型都有自己的數(shù)據(jù)庫(kù)表。
**代理模型:**您可以使用此模型,如果您只想修改模型的Python級(jí)別行為,而無(wú)需更改模型的字段。
24. 什么是Python monkey補(bǔ)?。?/strong>
在Python中,術(shù)語(yǔ)monkey補(bǔ)丁僅指run-time上的類或模塊的動(dòng)態(tài)修改。
考慮以下示例:
# m.py class MyClass: def f(self): print “f()”
然后我們可以像這樣運(yùn)行monkey-patch測(cè)試:
import m def monkey_f(self): print “monkey_f()” m.MyClass.f = monkey_f obj = m.MyClass() obj.f()
輸出如下:
monkey_f()
我們可以看到,在模塊之外,我們確實(shí)對(duì)函數(shù)f()的行為做了一些改變,實(shí)際執(zhí)行的是函數(shù)monkey_f(),。
25. 有兩個(gè)序列a,b,大小都為n,序列元素的值任意整形數(shù),無(wú)序?
要求:通過(guò)交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。
1. 將兩序列合并為一個(gè)序列,并排序,為序列Source
2. 拿出最大元素Big,次大的元素Small
3. 在余下的序列S[:-2]進(jìn)行平分,得到序列max,min
4. 將Small加到max序列,將Big加大min序列,重新計(jì)算新序列和,和大的為max,小的為min。
26. 如何用Python來(lái)發(fā)送郵件?
可以使用smtplib標(biāo)準(zhǔn)庫(kù)。
以下代碼可以在支持SMTP監(jiān)聽(tīng)器的服務(wù)器上執(zhí)行。
import sys, smtplib fromaddr =raw_input(“From: “) toaddrs = raw_input(“To: “).split(‘,’) print “Enter message, end with ^D:” msg = ” while 1: line = sys.stdin.readline() if not line: break msg = msg + line
發(fā)送郵件部分:
server = smtplib.SMTP(‘localhost’) server.sendmail(fromaddr, toaddrs, msg) server.quit()
27. 請(qǐng)寫一個(gè)Python邏輯,計(jì)算一個(gè)文件中的大寫字母數(shù)量.
>>> import os >>>os.chdir(‘C:\Users\lifei\Desktop’) >>> with open(‘Today.txt’) astoday: count=0 for i in today.read(): if i.isupper(): count+=1 print(count)
運(yùn)行結(jié)果:
26
28. Python中的標(biāo)識(shí)符長(zhǎng)度能有多長(zhǎng)?
在Python中,標(biāo)識(shí)符可以是任意長(zhǎng)度。此外,我們?cè)诿麡?biāo)識(shí)符時(shí)還必須遵守以下規(guī)則:
a. 只能以下劃線或者 A-Z/a-z 中的字母開(kāi)頭
b. 其余部分可以使用 A-Z/a-z/0-9
c. 區(qū)分大小寫
d. 關(guān)鍵字不能作為標(biāo)識(shí)符,Python中共有如下關(guān)鍵字:
29. 解釋一下Python中的//,%和 ** 運(yùn)算符
//運(yùn)算符執(zhí)行地板除法(向下取整除),它會(huì)返回整除結(jié)果的整數(shù)部分。 >>> 7//2 3
這里整除后會(huì)返回3.5。
同樣地,執(zhí)行取冪運(yùn)算。ab會(huì)返回a的b次方。
>>> 2**10 1024
最后,%執(zhí)行取模運(yùn)算,返回除法的余數(shù)。
>>> 13%7 6 >>> 3.5%1.5 0.5
30. 在Python中如何使用多進(jìn)制數(shù)字?
我們?cè)赑ython中,除十進(jìn)制外還可以使用二進(jìn)制、八進(jìn)制和十六進(jìn)制。
a. 二進(jìn)制數(shù)字由0和1組成,我們使用 0b 或 0B 前綴表示二進(jìn)制數(shù)。
>>> int(0b1010) 10
b. 使用bin()函數(shù)將一個(gè)數(shù)字轉(zhuǎn)換為它的二進(jìn)制形式。
>>> bin(0xf) ‘0b1111’
c. 八進(jìn)制數(shù)由數(shù)字 0-7 組成,用前綴 0o 或 0O 表示 8 進(jìn)制數(shù)。
>>> oct(8) ‘0o10’
d. 十六進(jìn)數(shù)由數(shù)字 0-15 組成,用前綴 0x 或者 0X 表示 16 進(jìn)制數(shù)。
>>> hex(16) ‘0x10’ >>> hex(15) ‘0xf’
31. 怎樣獲取字典中所有鍵的列表?
使用 keys() 獲取字典中的所有鍵
>>>mydict={‘a’:1,‘b’:2,‘c’:3,‘e’:5} >>> mydict.keys() dict_keys([‘a’, ‘b’, ‘c’, ‘e’])
32. 怎樣聲明多個(gè)變量并賦值?
一共有兩種方式:
>>> a,b,c=3,4,5 #This assigns 3,4, and 5 to a, b, and c respectively >>> a=b=c=3 #This assigns 3 to a,b, and c
33. 元組的解封裝是什么?
首先我們來(lái)看解封裝:
>>> mytuple=3,4,5 >>> mytuple (3, 4, 5)
這將 3,4,5 封裝到元組 mytuple 中。
現(xiàn)在我們將這些值解封裝到變量 x,y,z 中:
>>> x,y,z=mytuple
>>> x+y+z
得到結(jié)果12.
34. 解釋如何在Django中設(shè)置數(shù)據(jù)庫(kù)。
可以使用命令edit mysite /setting.py,它是一個(gè)普通的python模塊,模塊級(jí)別代表Django設(shè)置。
Django默認(rèn)使用SQLite;對(duì)于Django用戶來(lái)說(shuō)這很容易,因此不需要任何其他類型的安裝。如果您的數(shù)據(jù)庫(kù)選擇不同,則必須使用DATABASE’default’項(xiàng)中的以下鍵來(lái)匹配您的數(shù)據(jù)庫(kù)連接設(shè)置。
**引擎:**您可以使用’django.db.backends.sqlite3’,‘django.db.backeneds.mysql’,‘django.db.backends.postgresql_psycopg2’,'django.db.backends.oracle’等來(lái)更改數(shù)據(jù)庫(kù)
**名稱:**數(shù)據(jù)庫(kù)的名稱。如果您使用SQLite作為數(shù)據(jù)庫(kù),那么數(shù)據(jù)庫(kù)將是您計(jì)算機(jī)上的文件,Name應(yīng)該是完整的絕對(duì)路徑,包括該文件的文件名。
如果您沒(méi)有選擇SQLite作為數(shù)據(jù)庫(kù),則必須添加密碼,主機(jī),用戶等設(shè)置。Django使用SQLite作為默認(rèn)數(shù)據(jù)庫(kù),它將數(shù)據(jù)作為單個(gè)文件存儲(chǔ)在文件系統(tǒng)中。如果你有數(shù)據(jù)庫(kù)服務(wù)器-PostgreSQL,MySQL,Oracle,MSSQL-并且想要使用它而不是SQLite,那么使用數(shù)據(jù)庫(kù)的管理工具為你的Django項(xiàng)目創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)。無(wú)論哪種方式,在您的(空)數(shù)據(jù)庫(kù)到位的情況下,剩下的就是告訴Django如何使用它。這是項(xiàng)目的settings.py文件的來(lái)源。
我們將添加以下代碼行文件:
DATABASES = { ‘default’: { ‘ENGINE’ : ‘django.db.backends.sqlite3’, ‘NAME’ : os.path.join(BASE_DIR, ‘db.sqlite3’), } }
35. 如何獲取任何網(wǎng)址或網(wǎng)頁(yè)的Google緩存時(shí)限?
使用以下URL格式:
http://webcache.googleusercontent.com/search?q=cache:URLGOESHERE
請(qǐng)務(wù)必將“URLGOESHERE”替換為要檢索其緩存的頁(yè)面或站點(diǎn)的正確Web地址,并查看時(shí)間。例如,要查看http://edureka.co的Google Webcache年齡,您需要使用以下網(wǎng)址:
http://webcache.googleusercontent.com/search?q=cache:edureka.co
36. 什么是Python中的map函數(shù)?
Map函數(shù)執(zhí)行作為第一個(gè)參數(shù)給出的函數(shù),該函數(shù)遍歷第二個(gè)參數(shù)給出的迭代的所有元素的。如果給定的函數(shù)包含多于1個(gè)參數(shù),則給出了許多迭代。
37. 如何在NumPy數(shù)組中獲得N個(gè)最大值的索引?
我們可以使用以下代碼獲取NumPy數(shù)組中N個(gè)最大值的索引:
import numpy as np arr = np.array([1, 3, 2, 4, 5]) print(arr.argsort()[-3:][::-1])
輸出
[ 4 3 1 ]
38. 你如何用Python /NumPy計(jì)算百分位數(shù)?
我們可以使用以下代碼計(jì)算百分位數(shù)
import numpy as np a = np.array([1,2,3,4,5]) p = np.percentile(a, 50) #Returns 50th percentile, e.g. median print§
輸出
3
39. NumPy陣列(arrays)相對(duì)(嵌套)Python列表(lists)有哪些優(yōu)勢(shì)?
a. Python的列表是高效的general-purpose容器。它們支持(相當(dāng))有效的插入,刪除,追加和連接,Python的list comprehension使它們易于構(gòu)造和操作。
b. Python列表的一些限制:它們不支持向量化“vectorized”操作,如元素加法和乘法,并且它們可以包含不同類型的對(duì)象這一事實(shí)意味著Python必須存儲(chǔ)每個(gè)元素的類型信息,并且必須在每個(gè)元素上操作時(shí)執(zhí)行類型調(diào)度代碼。
c. NumPy不僅效率更高;它也更方便。你可以免費(fèi)獲得大量的向量和矩陣運(yùn)算,這有時(shí)可以避免不必要的工作。
d. NumPy數(shù)組更快,你可以使用NumPy,F(xiàn)FT,卷積,快速搜索,基本統(tǒng)計(jì),線性代數(shù),直方圖等內(nèi)置方法。
40. NumPy和SciPy有什么區(qū)別?
a. 在理想的世界中,NumPy只包含數(shù)組數(shù)據(jù)類型和最基本的操作:索引,排序,重塑,基本元素函數(shù)等。
b. 所有數(shù)字代碼都將駐留在SciPy中。但是,NumPy的一個(gè)重要目標(biāo)是兼容性,因此NumPy試圖保留其前任任何一個(gè)支持的所有功能。
c. 因此,NumPy包含一些線性代數(shù)函數(shù),即使它們更恰當(dāng)?shù)貙儆赟ciPy。無(wú)論如何,SciPy包含更多功能更全版本的線性代數(shù)模塊,以及許多其他數(shù)值算法。
d. 如果你使用python進(jìn)行科學(xué)計(jì)算,你應(yīng)該安裝NumPy和SciPy。大多數(shù)新功能屬于SciPy而非NumPy。
41. python程序中文輸出問(wèn)題怎么解決?
用encode和decode,如:
import os.path import xlrd,sys Filename=’/home/tom/Desktop/1234.xls’ if not os.path.isfile(Filename): raise NameError,”%s is not a valid filename”%Filename bk=xlrd.open_workbook(Filename) shxrange=range(bk.nsheets) print shxrange for x in shxrange: p=bk.sheets()[x].name.encode(‘utf-8′) print p.decode(‘utf-8′)
方法二:
在文件開(kāi)頭加上
reload(sys) sys.setdefaultencoding(‘utf8′)
42. 閱讀下面的代碼,它的輸出結(jié)果是什么?
class A(object): def go(self): print “go A go!” def stop(self): print “stop A stop!” def pause(self): raise Exception(“Not Implemented”) class B(A): def go(self): super(B, self).go() print “go B go!” class C(A): def go(self): super(C, self).go() print “go C go!” def stop(self): super(C, self).stop() print “stop C stop!” class D(B,C): def go(self): super(D, self).go() print “go D go!” def stop(self): super(D, self).stop() print “stop D stop!” def pause(self): print “wait D wait!” class E(B,C): pass a = A() b = B() c = C() d = D() e = E()
說(shuō)明下列代碼的輸出結(jié)果
a.go() b.go() c.go() d.go() e.go() a.stop() b.stop() c.stop() d.stop() e.stop() a.pause() b.pause() c.pause() d.pause() e.pause()
**答案,**輸出結(jié)果以注釋的形式表示:
a.go() # go A go! b.go() # go A go! # go B go! c.go() # go A go! # go C go! d.go() # go A go! # go C go! # go B go! # go D go! e.go() # go A go! # go C go! # go B go! a.stop() # stop A stop! b.stop() # stop A stop! c.stop() # stop A stop! # stop C stop! d.stop() # stop A stop! # stop C stop! # stop D stop! e.stop() # stop A stop! a.pause() # … Exception: Not Implemented b.pause() # … Exception: Not Implemented c.pause() # … Exception: Not Implemented d.pause() # wait D wait! e.pause() # …Exception: Not Implemented
43. 介紹一下Python中webbrowser的用法?
webbrowser模塊提供了一個(gè)高級(jí)接口來(lái)顯示基于Web的文檔,大部分情況下只需要簡(jiǎn)單的調(diào)用open()方法。
webbrowser定義了如下的異常:
exception webbrowser.Error, 當(dāng)瀏覽器控件發(fā)生錯(cuò)誤是會(huì)拋出這個(gè)異常
webbrowser有以下方法:
webbrowser.open(url[, new=0[,autoraise=1]])
這個(gè)方法是在默認(rèn)的瀏覽器中顯示url, 如果new = 0, 那么url會(huì)在同一個(gè)瀏覽器窗口下打開(kāi),如果new = 1, 會(huì)打開(kāi)一個(gè)新的窗口,如果new = 2, 會(huì)打開(kāi)一個(gè)新的tab, 如果autoraise =true, 窗口會(huì)自動(dòng)增長(zhǎng)。
webbrowser.open_new(url)
在默認(rèn)瀏覽器中打開(kāi)一個(gè)新的窗口來(lái)顯示url, 否則,在僅有的瀏覽器窗口中打開(kāi)url
webbrowser.open_new_tab(url)
在默認(rèn)瀏覽器中當(dāng)開(kāi)一個(gè)新的tab來(lái)顯示url,否則跟open_new()一樣
webbrowser.get([name])
根據(jù)name返回一個(gè)瀏覽器對(duì)象,如果name為空,則返回默認(rèn)的瀏覽器
webbrowser.register(name, construtor[,instance])
注冊(cè)一個(gè)名字為name的瀏覽器,如果這個(gè)瀏覽器類型被注冊(cè)就可以用get()方法來(lái)獲取。
44. Python中, list, tuple, dict, set有什么區(qū)別, 主要應(yīng)用在什么樣的場(chǎng)景?
定義:
**list:**鏈表, 有序的項(xiàng)目, 通過(guò)索引進(jìn)行查找, 使用方括號(hào)"[]";
**tuple:**元組, 元組將多樣的對(duì)象集合到一起, 不能修改, 通過(guò)索引進(jìn)行查找, 使用括號(hào)"()";
**dict:**字典, 字典是一組鍵(key)和值(value)的組合, 通過(guò)鍵(key)進(jìn)行查找, 沒(méi)有順序, 使用大括號(hào)"{}";
set: 集合,無(wú)序, 元素只出現(xiàn)一次, 自動(dòng)去重, 使用"set([])";
應(yīng)用場(chǎng)景:
list, 簡(jiǎn)單的數(shù)據(jù)集合, 可以使用索引;
tuple, 把一些數(shù)據(jù)當(dāng)做一個(gè)整體去使用, 不能修改;
dict, 使用鍵值和值進(jìn)行關(guān)聯(lián)的數(shù)據(jù);
set, 數(shù)據(jù)只出現(xiàn)一次, 只關(guān)心數(shù)據(jù)是否出現(xiàn), 不關(guān)心其位置;
代碼:
*mylist = [1, 2, 3, 4, ‘Oh’] * *mytuple = (1, 2, ‘Hello’, (4, 5)) * *mydict = {‘Wang’ : 1, ‘Hu’ : 2, ‘Liu’ :4} * myset = set([‘Wang’, ‘Hu’, ‘Liu’, 4,‘Wang’])
45. 寫一個(gè)函數(shù), 輸入一個(gè)字符串, 返回倒序排列的結(jié)果: 如:string_reverse(‘abcdef’), 返回: ‘fedcba’ (請(qǐng)采用多種方法實(shí)現(xiàn), 并對(duì)實(shí)現(xiàn)方法進(jìn)行比較)。
解答: 5種方法的比較.
1. 簡(jiǎn)單的步長(zhǎng)為-1, 即字符串的翻轉(zhuǎn);
2. 交換前后字母的位置;
3. 遞歸的方式, 每次輸出一個(gè)字符;
4. 雙端隊(duì)列, 使用extendleft()函數(shù);
5. 使用for循環(huán), 從左至右輸出;
代碼:
*string = ‘abcdef’ * *def string_reverse1(string): * *return string[::-1] * *def string_reverse2(string): * *t= list(string) * *l= len(t) * *for i,j in zip(range(l-1, 0, -1), range(l//2)): * *t[i], t[j] = t[j], t[i] * *return “”.join(t) * *def string_reverse3(string): * *if len(string) <= 1: * *return string * *return string_reverse3(string[1:]) + string[0] * *from collections import deque * *def string_reverse4(string): * *d= deque() * *d.extendleft(string) * *return ‘’.join(d) * *def string_reverse5(string): * *#return ‘’.join(string[len(string) - i] for i in range(1,len(string)+1)) * *return ‘’.join(string[i] for i in range(len(string)-1, -1, -1)) * *print(string_reverse1(string)) * *print(string_reverse2(string)) * *print(string_reverse3(string)) * *print(string_reverse4(string)) * print(string_reverse5(string))
46. 以下哪個(gè)語(yǔ)句創(chuàng)建字典? (多個(gè)正確的答案可能)
A. d = {}
B. d = {“john”:40,“peter”:45}
C. d = {40:“john”,45:“peter”}
D. d =(40:“john”,45:“50”)
**回答:**b,c, d。通過(guò)指定鍵和值來(lái)創(chuàng)建字典。
47. 其中哪一個(gè)是floor division?
a) /
b)//
C) %
d)沒(méi)有提到的
**回答:**b)//;例如,5.0/2 = 2.5,5.0//2 = 2
48. 標(biāo)識(shí)符的最大可能長(zhǎng)度是多少?
a)31個(gè)字符
b)63個(gè)字符
c)79個(gè)字符
d)以上都不是
回答:d)以上都不是;標(biāo)識(shí)符可以是任意長(zhǎng)度。
49. 為什么不鼓勵(lì)以下劃線開(kāi)頭的局部變量名?
a)它們用于表示類的私有變量
b)他們混淆了口譯員
c)它們用于表示全局變量
d)他們放慢執(zhí)行速度
**回答:**a)它們用于表示類的私有變量;由于Python沒(méi)有私有變量的概念,因此前導(dǎo)下劃線用于表示不能從類外部訪問(wèn)的變量。
50. 以下哪項(xiàng)是無(wú)效聲明?
a)abc = 1,000,000
b)a b c = 1000 2000 3000
c)a,b,c = 1000,2000,3000
d)a_b_c = 1,000,000
**回答:**b)a b c = 1000 2000 3000;變量名稱中不允許使用空格。
51. 以下是什么輸出?
try: if ‘1’ != 1: raise “someError” else: print(“someError has not occured”) except “someError”: print (“someError has occured”)
a)發(fā)生了someError
b)沒(méi)有發(fā)生someError
c)無(wú)效代碼
d)以上都不是
**回答:**c)無(wú)效代碼;新的異常類必須從BaseException繼承。這里沒(méi)有這樣的繼承。
52. 假設(shè)list1是[2,33,222,14,25],什么是list1 [-1]?
a)錯(cuò)誤
b)沒(méi)有
c)25
d)2
回答:c)25;索引-1對(duì)應(yīng)于列表中的最后一個(gè)索引。
53. 要打開(kāi)文件c:\ scores.txt進(jìn)行編寫,我們使用:
a)outfile = open(“c:\scores.txt”,“r”)
b)outfile = open(“c:\scores.txt”,“w”)
c)outfile = open(file = “c:\scores.txt”,“r”)
d)outfile = open(file = “c:\scores.txt”,“o”)
**回答:**b)該位置包含雙斜杠($$,w用于指示正在寫入文件。
54. 以下是什么輸出?
f = None for i in range (5): with open(“data.txt”, “w”) as f: if i > 2: break print f.closed
a)True
b)False
c)None
d)Error
回答:a)True;與open文件一起使用時(shí),WITH語(yǔ)句可確保在with塊退出時(shí)關(guān)閉文件對(duì)象。
55. 何時(shí)執(zhí)行try-except-else的else部分?
a)總是
b)發(fā)生異常時(shí)
c)沒(méi)有異常發(fā)生時(shí)
d)當(dāng)發(fā)生異常時(shí)至除了塊
**回答:**c)沒(méi)有異常發(fā)生時(shí);當(dāng)沒(méi)有異常發(fā)生時(shí),執(zhí)行else部分。
56. a=1, b=2, 不用中間變量交換a和b的值.
兩種形式: 加法或異或;代碼:
*a = 1 * *b = 2 * *a = a + b * *b = a - b * *a = a - b * *print (‘a = {0}, b = {1}’.format(a,b)) * *a = a ^ b * *b = a ^ b * *a = a ^ b * print (‘a = {0}, b = {1}’.format(a, b))
57. 請(qǐng)寫出打印結(jié)果
x = [0, 1] i = 0 i, x[i] = 1, 2 print(x)
打印結(jié)果: [0, 2], python可以使用連續(xù)賦值, 從左至右.
g = lambda x, y=2, z : x + y**z g(1, z=10) = ?
打印結(jié)果: 異常, 形參表末尾才可以有默認(rèn)參數(shù), z需要提供默認(rèn)參數(shù)。
58. Python的單例模式
單例模式是一種常用的軟件設(shè)計(jì)模式。在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例類的特殊類。通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)實(shí)例而且該實(shí)例易于外界訪問(wèn),從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個(gè)類的對(duì)象只能存在一個(gè),單例模式是最好的解決方案。
new()在init()之前被調(diào)用,用于生成實(shí)例對(duì)象。利用這個(gè)方法和類的屬性的特點(diǎn)可以實(shí)現(xiàn)設(shè)計(jì)模式的單例模式。單例模式是指創(chuàng)建唯一對(duì)象,單例模式設(shè)計(jì)的類只能實(shí)例 這個(gè)絕對(duì)常考啊.絕對(duì)要記住1~2個(gè)方法,當(dāng)時(shí)面試官是讓手寫的.
使用new方法
class Singleton(object): *def new(cls, *args, *kw): if not hasattr(cls, ‘_instance’): orig = super(Singleton, cls) *cls._instance = orig.new(cls, *args, *kw) return cls._instance class MyClass(Singleton): a = 1
共享屬性
創(chuàng)建實(shí)例時(shí)把所有實(shí)例的dict指向同一個(gè)字典,這樣它們具有相同的屬性和方法.
class Borg(object): _state = {} *def new(cls, *args, *kw): *ob = super(Borg, cls).new(cls, *args, *kw) ob.dict = cls._state return ob class MyClass2(Borg): a = 1
裝飾器版本
def singleton(cls): instances = {} *def getinstance(*args, *kw): if cls not in instances: *instances[cls] = cls(*args, *kw) return instances[cls] return getinstance @singleton class MyClass: …
import方法
作為python的模塊是天然的單例模式
# mysingleton.py class My_Singleton(object): def foo(self): pass my_singleton = My_Singleton() # to use from mysingleton import my_singleton my_singleton.foo()
59. A、B兩人分別在兩座島上。B生病了,A有B所需要的藥。C有一艘小船和一個(gè)可以上鎖的箱子。C愿意在A和B之間運(yùn)東西,但東西只能放在箱子里。只要箱子沒(méi)被上鎖,C都會(huì)偷走箱子里的東西,不管箱子里有什么。如果A和B各自有一把鎖和只能開(kāi)自己那把鎖的鑰匙,A應(yīng)該如何把東西安全遞交給B?
**答案:**A把藥放進(jìn)箱子,用自己的鎖把箱子鎖上。B拿到箱子后,再在箱子上加一把自己的鎖。箱子運(yùn)回A后,A取下自己的鎖。箱子再運(yùn)到B手中時(shí),B取下自己的鎖,獲得藥物。
60. 有25匹馬,速度都不同,但每匹馬的速度都是定值?,F(xiàn)在只有5條賽道,無(wú)法計(jì)時(shí),即每賽一場(chǎng)最多只能知道5匹馬的相對(duì)快慢。問(wèn)最少賽幾場(chǎng)可以找出25匹馬中速度最快的前3名?
**答案:**每匹馬都至少要有一次參賽的機(jī)會(huì),所以25匹馬分成5組,一開(kāi)始的這5場(chǎng)比賽是免不了的。接下來(lái)要找冠軍也很容易,每一組的冠軍在一起賽一場(chǎng)就行了(第6場(chǎng))。最后就是要找第2和第3名。我們按照第6場(chǎng)比賽中得到的名次依次把它們?cè)谇?場(chǎng)比賽中所在的組命名為A、B、C、D、E。即:A組的冠軍是第6場(chǎng)的第1名,B組的冠軍是第6場(chǎng)的第2名……每一組的5匹馬按照他們已經(jīng)賽出的成績(jī)從快到慢編號(hào):
A組:1,2,3,4,5
B組:1,2,3,4,5
C組:1,2,3,4,5
D組:1,2,3,4,5
E組:1,2,3,4,5
從現(xiàn)在所得到的信息,我們可以知道哪些馬已經(jīng)被排除在3名以外。只要已經(jīng)能確定有3匹或3匹以上的馬比這匹馬快,那么它就已經(jīng)被淘汰了??梢钥吹?,只有上表中粗體藍(lán)色的那5匹馬才有可能為2、3名的。即:A組的2、3名;B組的1、2名,C組的第1名。取這5匹馬進(jìn)行第7場(chǎng)比賽,第7場(chǎng)比賽的前兩名就是25匹馬中的2、3名。故一共最少要賽7場(chǎng)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
- 這篇文章主要介紹了Python經(jīng)典面試題與參考答案,總結(jié)分析了Python面試中各種常見(jiàn)的概念、數(shù)據(jù)結(jié)構(gòu)、算法等相關(guān)操作技巧,需要的朋友可以參考下2019-11-04
- 這篇文章主要介紹了兩道阿里python面試題與參考答案,結(jié)合具體實(shí)例形式分析了Python數(shù)組創(chuàng)建、遍歷、拆分及隨機(jī)數(shù)等相關(guān)操作技巧,需要的朋友可以參考下2019-09-02
- 這篇文章主要介紹了關(guān)于Python爬蟲面試170道題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-08-15
- Python是目前編程領(lǐng)域最受歡迎的語(yǔ)言。在本文中,我將總結(jié)Python面試中最常見(jiàn)的50個(gè)問(wèn)題。每道題都提供參考答案,感興趣的可以了解下2019-06-26
- 這篇文章主要為大家介紹了Python常見(jiàn)的面試題與相應(yīng)的Python知識(shí)點(diǎn),包括Python變量、函數(shù)、對(duì)象、數(shù)據(jù)類型等,需要的朋友可以參考下2019-06-25
- 這篇文章主要介紹了110道Python面試題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-06-24
- 本文給大家分享Python高頻面試題及其答案,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-12-26