1. 程式人生 > >11道Python基本面試題|深入解答

11道Python基本面試題|深入解答

分享給大家的11道Python面試題,好多小夥伴都很積極的去思考分析,給我留言的同學非常多,非常欣慰有這麼多好學的小夥伴,大家一起學習,一起加油,把Python學好,今天我就把11道面試題細細解答一下

給大家整理了Python很全面的資料和教程可以下載,加群943752371即可

1.單引號,雙引號,三引號的區別

分別闡述3種引號用的場景和區別

1),單引號和雙引號主要用來表示字串

比如:

單引號:'python'

雙引號:"python"

2).三引號

三單引號:'''python ''',也可以表示字串一般用來輸入多行文字,或者用於大段的註釋

三雙引號:"""python""",一般用在類裡面,用來註釋類,這樣省的寫文件,直接用類的物件__doc__訪問獲得文件

區別:

若你的字串裡面本身包含單引號,必須用雙引號

比如:"can't find the log\n"

2.Python的引數傳遞是值傳遞還是引用傳遞

舉例說明Python函式引數傳遞的幾種形式,並說明函式傳參是值傳遞還是引用傳遞

1).Python的引數傳遞有:

位置引數

預設引數,

可變引數,

關鍵字引數

2).函式的傳值到底是值傳遞還是引用傳遞,要分情況

a.不可變引數用值傳遞:

像整數和字串這樣的不可變物件,是通過拷貝進行傳遞的,因為你無論如何都不可能在原處改變不可變物件

b.可變引數是用引用傳遞的

比如像列表,字典這樣的物件是通過引用傳遞,和C語言裡面的用指標傳遞陣列很相似,可變物件能在函式內部改變.

3.什麼是lambda函式?它有什麼好處?

舉例說明lambda的用法,並說明用lambda的優點

1).lambda的用法:

lambda是匿名函式,用法如下:lambda arg1,arg2..argN:expression using args

2).優點

lambda能和def做同樣種類的工作,特別是對於那些邏輯簡單的函式,直接用lambda會更簡潔,而且省去取函式名的麻煩(給函式取名是個技術活)

 

4.字串格式化:%和.format的區別

字串的format函式非常靈活,很強大,可以接受的引數不限個數,並且位置可以不按順序,而且有較為強大的格式限定符(比如:填充,對齊,精度等)

5.Python是如何進行記憶體管理的

1).物件的引用計數機制

Python內部使用引用計數,來保持追蹤記憶體中的物件,所有物件都有引用計數。

引用計數增加的情況:

一個物件分配一個新名稱

將其放入一個容器中(如列表、元組或字典)

引用計數減少的情況:

使用del語句對物件別名顯示的銷燬

引用超出作用域或被重新賦值

2).垃圾回收

當一個物件的引用計數歸零時,它將被垃圾收集機制處理掉。

3).記憶體池機制

Python提供了對記憶體的垃圾收集機制,但是它將不用的記憶體放到記憶體池而不是返回給作業系統:

Pymalloc機制:為了加速Python的執行效率,Python引入了一個記憶體池機制,用於管理對小塊記憶體的申請和釋放。

對於Python物件,如整數,浮點數和List,都有其獨立的私有記憶體池,物件間不共享他們的記憶體池。也就是說如果你分配又釋放了大量的整數,用於快取這些整數的記憶體就不能再分配給浮點數。

6.寫一個函式, 輸入一個字串, 返回倒序排列的結果

輸入: string_reverse(‘abcdef’), 返回: ‘fedcba’,寫出你能想到的多種方法

1).利用字串本身的翻轉

def string_reverse1(text='abcdef'):

return text[::-1]

2).把字串變成列表,用列表的reverse函式

3).新建一個列表,從後往前取

4).利用雙向列表deque中的extendleft函式

5).遞迴

7.按升序合併如下兩個list, 並去除重複的元素

list1 = [2, 3, 8, 4, 9, 5, 6]

list2 = [5, 6, 10, 17, 11, 2]

1).最簡單的方法用set

list3=list1+list2

print sorted(list(set(list3)))

2).遞迴

先選一箇中間數,然後一邊是小的數字,一邊是大的數字,然後再迴圈遞迴,排完序(是不是想起了c裡面的冒泡)

8.以下的程式碼的輸出將是什麼? 說出你的答案並解釋

class Parent(object):

x = 1

class Child1(Parent):

pass

class Child2(Parent):

pass

print Parent.x, Child1.x, Child2.x

Child1.x = 2

print Parent.x, Child1.x, Child2.x

Parent.x = 3

print Parent.x, Child1.x, Child2.x

>>

1 1 1

1 2 1

3 2 3

解答:

使你困惑或是驚奇的是關於最後一行的輸出是 3 2 3 而不是 3 2 1。為什麼改變了 Parent.x 的值還會改變 Child2.x 的值,但是同時 Child1.x 值卻沒有改變?

這個答案的關鍵是,在 Python中,類變數在內部是作為字典處理的。如果一個變數的名字沒有在當前類的字典中發現,將搜尋祖先類(比如父類)直到被引用的變數名被找到.

首先,在父類中設定 x = 1 會使得類變數 x 在引用該類和其任何子類中的值為 1。這就是因為第一個 print 語句的輸出是 1 1 1

然後,如果任何它的子類重寫了該值(例如,我們執行語句 Child1.x = 2)該值僅僅在子類中被改變。這就是為什麼第二個 print 語句的輸出是 1 2 1

最後,如果該值在父類中被改變(例如,我們執行語句 Parent.x = 3),這個改變會影響到任何未重寫該值的子類當中的值(在這個示例中被影響的子類是 Child2)。這就是為什麼第三個 print 輸出是 3 2 3

9.下面的程式碼會不會報錯

list = ['a', 'b', 'c', 'd', 'e']

print list[10:]

不會報錯,而且會輸出一個 [],並且不會導致一個 IndexError

解答:

當試圖訪問一個超過列表索引值的成員將導致 IndexError(比如訪問以上列表的 list[10])。儘管如此,試圖訪問一個列表的以超出列表長度數作為開始索引的切片將不會導致 IndexError,並且將僅僅返回一個空列表

一個討厭的小問題是它會導致出現 bug ,並且這個問題是難以追蹤的,因為它在執行時不會引發錯誤,吐血啊~~

10.說出下面list1,list2,list3的輸出值

def extendList(val, list=[]):

list.append(val)

return list

list1 = extendList(10)

list2 = extendList(123,[])

list3 = extendList('a')

print "list1 = %s" % list1

print "list2 = %s" % list2

print "list3 = %s" % list3

>>

list1 = [10, 'a']

list2 = [123]

list3 = [10, 'a']

許多人會錯誤的認為 list1 應該等於 [10] 以及 list3 應該等於 ['a']。認為 list 的引數會在 extendList 每次被呼叫的時候會被設定成它的預設值 []。

儘管如此,實際發生的事情是,新的預設列表僅僅只在函式被定義時建立一次。隨後當 extendList 沒有被指定的列表引數呼叫的時候,其使用的是同一個列表。這就是為什麼當函式被定義的時候,表示式是用預設引數被計算,而不是它被呼叫的時候。

因此,list1 和 list3 是操作的相同的列表。而list2是操作的它建立的獨立的列表(通過傳遞它自己的空列表作為list引數的值)

所以這一點一定要切記切記.下面我們把list置為None就可以避免一些麻煩了

11.寫出你認為最Pythonic的程式碼

Pythonic程式設計風格是Python的一種追求的風格,精髓就是追求直觀,簡潔而容易讀.

下面是一些比較好的例子

1).互動變數

非Pythonic

temp = a

a = b

b = temp

pythonic:

a,b=b,a

2).判斷其值真假

name = 'Tim'

langs = ['AS3', 'Lua', 'C']

info = {'name': 'Tim', 'sex': 'Male', 'age':23 }

非Pythonic

if name != '' and len(langs) > 0 and info != {}:

print('All True!')

pythonic:

if name and langs and info:

print('All True!')

3).列表推導式

[x for x in range(1,100) if x%2==0]

4).zip建立鍵值對

keys = ['Name', 'Sex', 'Age']

values = ['Jack', 'Male', 23]

dict(zip(keys,values))