當前位置:
首頁 > 知識 > Python 經典面試題 21 道

Python 經典面試題 21 道

(點擊

上方公眾號

,可快速關注)




來源:綜合自網路,原作者不詳




1、Python如何實現單例模式?


Python有兩種方式可以實現單例模式,下面兩個例子使用了不同的方式實現單例模式:


1.

class

 

Singleton

(type)

:


def

 

__init__

(cls, name, bases, dict)

:


super(Singleton, cls).__init__(name, bases, dict)
cls.instance = 

None


def

 

__call__

(cls, *args, **kw)

:


if

 cls.instance 

is

 

None

:
cls.instance = super(Singleton, cls).__call__(*args, **kw)

return

 cls.instance

class

 

MyClass

(object)

:


__metaclass__ = Singleton

print

 MyClass()

print

 MyClass()



  1. 使用decorator來實現單例模式

def

 

singleton

(cls)

:


instances = {}

def

 

getinstance

()

:


if

 cls 

not

 

in

 instances:
instances[cls] = cls()

return

 instances[cls]

return

 getinstance

@singleton


class

 

MyClass

:




2:什麼是lambda函數?


Python允許你定義一種單行的小函數。定義lambda函數的形式如下:labmda 參數:表達式lambda函數默認返回表達式的值。你也可以將其賦值給一個變數。lambda函數可以接受任意個參數,包括可選參數,但是表達式只有一個:

>>

> g = lambda x, 

y:

 x*y

>>

> g(

3

,

4

)

12


>>

> g = lambda x, y=

0

, z=

0

: x+y+z

>>

> g(

1

)

1


>>

> g(

3

4

7

)

14



也能夠直接使用lambda函數,不把它賦值給變數:

>>

> (lambda x,y=

0

,z=

0:x+y+z

)(

3

,

5

,

6

)

14



如果你的函數非常簡單,只有一個表達式,不包含命令,可以考慮lambda函數。否則,你還是定義函數才對,畢竟函數沒有這麼多限制。


3:Python是如何進行類型轉換的?


Python提供了將變數或值從一種類型轉換成另一種類型的內置函數。int函數能夠將符合數學格式數字型字元串轉換成整數。否則,返回錯誤信息。

>>

> int(」

34

″)

34


>>

> int(」

1234

ab」) 

#不能轉換成整數


ValueError:

 invalid literal 

for

 int(): 

1234

ab

函數int也能夠把浮點數轉換成整數,但浮點數的小數部分被截去。

>>

> int(

34.1234

)

34


>>

> int(-

2.46

)
-

2



函數°oat將整數和字元串轉換成浮點數:

>>

> float(」

12

″)

12.0


>>

> float(」

1.111111

″)

1.111111



函數str將數字轉換成字元:

>>

> str(

98

)

98


>>

> str(」

76.765

″)

76.765



整數1和浮點數1.0在python中是不同的。雖然它們的值相等的,但卻屬於不同的類型。這兩個數在計算機的存儲形式也是不一樣。


4:Python如何定義一個函數


函數的定義形式如下:

def

 <

name

>

(arg1, arg2,… argN)

:


<statements>

函數的名字也必須以字母開頭,可以包括下劃線「 」,但不能把Python的關鍵字定義成函數的名字。函數內的語句數量是任意的,每個語句至少有一個空格的縮進,以表示此語句屬於這個函數的。縮進結束的地方,函數自然結束。
下面定義了一個兩個數相加的函數:

>>

def

 

add

(p1, p2)

:
print p1, 「+」, p2, 「=」, p1+p2

>>

> add(

1

2

)

1

 + 

2

 = 

3



函數的目的是把一些複雜的操作隱藏,來簡化程序的結構,使其容易閱讀。函數在調用前,必須先定義。也可以在一個函數內部定義函數,內部函數只有在外部函數調用時才能夠被執行。程序調用函數時,轉到函數內部執行函數內部的語句,函數執行完畢後,返回到它離開程序的地方,執行程序的下一條語句。


5:Python是如何進行內存管理的?


Python的內存管理是由Python得解釋器負責的,開發人員可以從內存管理事務中解放出來,致力於應用程序的開發,這樣就使得開發的程序錯誤更少,程序更健壯,開發周期更短


6:如何反序的迭代一個序列?


how do I iterate over a sequence in reverse order


如果是一個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]
<

do

 something 

with

 x>

7:Python裡面如何實現tuple和list的轉換?


函數tuple(seq)可以把所有可迭代的(iterable)序列轉換成一個tuple, 元素不變,排序也不變。
例如,tuple([1,2,3])返回(1,2,3), tuple(』abc』)返回(』a』.』b",』c").如果參數已經是一個tuple的話,函數不做任何拷貝而直接返回原來的對象,所以在不確定對象是不是tuple的時候來調用tuple()函數也不是很耗費的。
函數list(seq)可以把所有的序列和可迭代的對象轉換成一個list,元素不變,排序也不變。
例如 list([1,2,3])返回(1,2,3), list(』abc』)返回["a", "b", "c"]。如果參數是一個list, 她會像set[:]一樣做一個拷貝


8:Python面試題:請寫出一段Python代碼實現刪除一個list裡面的重複元素


可以先把list重新排序,然後從list的最後開始掃描,代碼如下:

if

 

List

:

List

.sort()
last = 

List

[

-1

]

for

 i 

in

 range(len(

List

)

-2

-1

-1

):

if

 last==

List

[i]: del 

List

[i]

else

: last=

List

[i]

9:Python文件操作的面試題




  1. 如何用Python刪除一個文件?
    使用os.remove(filename)或者os.unlink(filename);



  2. Python如何copy一個文件?
    shutil模塊有一個copyfile函數可以實現文件拷貝


10:Python裡面如何生成隨機數?


標準庫random實現了一個隨機數生成器,實例代碼如下:

import 

random


random

.

random

()

它會返回一個隨機的0和1之間的浮點數


11:如何用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()

12:Python裡面如何拷貝一個對象?


一般來說可以使用copy.copy()方法或者copy.deepcopy()方法,幾乎所有的對象都可以被拷貝
一些對象可以更容易的拷貝,Dictionaries有一個copy方法:

newdict

 = olddict.copy()

13:有沒有一個工具可以幫助查找python的bug和進行靜態的代碼分析?


有,PyChecker是一個python代碼的靜態分析工具,它可以幫助查找python代碼的bug, 會對代碼的複雜度和格式提出警告
Pylint是另外一個工具可以進行coding standard檢查。


14:如何在一個function裡面設置一個全局的變數?


解決方法是在function的開始插入一個global聲明:

def

 

f

()


global x

15:用Python匹配HTML tag的時候,<.>和<.?>有什麼區別?


當重複匹配一個正則表達式時候, 例如<.*>, 當程序執行匹配的時候,會返回最大的匹配值
例如:

import

 re
s = 『<html>

<

head

><

title

>

Title

</

title

>


print(re.match(』

<

.*

>

』, s).group())


會返回一個匹配而不是

import

 re
s = 『<html>

<

head

><

title

>

Title

</

title

>


print(re.match(』

<

.*?

>

』, s).group())


則會返回
<.>這種匹配稱作貪心匹配 <.?>稱作非貪心匹配


16:Python裡面search()和match()的區別?


match()函數只檢測RE是不是在string的開始位置匹配, search()會掃描整個string查找匹配, 也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回none
例如:

print

(re.match(』

super

』, 』superstition』).span())

會返回(0, 5)

print

(re.match(』

super

』, 『insuperable』))

則返回None
search()會掃描整個字元串並返回第一個成功的匹配
例如:

print

(re.search(』

super

』, 』superstition』).span())

返回(0, 5)

print

(re.search(』

super

』, 『insuperable』).span())

返回(2, 7)


17:如何用Python來進行查詢和替換一個文本字元串?


可以使用sub()方法來進行查詢和替換,sub方法的格式為:sub(replacement, string[, count=0])
replacement是被替換成的文本
string是需要被替換的文本
count是一個可選參數,指最大被替換的數量
例子:

import

 re
p = re.compile(』(blue|white|red)』)

print

(p.sub(』colour』,

"blue socks and red shoes』))
print(p.sub(』colour』,"

blue socks 

and

 red shoes』, count=

1

))

輸出:

colour socks 

and

 colour shoes
colour socks 

and

 red shoes

subn()方法執行的效果跟sub()一樣,不過它會返回一個二維數組,包括替換後的新的字元串和總共替換的數量
例如:

import

 re
p = re.compile(』(blue|white|red)』)

print

(p.subn(』colour』,

"blue socks and red shoes』))
print(p.subn(』colour』,"

blue socks 

and

 red shoes』, count=

1

))

輸出

(』colour socks 

and

 colour shoes』, 

2

)
(』colour socks 

and

 red shoes』, 

1

)

18:介紹一下except的用法和作用?


Python的except用來捕獲所有異常, 因為Python裡面的每次錯誤都會拋出 一個異常,所以每個程序的錯誤都被當作一個運行時錯誤。
一下是使用except的一個例子:

try

:
foo = opne(」

file

」) #open被錯寫為opne

except

:
sys.

exit

(」could 

not

 open 

file

!」)

因為這個錯誤是由於open被拼寫成opne而造成的,然後被except捕獲,所以debug程序的時候很容易不知道出了什麼問題
下面這個例子更好點:

try

:
foo = opne(」

file

」) # 這時候

except

只捕獲IOError

except

 IOError:
sys.

exit

(」could 

not

 open 

file

」)

19:Python中pass語句的作用是什麼?


pass語句什麼也不做,一般作為佔位符或者創建佔位程序,pass語句不會執行任何操作,比如:

while

 

False

:

pass



pass通常用來創建一個最簡單的類:

class

 

MyEmptyClass

:


pass



pass在軟體設計階段也經常用來作為TODO,提醒實現相應的實現,比如:

def

 

initlog

(*args)

:


pass

 

#please implement this



20:介紹一下Python下range()函數的用法?


如果需要迭代一個數字序列的話,可以使用range()函數,range()函數可以生成等差級數。
如例:

for

 i 

in

 range(5)

print

(i)

這段代碼將輸出0, 1, 2, 3, 4五個數字
range(10)會產生10個值, 也可以讓range()從另外一個數字開始,或者定義一個不同的增量,甚至是負數增量
range(5, 10)從5到9的五個數字
range(0, 10, 3) 增量為三, 包括0,3,6,9四個數字
range(-10, -100, -30) 增量為-30, 包括-10, -40, -70
可以一起使用range()和len()來迭代一個索引序列
例如:

a = [

"Nina"

"Jim"

"Rainman"

"Hello"

]

for

 i 

in

 range(

len

(a)):
    

print

(i, a[i])

21:有兩個序列a,b,大小都為n,序列元素的值任意整形數,


無序;要求:通過交換a,b中的元素,使[序列a元素的和]與[序列b元素的和]之間的差最小。
將兩序列合併為一個序列,並排序,為序列Source


拿出最大元素Big,次大的元素Small


在餘下的序列S[:-2]進行平分,得到序列max,min


將Small加到max序列,將Big加大min序列,重新計算新序列和,和大的為max,小的為min。


Python代碼

def

 

mean

( sorted_list )

:


if

 

not

 sorted_list:

return

 (([],[]))
big = sorted_list[

-1

]
small = sorted_list[

-2

]
big_list, small_list = mean(sorted_list[:

-2

])
big_list.append(small)
small_list.append(big)
big_list_sum = sum(big_list)
small_list_sum = sum(small_list)

if

 big_list_sum > small_list_sum:

return

 ( (big_list, small_list))

else

:

return

 (( small_list, big_list))
tests = [   [

1

,

2

,

3

,

4

,

5

,

6

,

700

,

800

],
[

10001

,

10000

,

100

,

90

,

50

,

1

],
range(

1

11

),
[

12312

12311

232

210

30

29

3

2

1

1

]
]

for

 l 

in

 tests:
l.sort()

print


print

 「Source List:    」, l
l1,l2 = mean(l)

print

 「Result List:    」, l1, l2

print

 「Distance:    」, abs(sum(l1)-sum(l2))

print

 『-*』*

40



輸出結果

Source

 

List

:    

[1, 2, 3, 4, 5, 6, 700, 800]


Result

 

List

:    

[1, 4, 5, 800]

 

[2, 3, 6, 700]


Distance

:       99

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

Source

 

List

:    

[1, 50, 90, 100, 10000, 10001]


Result

 

List

:    

[50, 90, 10000]

 

[1, 100, 10001]


Distance

:       38

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

Source

 

List

:    

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


Result

 

List

:    

[2, 3, 6, 7, 10]

 

[1, 4, 5, 8, 9]


Distance

:       1

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

Source

 

List

:    

[1, 1, 2, 3, 29, 30, 210, 232, 12311, 12312]


Result

 

List

:    

[1, 3, 29, 232, 12311]

 

[1, 2, 30, 210, 12312]


Distance

:       21

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*

-

*





【關於投稿】




如果大家有原創好文投稿,請直接給公號發送留言。




① 留言格式:


【投稿】+《 文章標題》+ 文章鏈接

② 示例:


【投稿】《不要自稱是程序員,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/

③ 最後請附上您的個人簡介哈~






看完本文有收穫?請轉

發分享給更多人


關注「P

ython開發者」,提升Python技能



喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python開發者 的精彩文章:

面向對象:希望遇到你,希望時間地點都剛剛好
9 月編程語言排行榜:Python 反超 C++,萬年不變的前三終於變了

TAG:Python開發者 |