總結(jié)了50道必備的Python面試題(附答案)
在過去的2020年,Python贏得了年度TIOBE編程語言獎(jiǎng),成為過去一年最受歡迎的編程語言。在數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)等領(lǐng)域中,被廣泛使用。
▍1、什么是Python?為什么它會(huì)如此流行?
Python是一種解釋的、高級(jí)的、通用的編程語言。
Python的設(shè)計(jì)理念是通過使用必要的空格與空行,增強(qiáng)代碼的可讀性。
它之所以受歡迎,就是因?yàn)樗哂泻唵我子玫恼Z法。
▍2、為什么Python執(zhí)行速度慢,我們?nèi)绾胃倪M(jìn)它?
Python代碼執(zhí)行緩慢的原因,是因?yàn)樗且环N解釋型語言。它的代碼在運(yùn)行時(shí)進(jìn)行解釋,而不是編譯為本地語言。
為了提高Python代碼的速度,我們可以使用CPython、Numba,或者我們也可以對(duì)代碼進(jìn)行一些修改。
1. 減少內(nèi)存占用。
2. 使用內(nèi)置函數(shù)和庫。
3. 將計(jì)算移到循環(huán)外。
4. 保持小的代碼庫。
5. 避免不必要的循環(huán)
▍3、Python有什么特點(diǎn)?
1. 易于編碼
2. 免費(fèi)和開源語言
3. 高級(jí)語言
4. 易于調(diào)試
5. OOPS支持
6. 大量的標(biāo)準(zhǔn)庫和第三方模塊
7. 可擴(kuò)展性(我們可以用C或C++編寫Python代碼)
8. 用戶友好的數(shù)據(jù)結(jié)構(gòu)
▍4、Python有哪些應(yīng)用?
1. Web開發(fā)
2. 桌面GUI開發(fā)
3. 人工智能和機(jī)器學(xué)習(xí)
4. 軟件開發(fā)
5. 業(yè)務(wù)應(yīng)用程序開發(fā)
6. 基于控制臺(tái)的應(yīng)用程序
7. 軟件測試
8. Web自動(dòng)化
9. 基于音頻或視頻的應(yīng)用程序
10. 圖像處理應(yīng)用程序
▍5、Python的局限性?
1. 速度
2. 移動(dòng)開發(fā)
3. 內(nèi)存消耗(與其他語言相比非常高)
4. 兩個(gè)版本的不兼容(2,3)
5. 運(yùn)行錯(cuò)誤(需要更多測試,并且錯(cuò)誤僅在運(yùn)行時(shí)顯示)
6. 簡單性
▍6、Python代碼是如何執(zhí)行的?
首先,解釋器讀取Python代碼并檢查是否有語法或格式錯(cuò)誤。
如果發(fā)現(xiàn)錯(cuò)誤,則暫停執(zhí)行。如果沒有發(fā)現(xiàn)錯(cuò)誤,則解釋器會(huì)將Python代碼轉(zhuǎn)換為等效形式或字節(jié)代碼。
然后將字節(jié)碼發(fā)送到Python虛擬機(jī)(PVM),這里Python代碼將被執(zhí)行,如果發(fā)現(xiàn)任何錯(cuò)誤,則暫停執(zhí)行,否則結(jié)果將顯示在輸出窗口中。

▍7、如何在Python中管理內(nèi)存?
Python內(nèi)存由Python的私有headspace管理。
所有的Python對(duì)象和數(shù)據(jù)結(jié)構(gòu)都位于一個(gè)私有堆中。私用堆的分配由Python內(nèi)存管理器負(fù)責(zé)。
Python還內(nèi)置了一個(gè)的垃圾收集器,可以回收未使用的內(nèi)存并釋放內(nèi)存,使其可用于headspace。
▍8、解釋Python的內(nèi)置數(shù)據(jù)結(jié)構(gòu)?
Python中主要有四種類型的數(shù)據(jù)結(jié)構(gòu)。
列表:列表是從整數(shù)到字符串甚至另一個(gè)列表的異構(gòu)數(shù)據(jù)項(xiàng)的集合。列表是可變的。列表完成了其他語言中大多數(shù)集合數(shù)據(jù)結(jié)構(gòu)的工作。列表在[ ]方括號(hào)中定義。
例如:a = [1,2,3,4]
集合:集合是唯一元素的無序集合。集合運(yùn)算如聯(lián)合|,交集&和差異,可以應(yīng)用于集合。{}用于表示一個(gè)集合。
例如:a = {1,2,3,4}
元組:Python元組的工作方式與Python列表完全相同,只是它們是不可變的。()用于定義元組。
例如:a =(1,2,3,4)
字典:字典是鍵值對(duì)的集合。它類似于其他語言中的hash map。在字典里,鍵是唯一且不可變的對(duì)象。
例如:a = {'number':[1,2,3,4]}
▍9、解釋//、%、* *運(yùn)算符?
//(Floor Division)-這是一個(gè)除法運(yùn)算符,它返回除法的整數(shù)部分。
例如:5 // 2 = 2
%(模數(shù))-返回除法的余數(shù)。
例如:5 % 2 = 1
**(冪)-它對(duì)運(yùn)算符執(zhí)行指數(shù)計(jì)算。a ** b表示a的b次方。
例如:5 ** 2 = 25、5 ** 3 = 125
▍10、Python中的單引號(hào)和雙引號(hào)有什么區(qū)別?
在Python中使用單引號(hào)(' ')或雙引號(hào)(" ")是沒有區(qū)別的,都可以用來表示一個(gè)字符串。
這兩種通用的表達(dá)方式,除了可以簡化程序員的開發(fā),避免出錯(cuò)之外,還有一種好處,就是可以減少轉(zhuǎn)義字符的使用,使程序看起來更簡潔,更清晰。
▍11、Python中append,insert和extend的區(qū)別?
append:在列表末尾添加新元素。
insert:在列表的特定位置添加元素。
extend:通過添加新列表來擴(kuò)展列表。
numbers = [1,2,3,4,5]
numbers.append(6)
print(numbers)
>[1,2,3,4,5,6]
## insert(position,value)
numbers.insert(2,7)
print(numbers)
>[1,2,7,3,4,5,6]
numbers.extend([7,8,9])
print(numbers)
>[1,2,7,3,4,5,6,7,8,9]
numbers.append([4,5])
>[1,2,7,3,4,5,6,7,8,9,[4,5]]
▍12、break、continue、pass是什么?
break:在滿足條件時(shí),它將導(dǎo)致程序退出循環(huán)。
continue:將返回到循環(huán)的開頭,它使程序在當(dāng)前循環(huán)迭代中的跳過所有剩余語句。
pass:使程序傳遞所有剩余語句而不執(zhí)行。
▍13、區(qū)分Python中的remove,del和pop?
remove:將刪除列表中的第一個(gè)匹配值,它以值作為參數(shù)。
del:使用索引刪除元素,它不返回任何值。
pop:將刪除列表中頂部的元素,并返回列表的頂部元素。
numbers = [1,2,3,4,5]
numbers.remove(5)
> [1,2,3,4]
del numbers[0]
>[2,3,4]
numbers.pop()
>4
▍14、什么是switch語句。如何在Python中創(chuàng)建switch語句?
switcher = {
1: "January",
2: "February",
3: "March",
4: "April",
5: "May",
6: "June",
7: "July",
8: "August",
9: "September",
10: "October",
11: "November",
12: "December"
}
month = int(input())
print(switcher.get(month))
> 3
march
▍15、舉例說明Python中的range函數(shù)?
range:range函數(shù)返回從起點(diǎn)到終點(diǎn)的一系列序列。
range(start, end, step),第三個(gè)參數(shù)是用于定義范圍內(nèi)的步數(shù)。
# number
for i in range(5):
print(i)
> 0,1,2,3,4
# (start, end)
for i in range(1, 5):
print(i)
> 1,2,3,4
# (start, end, step)
for i in range(0, 5, 2):
print(i)
>0,2,4
▍16、==和is的區(qū)別是?
==比較兩個(gè)對(duì)象或值的相等性。
is運(yùn)算符用于檢查兩個(gè)對(duì)象是否屬于同一內(nèi)存對(duì)象。
lst1 = [1,2,3]
lst2 = [1,2,3]
lst1 == lst2
>True
lst1 is lst2
>False
▍17、如何更改列表的數(shù)據(jù)類型?
要將列表的數(shù)據(jù)類型進(jìn)行更改,可以使用tuple()或者set()。
lst = [1,2,3,4,2]
# 更改為集合
set(lst) ## {1,2,3,4}
# 更改為元組
tuple(lst) ## (1,2,3,4,2)
▍18、Python中注釋代碼的方法有哪些?
在Python中,我們可以通過下面兩種方式進(jìn)行注釋。
1. 三引號(hào)''',用于多行注釋。
2. 單井號(hào)#,用于單行注釋。
▍19、!=和is not運(yùn)算符的區(qū)別?
!=如果兩個(gè)變量或?qū)ο蟮闹挡幌嗟龋瑒t返回true。
is not是用來檢查兩個(gè)對(duì)象是否屬于同一內(nèi)存對(duì)象。
lst1 = [1,2,3,4]
lst2 = [1,2,3,4]
lst1 != lst2
>False
lst1 is not lst2
>True
▍20、Python是否有main函數(shù)?
是的,它有的。只要我們運(yùn)行Python腳本,它就會(huì)自動(dòng)執(zhí)行。
▍21、什么是lambda函數(shù)?
Lambda函數(shù)是不帶名稱的單行函數(shù),可以具有n個(gè)參數(shù),但只能有一個(gè)表達(dá)式。也稱為匿名函數(shù)。
a = lambda x, y:x + y
print(a(5, 6))
> 11
▍22、iterables和iterators之間的區(qū)別?
iterable:可迭代是一個(gè)對(duì)象,可以對(duì)其進(jìn)行迭代。在可迭代的情況下,整個(gè)數(shù)據(jù)一次存儲(chǔ)在內(nèi)存中。
iterators:迭代器是用來在對(duì)象上迭代的對(duì)象。它只在被調(diào)用時(shí)被初始化或存儲(chǔ)在內(nèi)存中。迭代器使用next從對(duì)象中取出元素。
# List is an iterable
lst = [1,2,3,4,5]
for i in lst:
print(i)
# iterator
lst1 = iter(lst)
next(lst1)
>1
next(lst1)
>2
for i in lst1:
print(i)
>3,4,5
▍23、Python中的Map Function是什么?
map函數(shù)在對(duì)可迭代對(duì)象的每一項(xiàng)應(yīng)用特定函數(shù)后,會(huì)返回map對(duì)象。
▍24、解釋Python中的Filter?
過濾器函數(shù),根據(jù)某些條件從可迭代對(duì)象中篩選值。
# iterable
lst = [1,2,3,4,5,6,7,8,9,10]
def even(num):
if num%2==0:
return num
# filter all even numbers
list(filter(even,lst))
---------------------------------------------
[2, 4, 6, 8, 10]
▍25、解釋Python中reduce函數(shù)的用法?
reduce()函數(shù)接受一個(gè)函數(shù)和一個(gè)序列,并在計(jì)算后返回?cái)?shù)值。
from functools import reduce
a = lambda x,y:x+y
print(reduce(a,[1,2,3,4]))
> 10
▍26、什么是pickling和unpickling?
pickling是將Python對(duì)象(甚至是Python代碼),轉(zhuǎn)換為字符串的過程。
unpickling是將字符串,轉(zhuǎn)換為原來對(duì)象的逆過程。
▍27、解釋*args和**kwargs?
*args,是當(dāng)我們不確定要傳遞給函數(shù)參數(shù)的數(shù)量時(shí)使用的。
def add(* num):
sum = 0
for val in num:
sum = val + sum
print(sum)
add(4,5)
add(7,4,6)
add(10,34,23)
---------------------
9
17
67
**kwargs,是當(dāng)我們想將字典作為參數(shù)傳遞給函數(shù)時(shí)使用的。
def intro(**data):
print("\nData type of argument:",type(data))
for key, value in data.items():
print("{} is {}".format(key,value))
intro(name="alex",Age=22, Phone=1234567890)
intro(name="louis",Email="[email protected]",Country="Wakanda", Age=25)
--------------------------------------------------------------
Data type of argument: <class 'dict'>
name is alex
Age is 22
Phone is 1234567890
Data type of argument: <class 'dict'>
name is louis
Email is [email protected]
Country is Wakanda
Age is 25
▍28、解釋re模塊的split()、sub()、subn()方法?
split():只要模式匹配,此方法就會(huì)拆分字符串。
sub():此方法用于將字符串中的某些模式替換為其他字符串或序列。
subn():和sub()很相似,不同之處在于它返回一個(gè)元組,將總替換計(jì)數(shù)和新字符串作為輸出。
import re
string = "There are two ball in the basket 101"
re.split("\W+",string)
---------------------------------------
['There', 'are', 'two', 'ball', 'in', 'the', 'basket', '101']
re.sub("[^A-Za-z]"," ",string)
----------------------------------------
'There are two ball in the basket'
re.subn("[^A-Za-z]"," ",string)
-----------------------------------------
('There are two ball in the basket', 10)
▍29、Python中的生成器是什么?
生成器(generator)的定義與普通函數(shù)類似,生成器使用yield關(guān)鍵字生成值。
如果一個(gè)函數(shù)包含yield關(guān)鍵字,那么該函數(shù)將自動(dòng)成為一個(gè)生成器。
# A program to demonstrate the use of generator object with next() A generator function
def Fun():
yield 1
yield 2
yield 3
# x is a generator object
x = Fun()
print(next(x))
-----------------------------
1
print(next(x))
-----------------------------
2
▍30、如何使用索引來反轉(zhuǎn)Python中的字符串?
string = 'hello'
string[::-1]
>'olleh'
▍31、類和對(duì)象有什么區(qū)別?
類(Class)被視為對(duì)象的藍(lán)圖。類中的第一行字符串稱為doc字符串,包含該類的簡短描述。
在Python中,使用class關(guān)鍵字可以創(chuàng)建了一個(gè)類。一個(gè)類包含變量和成員組合,稱為類成員。
對(duì)象(Object)是真實(shí)存在的實(shí)體。在Python中為類創(chuàng)建一個(gè)對(duì)象,我們可以使用obj = CLASS_NAME()
例如:obj = num()
使用類的對(duì)象,我們可以訪問類的所有成員,并對(duì)其進(jìn)行操作。
class Person:
""" This is a Person Class"""
# varable
age = 10
def greets(self):
print('Hello')
# object
obj = Person()
print(obj.greet)
----------------------------------------
Hello
▍32、你對(duì)Python類中的self有什么了解?
self表示類的實(shí)例。
通過使用self關(guān)鍵字,我們可以在Python中訪問類的屬性和方法。
注意,在類的函數(shù)當(dāng)中,必須使用self,因?yàn)轭愔袥]有用于聲明變量的顯式語法。
▍33、_init_在Python中有什么用?
“__init__”是Python類中的保留方法。
它被稱為構(gòu)造函數(shù),每當(dāng)執(zhí)行代碼時(shí)都會(huì)自動(dòng)調(diào)用它,它主要用于初始化類的所有變量。
▍34、解釋一下Python中的繼承?
繼承(inheritance)允許一個(gè)類獲取另一個(gè)類的所有成員和屬性。繼承提供代碼可重用性,可以更輕松地創(chuàng)建和維護(hù)應(yīng)用程序。
被繼承的類稱為超類,而繼承的類稱為派生類/子類。
▍35、Python中OOPS是什么?
面向?qū)ο缶幊蹋橄?Abstraction)、封裝(Encapsulation)、繼承(Inheritance)、多態(tài)(Polymorphism)
▍36、什么是抽象?
抽象(Abstraction)是將一個(gè)對(duì)象的本質(zhì)或必要特征向外界展示,并隱藏所有其他無關(guān)信息的過程。
▍37、什么是封裝?
封裝(Encapsulation)意味著將數(shù)據(jù)和成員函數(shù)包裝在一起成為一個(gè)單元。
它還實(shí)現(xiàn)了數(shù)據(jù)隱藏的概念。
▍38、什么是多態(tài)?
多態(tài)(Polymorphism)的意思是「許多形式」。
子類可以定義自己的獨(dú)特行為,并且仍然共享其父類/基類的相同功能或行為。
▍39、什么是Python中的猴子補(bǔ)丁?
猴子補(bǔ)丁(monkey patching),是指在運(yùn)行時(shí)動(dòng)態(tài)修改類或模塊。
from SomeOtherProduct.SomeModule import SomeClass
def speak(self):
return "Hello!"
SomeClass.speak = speak
▍40、Python支持多重繼承嗎?
Python可以支持多重繼承。多重繼承意味著,一個(gè)類可以從多個(gè)父類派生。
▍41、Python中使用的zip函數(shù)是什么?
zip函數(shù)獲取可迭代對(duì)象,將它們聚合到一個(gè)元組中,然后返回結(jié)果。
zip()函數(shù)的語法是zip(*iterables)
numbers = [1, 2, 3]
string = ['one', 'two', 'three']
result = zip(numbers,string)
print(set(result))
-------------------------------------
{(3, 'three'), (2, 'two'), (1, 'one')}
▍42、解釋Python中map()函數(shù)?
map()函數(shù)將給定函數(shù)應(yīng)用于可迭代對(duì)象(列表、元組等),然后返回結(jié)果(map對(duì)象)。
我們還可以在map()函數(shù)中,同時(shí)傳遞多個(gè)可迭代對(duì)象。
numbers = (1, 2, 3, 4)
result = map(lambda x: x + x, numbers)
print(list(result))
▍43、Python中的裝飾器是什么?
裝飾器(Decorator)是Python中一個(gè)有趣的功能。
它用于向現(xiàn)有代碼添加功能。這也稱為元編程,因?yàn)槌绦虻囊徊糠衷诰幾g時(shí)會(huì)嘗試修改程序的另一部分。
def addition(func):
def inner(a,b):
print("numbers are",a,"and",b)
return func(a,b)
return inner
@addition
def add(a,b):
print(a+b)
add(5,6)
---------------------------------
numbers are 5 and 6
sum: 11
▍44、編寫程序,查找文本文件中最長的單詞
def longest_word(filename):
with open(filename, 'r') as infile:
words = infile.read().split()
max_len = len(max(words, key=len))
return [word for word in words if len(word) == max_len]
print(longest_word('test.txt'))
----------------------------------------------------
['comprehensions']
▍45、編寫程序,檢查序列是否為回文
a = input("Enter The sequence")
ispalindrome = a == a[::-1]
ispalindrome
>True
▍46、編寫程序,打印斐波那契數(shù)列的前十項(xiàng)
fibo = [0,1]
[fibo.append(fibo[-2]+fibo[-1]) for i in range(8)]
fibo
> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
▍47、編寫程序,計(jì)算文件中單詞的出現(xiàn)頻率
from collections import Counter
def word_count(fname):
with open(fname) as f:
return Counter(f.read().split())
print(word_count("test.txt"))
▍48、編寫程序,輸出給定序列中的所有質(zhì)數(shù)
lower = int(input("Enter the lower range:"))
upper = int(input("Enter the upper range:"))
list(filter(lambda x:all(x % y != 0 for y in range(2, x)), range(lower, upper)))
-------------------------------------------------
Enter the lower range:10
Enter the upper range:50
[11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
▍49、編寫程序,檢查數(shù)字是否為Armstrong

將每個(gè)數(shù)字依次分離,并累加其立方(位數(shù))。
最后,如果發(fā)現(xiàn)總和等于原始數(shù),則稱為阿姆斯特朗數(shù)(Armstrong)。
num = int(input("Enter the number:\n"))
order = len(str(num))
sum = 0
temp = num
while temp > 0:
digit = temp % 10
sum += digit ** order
temp //= 10
if num == sum:
print(num,"is an Armstrong number")
else:
print(num,"is not an Armstrong number")
▍50、用一行Python代碼,從給定列表中取出所有的偶數(shù)和奇數(shù)
a = [1,2,3,4,5,6,7,8,9,10]
odd, even = [el for el in a if el % 2==1], [el for el in a if el % 2==0]
print(odd,even)
> ([1, 3, 5, 7, 9], [2, 4, 6, 8, 10])





