前言
本文給大家深入的解答了關于Python的11道基本面試題,通過這些面試題大家能對python進一步的了解和學習,下面話不多說,來看看詳細的介紹吧。
一、單引號,雙引號,三引號的區別
分別闡述3種引號用的場景和區別
1),單引號和雙引號主要用來表示字符串
比如:
2).三引號
區別:
若你的字符串里面本身包含單引號,必須用雙引號
比如: "can't find the log/n"
二、Python的參數傳遞是值傳遞還是引用傳遞
舉例說明Python函數參數傳遞的幾種形式,并說明函數傳參是值傳遞還是引用傳遞
1).Python的參數傳遞有:
位置參數
默認參數,
可變參數,
關鍵字參數
2).函數的傳值到底是值傳遞還是引用傳遞,要分情況
a.不可變參數用值傳遞:
像整數和字符串這樣的不可變對象,是通過拷貝進行傳遞的,因為你無論如何都不可能在原處改變不可變對象
b.可變參數是用引用傳遞的
比如像列表,字典這樣的對象是通過引用傳遞,和C語言里面的用指針傳遞數組很相似,可變對象能在函數內部改變.
三、什么是lambda函數?它有什么好處?
舉例說明lambda的用法,并說明用lambda的優點
1).lambda的用法:
lambda是匿名函數,用法如下:lambda arg1,arg2..argN:expression using args
2).優點
lambda能和def做同樣種類的工作,特別是對于那些邏輯簡單的函數,直接用lambda會更簡潔,而且省去取函數名的麻煩(給函數取名是個技術活)
四、字符串格式化:%和.format的區別
字符串的format函數非常靈活,很強大,可以接受的參數不限個數,并且位置可以不按順序,而且有較為強大的格式限定符(比如:填充,對齊,精度等)
五、Python是如何進行內存管理的
1).對象的引用計數機制
Python內部使用引用計數,來保持追蹤內存中的對象,所有對象都有引用計數。
引用計數增加的情況:
引用計數減少的情況:
2).垃圾回收
當一個對象的引用計數歸零時,它將被垃圾收集機制處理掉。
3).內存池機制
Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統:
六、寫一個函數, 輸入一個字符串, 返回倒序排列的結果
輸入: string_reverse(‘abcdef') , 返回: ‘fedcba',寫出你能想到的多種方法
1).利用字符串本身的翻轉
def string_reverse1(text='abcdef'):return text[::-1]
2).把字符串變成列表,用列表的reverse函數

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

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

5).遞歸

七、按升序合并如下兩個list, 并去除重復的元素
list1 = [2, 3, 8, 4, 9, 5, 6]list2 = [5, 6, 10, 17, 11, 2]
1).最簡單的方法用set
list3=list1+list2print set(list3)
2).遞歸
先選一個中間數,然后一邊是小的數字,一邊是大的數字,然后再循環遞歸,排完序(是不是想起了c里面的冒泡)

八、以下的代碼的輸出將是什么? 說出你的答案并解釋
class Parent(object): x = 1class Child1(Parent): passclass Child2(Parent): passprint Parent.x, Child1.x, Child2.xChild1.x = 2print Parent.x, Child1.x, Child2.xParent.x = 3print Parent.x, Child1.x, Child2.x>>1 1 11 2 13 2 3
解答:
使你困惑或是驚奇的是關于最后一行的輸出是 3 2 3 而不是 3 2 1。為什么改變了 Parent.x 的值還會改變 Child2.x 的值,但是同時 Child1.x 值卻沒有改變?
這個答案的關鍵是,在 Python中,類變量在內部是作為字典處理的。如果一個變量的名字沒有在當前類的字典中發現,將搜索祖先類(比如父類)直到被引用的變量名被找到.
Child1.x = 2)該值僅僅在子類中被改變。這就是為什么第二個 print 語句的輸出是 1 2 1Parent.x = 3),這個改變會影響到任何未重寫該值的子類當中的值(在這個示例中被影響的子類是 Child2)。這就是為什么第三個 print 輸出是 3 2 3九、下面的代碼會不會報錯
list = ['a', 'b', 'c', 'd', 'e']print list[10:]
不會報錯,而且會輸出一個 [],并且不會導致一個 IndexError
解答:
當試圖訪問一個超過列表索引值的成員將導致 IndexError(比如訪問以上列表的 list[10])。盡管如此,試圖訪問一個列表的以超出列表長度數作為開始索引的切片將不會導致 IndexError,并且將僅僅返回一個空列表
一個討厭的小問題是它會導致出現 bug ,并且這個問題是難以追蹤的,因為它在運行時不會引發錯誤,吐血啊~~
十、說出下面list1,list2,list3的輸出值
def extendList(val, list=[]): list.append(val) return listlist1 = extendList(10)list2 = extendList(123,[])list3 = extendList('a')print "list1 = %s" % list1print "list2 = %s" % list2print "list3 = %s" % list3>>list1 = [10, 'a']list2 = [123]list3 = [10, 'a']許多人會錯誤的認為 list1 應該等于 [10] 以及 list3 應該等于 ['a']。認為 list 的參數會在 extendList 每次被調用的時候會被設置成它的默認值 []。
盡管如此,實際發生的事情是,新的默認列表僅僅只在函數被定義時創建一次。隨后當 extendList 沒有被指定的列表參數調用的時候,其使用的是同一個列表。這就是為什么當函數被定義的時候,表達式是用默認參數被計算,而不是它被調用的時候。
因此,list1 和 list3 是操作的相同的列表。而list2是操作的它創建的獨立的列表(通過傳遞它自己的空列表作為list參數的值)
所以這一點一定要切記切記.下面我們把list置為None就可以避免一些麻煩了

十一、寫出你認為最Pythonic的代碼
Pythonic編程風格是Python的一種追求的風格,精髓就是追求直觀,簡潔而容易讀.
下面是一些比較好的例子
1).交互變量
非Pythonic
temp = aa = bb = temppythonic:a,b=b,a
2).判斷其值真假
name = 'Tim'langs = ['AS3', 'Lua', 'C']info = {'name': 'Tim', 'sex': 'Male', 'age':23 } 非Pythonicif 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))
pythonic的代碼很多,這里舉幾個典型的例子
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。
新聞熱點
疑難解答
圖片精選