天天看點

Python面試題

▍1、什麼是Python?為什麼它會如此流行?

Python是一種解釋的、進階的、通用的程式設計語言。

Python的設計理念是通過使用必要的空格與空行,增強代碼的可讀性。

它之是以受歡迎,就是因為它具有簡單易用的文法。

▍2、為什麼Python執行速度慢,我們如何改進它?

Python代碼執行緩慢的原因,是因為它是一種解釋型語言。它的代碼在運作時進行解釋,而不是編譯為本地語言。

為了提高Python代碼的速度,我們可以使用CPython、Numba,或者我們也可以對代碼進行一些修改。

1. 減少記憶體占用。

2. 使用内置函數和庫。

3. 将計算移到循環外。

4. 保持小的代碼庫。

5. 避免不必要的循環

▍3、Python有什麼特點?

1. 易于編碼

2. 免費和開源語言

3. 進階語言

4. 易于調試

5. OOPS支援

6. 大量的标準庫和第三方子產品

7. 可擴充性(我們可以用C或C++編寫Python代碼)

8. 使用者友好的資料結構

▍4、Python有哪些應用?

1. Web開發

2. 桌面GUI開發

3. 人工智能和機器學習

4. 軟體開發

5. 業務應用程式開發

6. 基于控制台的應用程式

7. 軟體測試

8. Web自動化

9. 基于音頻或視訊的應用程式

10. 圖像處理應用程式

▍5、Python的局限性?

1. 速度

2. 移動開發

3. 記憶體消耗(與其他語言相比非常高)

4. 兩個版本的不相容(2,3)

5. 運作錯誤(需要更多測試,并且錯誤僅在運作時顯示)

6. 簡單性

▍6、Python代碼是如何執行的?

首先,解釋器讀取Python代碼并檢查是否有文法或格式錯誤。

如果發現錯誤,則暫停執行。如果沒有發現錯誤,則解釋器會将Python代碼轉換為等效形式或位元組代碼。

然後将位元組碼發送到Python虛拟機(PVM),這裡Python代碼将被執行,如果發現任何錯誤,則暫停執行,否則結果将顯示在輸出視窗中。

▍7、如何在Python中管理記憶體?

Python記憶體由Python的私有headspace管理。

所有的Python對象和資料結構都位于一個私有堆中。私用堆的配置設定由Python記憶體管理器負責。

Python還内置了一個的垃圾收集器,可以回收未使用的記憶體并釋放記憶體,使其可用于headspace。

▍8、解釋Python的内置資料結構?

Python中主要有四種類型的資料結構。 

清單:清單是從整數到字元串甚至另一個清單的異構資料項的集合。清單是可變的。清單完成了其他語言中大多數集合資料結構的工作。清單在[ ]方括号中定義。

例如:a = [1,2,3,4]

集合:集合是唯一進制素的無序集合。集合運算如聯合|,交集&和差異,可以應用于集合。集是不可變的。()用于表示一個集合。

例如:a = {1,2,3,4}

元組:Python元組的工作方式與Python清單完全相同,隻是它們是不可變的。()用于定義元組。

例如:a =(1,2,3,4)

字典:字典是鍵值對的集合。它類似于其他語言中的hash map。在字典裡,鍵是唯一且不可變的對象。

例如:a = {'number':[1,2,3,4]}

▍9、解釋//、%、* *運算符?

//(Floor Division)-這是一個除法運算符,它傳回除法的整數部分。

例如:5 // 2 = 2

%(模數)-傳回除法的餘數。

例如:5 % 2 = 1

**(幂)-它對運算符執行指數計算。a ** b表示a的b次方。

例如:5 ** 2 = 25、5 ** 3 = 125

▍10、Python中的單引号和雙引号有什麼差別?

在Python中使用單引号(' ')或雙引号(" ")是沒有差別的,都可以用來表示一個字元串。

這兩種通用的表達方式,除了可以簡化程式員的開發,避免出錯之外,還有一種好處,就是可以減少轉義字元的使用,使程式看起來更簡潔,更清晰。

▍11、Python中append,insert和extend的差別?

append:在清單末尾添加新元素。

insert:在清單的特定位置添加元素。

extend:通過添加新清單來擴充清單。

numbers = [1,2,3,4,5]

numbers.append(6)

print(numbers)

>[1,2,3,4,5,6]

## insert(position,value)

numbers.insert(2,7)  

>[1,2,7,4,5,6]

numbers.extend([7,8,9])

>[1,2,7,4,5,6,7,8,9]

numbers.append([4,5])

>[1,2,7,4,5,6,7,8,9,[4,5]]

▍12、break、continue、pass是什麼?

break:在滿足條件時,它将導緻程式退出循環。

continue:将傳回到循環的開頭,它使程式在目前循環疊代中的跳過所有剩餘語句。

pass:使程式傳遞所有剩餘語句而不執行。

▍13、區分Python中的remove,del和pop?

remove:将删除清單中的第一個比對值,它以值作為參數。

del:使用索引删除元素,它不傳回任何值。

pop:将删除清單中頂部的元素,并傳回清單的頂部元素。

numbers.remove(5)

> [1,2,3,4]

del numbers[0]

>[2,3,4]

numbers.pop()

>4

▍14、什麼是switch語句。如何在Python中建立switch語句?

switch語句是實作多分支選擇功能,根據清單值測試變量。

switch語句中的每個值都被稱為一個case。

在Python中,沒有内置switch函數,但是我們可以建立一個自定義的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函數?

range:range函數傳回從起點到終點的一系列序列。

range(start, end, step),第三個參數是用于定義範圍内的步數。

# number

for i in range(5):

    print(i)

> 0,1,2,3,4

# (start, end)

for i in range(1, 5):

> 1,2,3,4

# (start, end, step)

for i in range(0, 5, 2):

>0,2,4

▍16、==和is的差別是?

==比較兩個對象或值的相等性。

is運算符用于檢查兩個對象是否屬于同一記憶體對象。

lst1 = [1,2,3]

lst2 = [1,2,3]

lst1 == lst2

>True

lst1 is lst2

>False

▍17、如何更改清單的資料類型?

要将清單的資料類型進行更改,可以使用tuple()或者set()。

lst = [1,2,3,4,2]

# 更改為集合

set(lst)    ## {1,2,3,4}

# 更改為元組

tuple(lst)  ## (1,2,3,4,2)

▍18、Python中注釋代碼的方法有哪些?

在Python中,我們可以通過下面兩種方式進行注釋。

1. 三引号''',用于多行注釋。

2. 單井号#,用于單行注釋。

▍19、!=和is not運算符的差別?

!=如果兩個變量或對象的值不相等,則傳回true。

is not是用來檢查兩個對象是否屬于同一記憶體對象。

lst1 = [1,2,3,4]

lst2 = [1,2,3,4]

lst1 != lst2

lst1 is not lst2

▍20、Python是否有main函數?

是的,它有的。隻要我們運作Python腳本,它就會自動執行。

▍21、什麼是lambda函數?

Lambda函數是不帶名稱的單行函數,可以具有n個參數,但隻能有一個表達式。也稱為匿名函數。

a = lambda x, y:x + y

print(a(5, 6))

> 11

▍22、iterables和iterators之間的差別?

iterable:可疊代是一個對象,可以對其進行疊代。在可疊代的情況下,整個資料一次存儲在記憶體中。

iterators:疊代器是用來在對象上疊代的對象。它隻在被調用時被初始化或存儲在記憶體中。疊代器使用next從對象中取出元素。

# List is an iterable

lst = [1,2,3,4,5]

for i in lst:

# iterator

lst1 = iter(lst)

next(lst1)

>1

>2

for i in lst1:

>3,4,5

▍23、Python中的Map Function是什麼?

map函數在對可疊代對象的每一項應用特定函數後,會傳回map對象。

▍24、解釋Python中的Filter?

過濾器函數,根據某些條件從可疊代對象中篩選值。

# 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函數的用法?

reduce()函數接受一個函數和一個序列,并在計算後傳回數值。

from functools import reduce

a = lambda x,y:x+y

print(reduce(a,[1,2,3,4]))

> 10

▍26、什麼是pickling和unpickling?

pickling是将Python對象(甚至是Python代碼),轉換為字元串的過程。

unpickling是将字元串,轉換為原來對象的逆過程。

▍27、解釋*args和**kwargs?

*args,是當我們不确定要傳遞給函數參數的數量時使用的。

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

57

**kwargs,是當我們想将字典作為參數傳遞給函數時使用的。

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():隻要模式比對,此方法就會拆分字元串。

sub():此方法用于将字元串中的某些模式替換為其他字元串或序列。

subn():和sub()很相似,不同之處在于它傳回一個元組,将總替換計數和新字元串作為輸出。

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)的定義與普通函數類似,生成器使用yield關鍵字生成值。

如果一個函數包含yield關鍵字,那麼該函數将自動成為一個生成器。

# 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

2

▍30、如何使用索引來反轉Python中的字元串?

string = 'hello'

string[::-1]

>'olleh'

▍31、類和對象有什麼差別?

類(Class)被視為對象的藍圖。類中的第一行字元串稱為doc字元串,包含該類的簡短描述。

在Python中,使用class關鍵字可以建立了一個類。一個類包含變量和成員組合,稱為類成員。

對象(Object)是真實存在的實體。在Python中為類建立一個對象,我們可以使用obj = CLASS_NAME()

例如:obj = num()

使用類的對象,我們可以通路類的所有成員,并對其進行操作。

class Person:

    """ This is a Person Class"""

    # varable

    age = 10

    def greets(self):

        print('Hello')

# object

obj = Person()

print(obj.greet)

Hello

▍32、你對Python類中的self有什麼了解?

self表示類的執行個體。

通過使用self關鍵字,我們可以在Python中通路類的屬性和方法。

注意,在類的函數當中,必須使用self,因為類中沒有用于聲明變量的顯式文法。

▍33、_init_在Python中有什麼用?

“__init__”是Python類中的保留方法。

它被稱為構造函數,每當執行代碼時都會自動調用它,它主要用于初始化類的所有變量。

▍34、解釋一下Python中的繼承?

繼承(inheritance)允許一個類擷取另一個類的所有成員和屬性。繼承提供代碼可重用性,可以更輕松地建立和維護應用程式。

被繼承的類稱為超類,而繼承的類稱為派生類/子類。

▍35、Python中OOPS是什麼?

面向對象程式設計,抽象(Abstraction)、封裝(Encapsulation)、繼承(Inheritance)、多态(Polymorphism)

▍36、什麼是抽象?

抽象(Abstraction)是将一個對象的本質或必要特征向外界展示,并隐藏所有其他無關資訊的過程。

▍37、什麼是封裝?

封裝(Encapsulation)意味着将資料和成員函數包裝在一起成為一個單元。

它還實作了資料隐藏的概念。

▍38、什麼是多态?

多态(Polymorphism)的意思是「許多形式」。

子類可以定義自己的獨特行為,并且仍然共享其父類/基類的相同功能或行為。

▍39、什麼是Python中的猴子更新檔?

猴子更新檔(monkey patching),是指在運作時動态修改類或子產品。

from SomeOtherProduct.SomeModule import SomeClass

def speak(self):

    return "Hello!"

SomeClass.speak = speak

▍40、Python支援多重繼承嗎?

Python可以支援多重繼承。多重繼承意味着,一個類可以從多個父類派生。

▍41、Python中使用的zip函數是什麼?

zip函數擷取可疊代對象,将它們聚合到一個元組中,然後傳回結果。

zip()函數的文法是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()函數?

map()函數将給定函數應用于可疊代對象(清單、元組等),然後傳回結果(map對象)。

我們還可以在map()函數中,同時傳遞多個可疊代對象。 

numbers = (1, 2, 3, 4)

result = map(lambda x: x + x, numbers)

print(list(result))

▍43、Python中的裝飾器是什麼?

裝飾器(Decorator)是Python中一個有趣的功能。

它用于向現有代碼添加功能。這也稱為元程式設計,因為程式的一部分在編譯時會嘗試修改程式的另一部分。

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

▍46、編寫程式,列印斐波那契數列的前十項

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、編寫程式,計算檔案中單詞的出現頻率

from collections import Counter

def word_count(fname):

        with open(fname) as f:

                return Counter(f.read().split())

print(word_count("test.txt"))

▍48、編寫程式,輸出給定序列中的所有質數

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、編寫程式,檢查數字是否為Armstrong

将每個數字依次分離,并累加其立方(位數)。

最後,如果發現總和等于原始數,則稱為阿姆斯特朗數(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代碼,從給定清單中取出所有的偶數和奇數

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)