60道Python面试题答案精选!找工作前必看
需要Word/ PDF版本的同學可以在實驗樓微信公眾號回復關鍵詞“面試題”獲取。
1. Python 的特點和優點是什么?
答案:略。
2. 什么是lambda函數?它有什么好處?
lambda 函數是一個可以接收任意多個參數(包括可選參數)并且返回單個表達式值的函數。 lambda 函數不能包含命令,它們所包含的表達式不能超過一個。不要試圖向lambda函數中塞入太多的東西;如果你需要更復雜的東西,應該定義一個普通函數,然后想讓它多長就多長。
lambda函數可以接受任意個參數,包括可選參數,但是表達式只有一個:
>>> 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函數,不把它賦值給變量:
>>> (lambdax,y=0,z=0:x+y+z)(3,5,6)
14
如果你的函數非常簡單,只有一個表達式,不包含命令,可以考慮lambda函數。否則,你還是定義函數才對,畢竟函數沒有這么多限制。
3. 深拷貝和淺拷貝的區別是什么?
深拷貝是將對象本身復制給另一個對象。這意味著如果對對象的副本進行更改時不會影響原對象。在 Python 中,我們使用 deepcopy()函數進行深拷貝,使用方法如下:
>>> import copy
>>> b=copy.deepcopy(a)
淺拷貝是將對象的引用復制給另一個對象。因此,如果我們在副本中進行更改,則會影響原對象。使用 copy()函數進行淺拷貝,使用方法如下:
>>> b=copy.copy(a)
4. 列表和元組有什么不同?
try…except…except…[else…][finally…]
執行try下的語句,如果引發異常,則執行過程會跳到except語句。對每個except分支順序嘗試執行,如果引發的異常與except中的異常組匹配,執行相應的語句。如果所有的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。
try下的語句正常執行,則執行else塊代碼。如果發生異常,就不會執行;如果存在finally語句,最后總是會執行。
5.? ?Python里面如何生成隨機數?
答:random模塊
**隨機整數:**random.randint(a,b):返回隨機整數x,a<=x<=b
random.randrange(start,stop,[,step]):返回一個范圍在(start,stop,step)之間的隨機整數,不包括結束值。
**隨機實數:**random.random( ):返回0到1之間的浮點數
random.uniform(a,b):返回指定范圍內的浮點數
6. 如何在Python中實現多線程?
**a. ?**Python有一個multi-threading包,但是如果你想讓multi-thread加速你的代碼,那么使用它通常不是一個好主意。
**b.?**Python有一個名為GlobalInterpreter Lock(GIL)的結構。 GIL確保只有一個“線程”可以在任何時候執行。一個線程獲取GIL,做一點工作,然后將GIL傳遞到下一個線程。
**c.?**這種情況很快發生,因此對于人眼看來,您的線程似乎并行執行,但它們實際上只是輪流使用相同的CPU核心。
**d.?**所有這些GIL傳遞都增加了執行的開銷。這意味著如果您想讓代碼運行得更快,那么使用線程包通常不是一個好主意。
7.?????如何在python中使用三元運算符?
三元運算符是用于顯示條件語句的運算符。這包含用于評估為true或false值的語句。
句法:三元操作符語法如下,
[on_true] if [expression] else [on_false]
例:
*?x,y = 25,50*
*?big = x if x < y else y*
如果x <y為真,則返回值為big= x,如果不正確則返回big = y作為結果。
8. 用一個例子解釋Python中的繼承。
繼承允許一個類獲得另一個類的所有成員(比如屬性和方法)。繼承提供代碼可重用性,使創建和維護應用程序變得更容易。我們繼承的類稱為super-class,繼承的類稱為派生/子類。
以下是Python支持的不同類型的繼承:
**a.?**單一繼承 - 派生類獲取單個超類的成員。
b.?Multi-level繼承 - 從基類base1繼承的派生類d1,d2繼承自base2。
c. 分層繼承 - 從一個基類可以繼承任意數量的子類
d. 多重繼承 - 派生類從多個基類繼承。
9. 解釋Flask是什么及其好處?
Flask是基于“Werkzeug,Jinja2和良好意圖”BSD許可證的Python網絡微框架。 Werkzeug和Jinja2是它的兩個依賴項。這意味著它對外部庫幾乎沒有依賴性。它使框架變得輕盈,只是少量依賴于更新和更少的安全性錯誤。
會話基本上允許您記住從一個請求到另一個請求的信息。在flask中,會話使用簽名的cookie,以便用戶可以查看會話內容并進行修改。當且僅當有密鑰Flask.secret_key,用戶可以修改會話。
10.?Python中的字典是什么?
Python中的內置數據類型稱為字典。它定義了鍵和值之間的one-to-one關系。字典包含一對鍵及其對應的值。字典由鍵來索引。
我們來舉個例子:
以下示例包含一些鍵,Country, Capital & PM,它們的相應值分別是印度,德里和莫迪。
dict={‘Country’:‘India’,‘Capital’:‘Delhi’,‘PM’:‘Modi’}
print dict[Country]
India
print dict[Capital]
Delhi
print dict[PM]
Modi
11.?什么是負指數,為什么使用它們?
Python中的序列是索引的,它由正數和負數組成。正的數字使用’0’作為第一個索引,'1’作為第二個索引,以此類推。
負數的索引從’-1’開始,表示序列中的最后一個索引,’ - 2’作為倒數第二個索引,依次類推。
12.?如何用Python來進行查詢和替換一個文本字符串?
可以使用sub()方法來進行查詢和替換,sub方法的格式為:
a.?sub(replacement, string[,count=0])
**b.?**replacement是被替換成的文本
**c.?**string是需要被替換的文本
**d.?**count是一個可選參數,指最大被替換的數量
13.?解釋一下python的and-or語法
與C表達式 bool ? a : b類似,但是bool and a or b,當 a 為假時,不會象C表達式 bool ? a : b 一樣工作
應該將 and-or 技巧封裝成一個函數:
defchoose(bool, a,b):return(booland[a]or[b])[0]
因為 [a] 是一個非空列表,它永遠不會為假。甚至 a 是 0 或 ‘’ 或其它假值,列表[a]為真,因為它有一個元素。
14.?請寫出一段Python代碼實現刪除一個list里面的重復元素
1,使用set函數,set(list)
2,使用字典函數,
>>>a=[1,2,4,2,4,5,6,5,7,8,9,0]
>>> b={}
>>>b=b.fromkeys(a)
>>>c=list(b.keys())
>>> c
15.?單引號,雙引號,三引號的區別?
單引號和雙引號是等效的,如果要換行,需要符號(),三引號則可以直接換行,并且可以包含注釋
如果要表示Let’s go?這個字符串
單引號:s4 = ‘Let\’s go’
**雙引號:**s5 = “Let’s go”
s6 = ‘I realy like“python”!’
這就是單引號和雙引號都可以表示字符串的原因了。
16.?當退出 Python 時是否釋放所有內存分配?
答案是否定的。那些具有對象循環引用或者全局命名空間引用的變量,在 Python 退出是往往不會被釋放
另外不會釋放 C 庫保留的部分內容。
17.?Python里面search()和match()的區別?
match()函數只檢測RE是不是在string的開始位置匹配,search()會掃描整個string查找匹配, 也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none 。
18.?如何在Python中隨機化列表中的項目?
考慮下面顯示的示例:
from random import shuffle
x = [‘Keep’, ‘The’, ‘Blue’, ‘Flag’,‘Flying’, ‘High’]
shuffle(x)
print(x)
以下代碼的輸出如下。
[‘Flying’, ‘Keep’, ‘Blue’, ‘High’, ‘The’,‘Flag’]
19.?在python中編譯和鏈接的過程是什么?
編譯和鏈接允許正確編譯新擴展而不會出現任何錯誤,并且只有在通過編譯過程時才能進行鏈接。如果使用動態加載,則它取決于系統提供的樣式。 python解釋器可用于提供配置設置文件的動態加載,并將重建解釋器。
這需要的步驟如下:
a. 使用任何名稱以及系統編譯器支持的任何語言創建文件。例如file.c或file.cpp
b. 將此文件放在正在使用的發行版的Modules /目錄中。
c. 在Modules /目錄中存在的Setup.local文件中添加一行。
d. 使用spam file.o運行該文件
e. 成功運行此重建解釋程序后,在top-level目錄中使用make命令。
f.? 如果文件已更改,則使用命令“make Makefile”運行rebuildMakefile。
20.?Python解釋“re”模塊的split(), sub(), subn()方法。
要修改字符串,Python的“re”模塊提供了3種方法。他們是:
split()?- 使用正則表達式將“split”給定字符串放入列表中。
**sub()?**- 查找正則表達式模式匹配的所有子字符串,然后用不同的字符串替換它們
**subn()?**- 它類似于 sub(),并且還返回新字符串和替換的序號。
21.?range和xrange之間有什么區別?
在大多數情況下,xrange和range在功能方面完全相同,它們都提供了一種生成整數列表供您使用的方法。唯一的區別是range返回一個Python列表對象,xrange返回一個xrange對象。
這意味著xrange實際上并不像run-time那樣生成靜態列表。它使用稱為yielding的特殊技術根據需要創建值。該技術與一種稱為生成器的對象一起使用。這意味著,如果你有一個非常巨大的范圍,你想生成一個列表,比如10億,xrange就是要使用的功能。
如果你有一個真正的內存敏感系統,例如你正在使用的手機,尤其如此,因為range將使用盡可能多的內存來創建整數數組,這可能導致內存錯誤并導致崩潰程序。
22.?Django,Pyramid和Flask之間的差異。
Flask是“microframework”,主要用于具有更簡單要求的小型應用程序。在Flask中,您必須使用外部庫。
Pyramid適用于大型應用程序。它提供了靈活性,并允許開發人員為他們的項目使用正確的工具。開發人員可以選擇數據庫,URL結構,模板樣式等。
Django也可以像Pyramid一樣用于更大的應用程序。
23.?列出Django中的繼承樣式。
在Django中,有三種可能的繼承樣式:
**抽象基類:**當您只希望父類包含您不想為每個子模型鍵入的信息時,使用此樣式。
Multi-table繼承:使用此樣式如果您是sub-classing現有模型并且需要每個模型都有自己的數據庫表。
**代理模型:**您可以使用此模型,如果您只想修改模型的Python級別行為,而無需更改模型的字段。
24.?什么是Python monkey補丁?
在Python中,術語monkey補丁僅指run-time上的類或模塊的動態修改。
考慮以下示例:
# m.py
class MyClass:
def f(self):
print “f()”
然后我們可以像這樣運行monkey-patch測試:
import m
def monkey_f(self):
print “monkey_f()”
m.MyClass.f = monkey_f
obj = m.MyClass()
obj.f()
輸出如下:
monkey_f()
我們可以看到,在模塊之外,我們確實對函數f()的行為做了一些改變,實際執行的是函數monkey_f(),。
25.?有兩個序列a,b,大小都為n,序列元素的值任意整形數,無序?
要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。
1. 將兩序列合并為一個序列,并排序,為序列Source
2. 拿出最大元素Big,次大的元素Small
3. 在余下的序列S[:-2]進行平分,得到序列max,min
4. 將Small加到max序列,將Big加大min序列,重新計算新序列和,和大的為max,小的為min。
26.?如何用Python來發送郵件?
可以使用smtplib標準庫。
以下代碼可以在支持SMTP監聽器的服務器上執行。
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
#?發送郵件部分
server = smtplib.SMTP(‘localhost’)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
27.?請寫一個Python邏輯,計算一個文件中的大寫字母數量.
>>> 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)
運行結果:
26
28.?Python中的標識符長度能有多長?
在Python中,標識符可以是任意長度。此外,我們在命名標識符時還必須遵守以下規則:
a. 只能以下劃線或者 A-Z/a-z 中的字母開頭
b. 其余部分可以使用 A-Z/a-z/0-9
c. 區分大小寫
d. 關鍵字不能作為標識符,Python中共有如下關鍵字:
29.?解釋一下Python中的//,%和 ** 運算符
//運算符執行地板除法(向下取整除),它會返回整除結果的整數部分。
>>> 7//2
3
這里整除后會返回3.5。
同樣地,執行取冪運算。ab會返回a的b次方。
>>> 2**10
1024
最后,%執行取模運算,返回除法的余數。
>>> 13%7
6
>>> 3.5%1.5
0.5
30.?在Python中如何使用多進制數字?
我們在Python中,除十進制外還可以使用二進制、八進制和十六進制。
a. 二進制數字由0和1組成,我們使用 0b 或 0B 前綴表示二進制數。
*?>>> int(0b1010)*
10
b. 使用bin()函數將一個數字轉換為它的二進制形式。
>>> bin(0xf)
‘0b1111’
c. 八進制數由數字 0-7 組成,用前綴 0o 或 0O 表示 8 進制數。
>>> oct(8)
‘0o10’
d. 十六進數由數字 0-15 組成,用前綴 0x 或者 0X 表示 16 進制數。
>>> 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.?怎樣聲明多個變量并賦值?
一共有兩種方式:
>>> 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.?元組的解封裝是什么?
首先我們來看解封裝:
>>> mytuple=3,4,5
>>> mytuple
(3, 4, 5)
這將 3,4,5 封裝到元組 mytuple 中。
現在我們將這些值解封裝到變量 x,y,z 中:
*?>>> x,y,z=mytuple*
>>> x+y+z
得到結果12.
34. 解釋如何在Django中設置數據庫。
可以使用命令edit mysite /setting.py,它是一個普通的python模塊,模塊級別代表Django設置。
Django默認使用SQLite;對于Django用戶來說這很容易,因此不需要任何其他類型的安裝。如果您的數據庫選擇不同,則必須使用DATABASE’default’項中的以下鍵來匹配您的數據庫連接設置。
**引擎:**您可以使用’django.db.backends.sqlite3’,‘django.db.backeneds.mysql’,‘django.db.backends.postgresql_psycopg2’,'django.db.backends.oracle’等來更改數據庫
**名稱:**數據庫的名稱。如果您使用SQLite作為數據庫,那么數據庫將是您計算機上的文件,Name應該是完整的絕對路徑,包括該文件的文件名。
如果您沒有選擇SQLite作為數據庫,則必須添加密碼,主機,用戶等設置。Django使用SQLite作為默認數據庫,它將數據作為單個文件存儲在文件系統中。如果你有數據庫服務器-PostgreSQL,MySQL,Oracle,MSSQL-并且想要使用它而不是SQLite,那么使用數據庫的管理工具為你的Django項目創建一個新的數據庫。無論哪種方式,在您的(空)數據庫到位的情況下,剩下的就是告訴Django如何使用它。這是項目的settings.py文件的來源。
我們將添加以下代碼行文件:
DATABASES = {
*????‘default’: {*
*?????????‘ENGINE’ : ‘django.db.backends.sqlite3’,*
*?????????‘NAME’ : os.path.join(BASE_DIR, ‘db.sqlite3’),*
*????}*
}
35.?如何獲取任何網址或網頁的Google緩存時限?
使用以下URL格式:
http://webcache.googleusercontent.com/search?q=cache:URLGOESHERE
請務必將“URLGOESHERE”替換為要檢索其緩存的頁面或站點的正確Web地址,并查看時間。例如,要查看edureka.co的Google Webcache年齡,您需要使用以下網址:
http://webcache.googleusercontent.com/search?q=cache:edureka.co
36.?什么是Python中的map函數?
Map函數執行作為第一個參數給出的函數,該函數遍歷第二個參數給出的迭代的所有元素的。如果給定的函數包含多于1個參數,則給出了許多迭代。
37.?如何在NumPy數組中獲得N個最大值的索引?
我們可以使用以下代碼獲取NumPy數組中N個最大值的索引:
import numpy as np
arr = np.array([1, 3, 2, 4, 5])
print(arr.argsort()[-3:][::-1])
輸出
[ 4 3 1 ]
38.?你如何用Python /NumPy計算百分位數?
我們可以使用以下代碼計算百分位數
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)相對(嵌套)Python列表(lists)有哪些優勢?
a. Python的列表是高效的general-purpose容器。它們支持(相當)有效的插入,刪除,追加和連接,Python的list comprehension使它們易于構造和操作。
b. Python列表的一些限制:它們不支持向量化“vectorized”操作,如元素加法和乘法,并且它們可以包含不同類型的對象這一事實意味著Python必須存儲每個元素的類型信息,并且必須在每個元素上操作時執行類型調度代碼。
c. NumPy不僅效率更高;它也更方便。你可以免費獲得大量的向量和矩陣運算,這有時可以避免不必要的工作。
d. NumPy數組更快,你可以使用NumPy,FFT,卷積,快速搜索,基本統計,線性代數,直方圖等內置方法。
40.?NumPy和SciPy有什么區別?
a. 在理想的世界中,NumPy只包含數組數據類型和最基本的操作:索引,排序,重塑,基本元素函數等。
b. 所有數字代碼都將駐留在SciPy中。但是,NumPy的一個重要目標是兼容性,因此NumPy試圖保留其前任任何一個支持的所有功能。
c. 因此,NumPy包含一些線性代數函數,即使它們更恰當地屬于SciPy。無論如何,SciPy包含更多功能更全版本的線性代數模塊,以及許多其他數值算法。
d. 如果你使用python進行科學計算,你應該安裝NumPy和SciPy。大多數新功能屬于SciPy而非NumPy。
41.?python程序中文輸出問題怎么解決?
用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′)*
方法二:
在文件開頭加上
reload(sys)
sys.setdefaultencoding(‘utf8′)
42.?閱讀下面的代碼,它的輸出結果是什么?
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()
說明下列代碼的輸出結果
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()
**答案,**輸出結果以注釋的形式表示:
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模塊提供了一個高級接口來顯示基于Web的文檔,大部分情況下只需要簡單的調用open()方法。
webbrowser定義了如下的異常:
exception webbrowser.Error, 當瀏覽器控件發生錯誤是會拋出這個異常
webbrowser有以下方法:
webbrowser.open(url[, new=0[,autoraise=1]])
這個方法是在默認的瀏覽器中顯示url, 如果new = 0, 那么url會在同一個瀏覽器窗口下打開,如果new = 1, 會打開一個新的窗口,如果new = 2, 會打開一個新的tab, 如果autoraise =true, 窗口會自動增長。
webbrowser.open_new(url)
在默認瀏覽器中打開一個新的窗口來顯示url, 否則,在僅有的瀏覽器窗口中打開url
webbrowser.open_new_tab(url)
在默認瀏覽器中當開一個新的tab來顯示url,否則跟open_new()一樣
webbrowser.get([name])
根據name返回一個瀏覽器對象,如果name為空,則返回默認的瀏覽器
webbrowser.register(name, construtor[,instance])
注冊一個名字為name的瀏覽器,如果這個瀏覽器類型被注冊就可以用get()方法來獲取。
44.?Python中, list, tuple, dict, set有什么區別, 主要應用在什么樣的場景?
定義:
**list:**鏈表, 有序的項目, 通過索引進行查找, 使用方括號"[]";
**tuple:**元組, 元組將多樣的對象集合到一起, 不能修改, 通過索引進行查找, 使用括號"()";
**dict:**字典, 字典是一組鍵(key)和值(value)的組合, 通過鍵(key)進行查找, 沒有順序, 使用大括號"{}";
set:?集合,無序, 元素只出現一次, 自動去重, 使用"set([])";
應用場景:
list, 簡單的數據集合, 可以使用索引;
tuple, 把一些數據當做一個整體去使用, 不能修改;
dict, 使用鍵值和值進行關聯的數據;
set, 數據只出現一次, 只關心數據是否出現, 不關心其位置;
代碼:
*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. 寫一個函數, 輸入一個字符串, 返回倒序排列的結果: 如:string_reverse(‘abcdef’), 返回: ‘fedcba’ (請采用多種方法實現, 并對實現方法進行比較)。
解答:?5種方法的比較.
1. 簡單的步長為-1, 即字符串的翻轉;
2. 交換前后字母的位置;
3. 遞歸的方式, 每次輸出一個字符;
4. 雙端隊列, 使用extendleft()函數;
5. 使用for循環, 從左至右輸出;
**?代碼:**
*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.?以下哪個語句創建字典? (多個正確的答案可能)
a)d = {}
b)d = {“john”:40,“peter”:45}
c)d = {40:“john”,45:“peter”}
d)d =(40:“john”,45:“50”)
**回答:**b,c, d。通過指定鍵和值來創建字典。
47.?其中哪一個是floor division?
a) /
b)//
C) %
d)沒有提到的
**回答:**b)//;例如,5.0/2 = 2.5,5.0//2 = 2
48.?標識符的最大可能長度是多少?
a)31個字符
b)63個字符
c)79個字符
d)以上都不是
回答:d)以上都不是;標識符可以是任意長度。
49.?為什么不鼓勵以下劃線開頭的局部變量名?
a)它們用于表示類的私有變量
b)他們混淆了口譯員
c)它們用于表示全局變量
d)他們放慢執行速度
**回答:**a)它們用于表示類的私有變量;由于Python沒有私有變量的概念,因此前導下劃線用于表示不能從類外部訪問的變量。
50.?以下哪項是無效聲明?
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)發生了someError
b)沒有發生someError
c)無效代碼
d)以上都不是
**回答:**c)無效代碼;新的異常類必須從BaseException繼承。這里沒有這樣的繼承。
52.?假設list1是[2,33,222,14,25],什么是list1 [-1]?
a)錯誤
b)沒有
c)25
d)2
回答:c)25;索引-1對應于列表中的最后一個索引。
53.?要打開文件c:\ scores.txt進行編寫,我們使用:
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文件一起使用時,WITH語句可確保在with塊退出時關閉文件對象。
55.?何時執行try-except-else的else部分?
a)總是
b)發生異常時
c)沒有異常發生時
d)當發生異常時至除了塊
**回答:**c)沒有異常發生時;當沒有異常發生時,執行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.?請寫出打印結果
x = [0, 1]
i = 0
i, x[i] = 1, 2
print(x)
**打印結果:?**[0, 2], python可以使用連續賦值, 從左至右.
g = lambda x, y=2, z : x + y**z
g(1, z=10) = ?
**打印結果:?**異常, 形參表末尾才可以有默認參數, z需要提供默認參數。
58. Python的單例模式
單例模式是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個實例而且該實例易于外界訪問,從而方便對實例個數的控制并節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
new()在__init__()之前被調用,用于生成實例對象。利用這個方法和類的屬性的特點可以實現設計模式的單例模式。單例模式是指創建唯一對象,單例模式設計的類只能實例?這個絕對常考啊.絕對要記住1~2個方法,當時面試官是讓手寫的.
使用__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
共享屬性
創建實例時把所有實例的__dict__指向同一個字典,這樣它們具有相同的屬性和方法.
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有一艘小船和一個可以上鎖的箱子。C愿意在A和B之間運東西,但東西只能放在箱子里。只要箱子沒被上鎖,C都會偷走箱子里的東西,不管箱子里有什么。如果A和B各自有一把鎖和只能開自己那把鎖的鑰匙,A應該如何把東西安全遞交給B?
**答案:**A把藥放進箱子,用自己的鎖把箱子鎖上。B拿到箱子后,再在箱子上加一把自己的鎖。箱子運回A后,A取下自己的鎖。箱子再運到B手中時,B取下自己的鎖,獲得藥物。
60.?有25匹馬,速度都不同,但每匹馬的速度都是定值。現在只有5條賽道,無法計時,即每賽一場最多只能知道5匹馬的相對快慢。問最少賽幾場可以找出25匹馬中速度最快的前3名?
**答案:**每匹馬都至少要有一次參賽的機會,所以25匹馬分成5組,一開始的這5場比賽是免不了的。接下來要找冠軍也很容易,每一組的冠軍在一起賽一場就行了(第6場)。最后就是要找第2和第3名。我們按照第6場比賽中得到的名次依次把它們在前5場比賽中所在的組命名為A、B、C、D、E。即:A組的冠軍是第6場的第1名,B組的冠軍是第6場的第2名……每一組的5匹馬按照他們已經賽出的成績從快到慢編號:
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
從現在所得到的信息,我們可以知道哪些馬已經被排除在3名以外。只要已經能確定有3匹或3匹以上的馬比這匹馬快,那么它就已經被淘汰了。可以看到,只有上表中粗體藍色的那5匹馬才有可能為2、3名的。即:A組的2、3名;B組的1、2名,C組的第1名。取這5匹馬進行第7場比賽,第7場比賽的前兩名就是25匹馬中的2、3名。故一共最少要賽7場。
相關閱讀
8個爽滑的Windows小軟件,不好用你拿王思蔥砸死我
60人,42天,死磕機器學習,結果如下。
武俠版編程語言…Java像張無忌還是令狐沖?
大量機器學習&深度學習資料
技術變現,到底怎么變?
總結
以上是生活随笔為你收集整理的60道Python面试题答案精选!找工作前必看的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9个前端动画库让你的交互更加性感
- 下一篇: (史上最全)104个实用网络爬虫合集。