搜尋
首頁後端開發Python教學python面試題詳細總結(附答案)

python面試題詳細總結(附答案)

這篇文章帶給大家的內容是關於python面試題總結(附答案),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

相關文章推薦:《2020年python面試題總結(最新)

1、下面這段程式碼的輸出結果是什麼?請解釋。

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

怎麼修改extendList的定義能夠產生以下預期的行為?

上面程式碼輸出結果將是:

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

很多人都會誤認為list1=[10], list3=['a'],因為他們以為每次extendList被呼叫時,列表參數的預設值都會被設定為[]。但實際上的情況是,新的預設列表只在函數被定義的那一刻創建一次。

當extendList被沒有指定特定參數list呼叫時,這組list的值隨後將會被使用。這是因為帶有預設參數的表達式在函數被定義的時候被計算,而不是在呼叫的時候被計算。因此list1和list3是在同一個預設清單上進行操作(計算)的。而list2是在一個分離的列表上進行操作(計算)的。 (透過傳遞一個自有的空列表作為列表參數的數值)。

extendList的定義可以做如下修改。

儘管,創建一個新的列表,沒有特定的列表參數。

下面這段程式碼可能能夠產生想要的結果。

def extendList(val, list=None):
  if list is None:
    list = []
  list.append(val)
  return list

透過上面的修改,輸出結果將變成:

list1 = [10]
list2 = [123]
list3 = ['a']

2、下面這段程式碼的輸出結果會是什麼?請解釋。

def multipliers():
  return [lambda x : i * x for i in range(4)]
print [m(2) for m in multipliers()]

你如何修改上面的multipliers的定義產生想要的結果?

上面程式碼輸出的結果是[6, 6, 6, 6] (不是我們想的[0, 2, 4, 6])。

上述問題產生的原因是Python閉包的延遲綁定。這意味著內部函數被呼叫時,參數的值在閉包內進行查找。因此,當任何由multipliers()傳回的函數被呼叫時,i的值將在附近的範圍進行尋找。那時,不管返回的函數是否被調用,for循環已經完成,i被賦予了最終的值3。

因此,每次回傳的函數乘以傳遞過來的值3,因為上段程式碼傳過來的值是2,它們最後回傳的都是6(3*2)。碰巧的是,《The Hitchhiker’s Guide to Python》也指出,在與lambdas函數相關也有一個被廣泛被誤解的知識點,不過跟這個case不一樣。由lambda表達式創造的函數沒有什麼特別的地方,它其實是跟def創造的函數式一樣的。

以下是解決這個問題的一些方法。

一種解決方法就是用Python產生器。

def multipliers():
  for i in range(4): yield lambda x : i * x

另一個解決方案就是創造一個閉包,利用預設函數立即綁定。

def multipliers():
  return [lambda x, i=i : i * x for i in range(4)]

還有種替代的方案是,使用偏函數:

from functools import partial
from operator import mul
def multipliers():
  return [partial(mul, i) for i in range(4)]

3、下面這段程式碼的輸出結果會是什麼?請解釋。

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)能夠在其類別和其子類別中被引用到。這就是為什麼第一個列印語句輸出結果是1 1 1

因此,如果它的任何一個子類別被覆寫了值(例如說,當我們執行語句Child1.x = 2),這個值只在子類別中進行了修改。這就是為什麼第二個列印語句輸出結果是1 2 1

最終,如果這個值在父類別中進行了修改,(例如說,當我們執行語句Parent.x = 3),這個改變將會影響那些還沒有覆寫子類別的值(在這個例子中就是Child2)這就是為什麼第三列印語句輸出結果是3 2 3

4、下面這段程式碼在Python2下輸出結果將是什麼?請解釋。

def div1(x,y):
    print "%s/%s = %s" % (x, y, x/y)
def div2(x,y):
    print "%s//%s = %s" % (x, y, x//y)
div1(5,2)
div1(5.,2)
div2(5,2)
div2(5.,2.)

在Python3下結果會有怎樣的差異? (當然,假設上述列印語句被轉換成Python3的語法)

在Python2中,上述程式碼輸出將是

5/2 = 2
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0

預設情況下,Python 2 自動執行整形計算如果兩者都是整數。因此,5/2 結果是2,而5./2結果是2.5

注意,在Python2中,你可以透過增加以下引用來覆寫這個行為。

from future import division

同時要注意的是,//運算子將總是執行整形除法,不管運算子的型別。這就是為什麼即使在Python 2中5.0//2.0的結果是2.0。然而在Python3中,沒有此類特性,

例如,在两端都是整形的情况下,它不会执行整形除法

因此,在Python3中,将会是如下结果:

5/2 = 2.5
5.0/2 = 2.5
5//2 = 2
5.0//2.0 = 2.0

注: 在 Python 3 中,/ 操作符是做浮点除法,而 // 是做整除(即商没有余数,比如 10 // 3 其结果就为 3,余数会被截除掉,而 (-7) // 3 的结果却是 -3。这个算法与其它很多编程语言不一样,需要注意,它们的整除运算会向0的方向取值。而在 Python 2 中,/ 就是整除,即和 Python 3 中的 // 操作符一样)

5、下面代码的输出结果将是什么?

list = ['a', 'b', 'c', 'd', 'e']
print list[10:]

下面的代码将输出[],不会产生IndexError错误。就像所期望的那样,尝试用超出成员的个数的index来获取某个列表的成员。

例如,尝试获取list[10]和之后的成员,会导致IndexError.

然而,尝试获取列表的切片,开始的index超过了成员个数不会产生IndexError,而是仅仅返回一个空列表。

这成为特别让人恶心的疑难杂症,因为运行的时候没有错误产生,导致bug很难被追踪到。

6、考虑下列代码片段:

list = [ [ ] ] * 5
list  # output?
list[0].append(10)
list  # output?
list[1].append(20)
list  # output?
list.append(30)
list  # output?

2,4,6,8行将输出什么结果?试解释。

输出的结果如下:

[[], [], [], [], []]
[[10], [10], [10], [10], [10]]
[[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]]
[[10, 20], [10, 20], [10, 20], [10, 20], [10, 20], 30]

解释如下:

第一行的输出结果直觉上很容易理解,例如 list = [ [ ] ] * 5 就是简单的创造了5个空列表。然而,理解表达式list=[ [ ] ] * 5的关键一点是它不是创造一个包含五个独立列表的列表,而是它是一个创建了包含对同一个列表五次引用的列表。只有了解了这一点,我们才能更好的理解接下来的输出结果。

list[0].append(10) 将10附加在第一个列表上。

但由于所有5个列表是引用的同一个列表,所以这个结果将是:

[[10], [10], [10], [10], [10]]

同理,list[1].append(20)将20附加在第二个列表上。但同样由于5个列表是引用的同一个列表,所以输出结果现在是:

[[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]]

作为对比, list.append(30)是将整个新的元素附加在外列表上,因此产生的结果是: [[10, 20], [10, 20], [10, 20], [10, 20], [10, 20], 30].

7、Given a list of N numbers。

给定一个含有N个数字的列表。

使用单一的列表生成式来产生一个新的列表,该列表只包含满足以下条件的值:

(a)偶数值

(b)元素为原始列表中偶数切片。

例如,如果list[2]包含的值是偶数。那么这个值应该被包含在新的列表当中。因为这个数字同时在原始列表的偶数序列(2为偶数)上。然而,如果list[3]包含一个偶数,

那个数字不应该被包含在新的列表当中,因为它在原始列表的奇数序列上。

对此问题的简单解决方法如下:

[x for x in list[::2] if x%2 == 0]

例如,给定列表如下:

list = [ 1 , 3 , 5 , 8 , 10 , 13 , 18 , 36 , 78 ]

列表生成式[x for x in list[::2] if x%2 == 0] 的结果是,

[10, 18, 78]

这个表达式工作的步骤是,第一步取出偶数切片的数字,

第二步剔除其中所有奇数。

8、给定以下字典的子类,下面的代码能够运行么?为什么?

class DefaultDict(dict):
  def __missing__(self, key):
    return []d = DefaultDict()
d['florp'] = 127

能够运行。

当key缺失时,执行DefaultDict类,字典的实例将自动实例化这个数列。

相关学习推荐:python视频教程

以上是python面試題詳細總結(附答案)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:公众号:马哥Linux运维。如有侵權,請聯絡admin@php.cn刪除
Python的科學計算中如何使用陣列?Python的科學計算中如何使用陣列?Apr 25, 2025 am 12:28 AM

Arraysinpython,尤其是Vianumpy,ArecrucialInsCientificComputingfortheireftheireffertheireffertheirefferthe.1)Heasuedfornumerericalicerationalation,dataAnalysis和Machinelearning.2)Numpy'Simpy'Simpy'simplementIncressionSressirestrionsfasteroperoperoperationspasterationspasterationspasterationspasterationspasterationsthanpythonlists.3)inthanypythonlists.3)andAreseNableAblequick

您如何處理同一系統上的不同Python版本?您如何處理同一系統上的不同Python版本?Apr 25, 2025 am 12:24 AM

你可以通過使用pyenv、venv和Anaconda來管理不同的Python版本。 1)使用pyenv管理多個Python版本:安裝pyenv,設置全局和本地版本。 2)使用venv創建虛擬環境以隔離項目依賴。 3)使用Anaconda管理數據科學項目中的Python版本。 4)保留系統Python用於系統級任務。通過這些工具和策略,你可以有效地管理不同版本的Python,確保項目順利運行。

與標準Python陣列相比,使用Numpy數組的一些優點是什麼?與標準Python陣列相比,使用Numpy數組的一些優點是什麼?Apr 25, 2025 am 12:21 AM

numpyarrayshaveseveraladagesoverandastardandpythonarrays:1)基於基於duetoc的iMplation,2)2)他們的aremoremoremorymorymoremorymoremorymoremorymoremoremory,尤其是WithlargedAtasets和3)效率化,效率化,矢量化函數函數函數函數構成和穩定性構成和穩定性的操作,製造

陣列的同質性質如何影響性能?陣列的同質性質如何影響性能?Apr 25, 2025 am 12:13 AM

數組的同質性對性能的影響是雙重的:1)同質性允許編譯器優化內存訪問,提高性能;2)但限制了類型多樣性,可能導致效率低下。總之,選擇合適的數據結構至關重要。

編寫可執行python腳本的最佳實踐是什麼?編寫可執行python腳本的最佳實踐是什麼?Apr 25, 2025 am 12:11 AM

到CraftCraftExecutablePythcripts,lollow TheSebestPractices:1)Addashebangline(#!/usr/usr/bin/envpython3)tomakethescriptexecutable.2)setpermissionswithchmodwithchmod xyour_script.3)

Numpy數組與使用數組模塊創建的數組有何不同?Numpy數組與使用數組模塊創建的數組有何不同?Apr 24, 2025 pm 03:53 PM

numpyArraysareAreBetterFornumericalialoperations andmulti-demensionaldata,而learthearrayModuleSutableforbasic,內存效率段

Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Apr 24, 2025 pm 03:49 PM

numpyArraySareAreBetterForHeAvyNumericalComputing,而lelethearRayModulesiutable-usemoblemory-connerage-inderabledsswithSimpleDatateTypes.1)NumpyArsofferVerverVerverVerverVersAtility andPerformanceForlargedForlargedAtatasetSetsAtsAndAtasEndCompleXoper.2)

CTYPES模塊與Python中的數組有何關係?CTYPES模塊與Python中的數組有何關係?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingingangandmanipulatingc-stylarraysinpython.1)usectypestoInterfacewithClibrariesForperfermance.2)createc-stylec-stylec-stylarraysfornumericalcomputations.3)passarraystocfunctions foreforfunctionsforeffortions.however.however,However,HoweverofiousofmemoryManageManiverage,Pressiveo,Pressivero

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具