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

說實話,都9012了,還在用這種背題式的方法來考覈程序員,實在太不切合程序員的實際工作了……

文末給出了一種更極客的考覈方式,Talk is cheap,Show me the code(寫代碼,憋bb) —— 寫得出工作代碼,就說明你有工作能力;寫不出,書背的再溜也不行

面試官只需要:節選一段工作代碼,然後把原有代碼刪除,讓面試者自己寫代碼實現;或是保留一段有bug的代碼,讓面試者修改即可 —— 這都是最常見的程序員工作場景,最能考覈面試者的真實代碼能力;而且題目隨處可見,扒一下你的產品代碼就能找到。

不用付出10個下午尷尬而不失禮貌的微笑,招聘的效率、準確率、靠譜程度都會更高,面試者和面試官也都會更省心,相信更多企業能發現這個系統的價值。

(正題開始:精選自個大公司經典面試題,版權歸原作者所有。)

大家在學python的時候肯定會遇到很多難題,以及對於新技術的追求,這裏推薦一下我們的Python學習扣qun:784758214,這裏是python學習者聚集地!!同時,自己是一名高級python開發工程師,從基礎的python腳本到web開發、爬蟲、django、數據挖掘等,零基礎到項目實戰的資料都有整理。送給每一位python的小夥伴!每日分享一些學習的方法和需要注意的小細節

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. Python異常處理的用法和作用

  • 執行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次方。

>>> 210
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地址,並查看時間。例如,要查看http://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(p)

輸出

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. 爲什麼不鼓勵以下劃線開頭的局部變量名?

  1. a)它們用於表示類的私有變量
  2. b)他們混淆了口譯員
  3. c)它們用於表示全局變量
  4. d)他們放慢執行速度

回答:a)它們用於表示類的私有變量;由於Python沒有私有變量的概念,因此前導下劃線用於表示不能從類外部訪問的變量。

50. 以下哪項是無效聲明?

  1. a)abc = 1,000,000
  2. b)a b c = 1000 2000 3000
  3. c)a,b,c = 1000,2000,3000
  4. 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]?

  1. a)錯誤
  2. b)沒有
  3. c)25
  4. d)2

回答:c)25;索引-1對應於列表中的最後一個索引。

53. 要打開文件c:\ scores.txt進行編寫,我們使用:

  1. a)outfile = open(“c:\scores.txt”,“r”)
  2. b)outfile = open(“c:\scores.txt”,“w”)
  3. c)outfile = open(file = “c:\scores.txt”,“r”)
  4. 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部分?

  1. a)總是
  2. b)發生異常時
  3. c)沒有異常發生時
  4. 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 + yz
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場。

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