2018年最常見的Python面試題&答案(下篇)

景略集智發表於2018-08-28

本文為Python面試題系列的下篇,和上篇一樣,既有基礎知識也有進階版知識,話題涵蓋指令碼撰寫、Python編碼和資料結構。如果錯過了上篇,戳這裡檢視

Q 1. Python支援什麼資料型別?

這是最基本的Python面試問題。

Python支援5種資料型別:

1. Numbers(數字)——用於儲存數值

>>> a=7.0
>>>
複製程式碼

2. Strings(字串)——字串是一個字元序列。我們用單引號或雙引號來宣告字串。

>>> title="Ayushi's Book"
複製程式碼

3. Lists(列表)——列表就是一些值的有序集合,我們用方括號宣告列表。

>>> colors=['red','green','blue']
>>> type(colors)
 <class 'list'>
複製程式碼

4. Tuples(元組)——元組和列表一樣,也是一些值的有序集合,區別是元組是不可變的,意味著我們無法改變元組內的值。

>>> name=('Ayushi','Sharma')
>>> name[0]='Avery'
Traceback (most recent call last):
File "<pyshell#129>", line 1, in <module>
name[0]='Avery'
複製程式碼

TypeError:‘tuple’ 物件不支援資料項分配

5. Dictionary(字典)——字典是一種資料結構,含有鍵值對。我們用大括號宣告字典。

>>> squares={1:1,2:4,3:9,4:16,5:25}
>>> type(squares)
<class 'dict'>
>>> type({})
<class 'dict'>
複製程式碼

我們還可以使用字典引導式:

>>> squares={x:x**2 for x in range(1,6)}
>>> squares
{1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
複製程式碼

Q 2. docstring是什麼?

Docstring是一種文件字串,用於解釋構造的作用。我們在函式、類或方法中將它放在首位來描述其作用。我們用三個單引號或雙引號來宣告docstring。

>>> def sayhi():
    """
用該函式列印Hi
"""
  print("Hi")   
>>> sayhi()
 
Hi
複製程式碼

要想獲取一個函式的docstring,我們使用它的_doc_屬性。

要想獲取一個函式的docstring,我們使用它的_doc_屬性。
>>> sayhi.__doc__
‘\n\tThis function prints Hi\n\t’
複製程式碼

和註釋不同,docstring在執行時會保留下來。

Q 3. PYTHONPATH變數是什麼?

PYTHONPATH是Python中一個重要的環境變數,用於在匯入模組的時候搜尋路徑。因此它必須包含Python源庫目錄以及含有Python原始碼的目錄。你可以手動設定PYTHONPATH,但通常Python安裝程式會把它呈現出來。 從Q 4到Q 20 都是Python面試基礎題,是Python新手面試時常出現的問題。

Q 4. 什麼是切片?

切片是Python中的一種方法,能讓我們只檢索列表、元素或字串的一部分。在切片時,我們使用切片操作符[]。

>>> (1,2,3,4,5)[2:4]
(3, 4)
 
>>> [7,6,8,5,9][2:]
[8, 5, 9]
 
>>> 'Hello'[:-1]
‘Hell’
複製程式碼

Q 5. 什麼是namedtuple ?

Namedtuple能讓我們用名稱/標籤獲取一個元組的元素,這裡我們使用函式namedtuple(),將其從collections模組中匯入。

>>> from collections import namedtuple
>>> result=namedtuple('result','Physics Chemistry Maths') #format
>>> Ayushi=result(Physics=86,Chemistry=95,Maths=86) #declaring the tuple
>>> Ayushi.Chemistry
 
95
複製程式碼

如上所示,它能讓我們用物件Ayushi的Chemistry屬性獲取Chemistry中的符號。 更多關於namedtuples的知識,參考這裡

Q 6. 在Python中如何宣告一條註釋?

和C++等程式語言不同,Python並沒有多行註釋,只有雜湊字元(#)。在符號#後的內容都被視作註釋,直譯器會自動將其忽略。

>>> #註釋行1
>>> #註釋行2
複製程式碼

實際上你可以在程式碼中任何位置插入註釋,用以解釋程式碼。

Q 7. 在Python中怎樣將字串轉換為整型變數?

如果字串只含有數字字元,可以用函式int()將其轉換為整數。

>>> int('227')
227
複製程式碼

我們檢查一下變數型別:

>>> type('227')
<class 'str'>
>>> type(int('227'))
<class 'int'>
複製程式碼

Q 8. 在Python中怎樣獲取輸入?

我們用函式input()從使用者那裡獲取輸入。在Python 2中,我們還有另一個函式raw_input()。 比如input()將文字獲取為引數值展現出來:

>>> a=input('Enter a number')
複製程式碼

輸入數字7

但是如果你多加註意,會發現它以字串形式獲取輸入。

>>> type(a)
<class 'str'>
複製程式碼

將之乘以2能得到:

>>> a*=2
>>> a
’77’
複製程式碼

那麼如果需要使用整數時呢?

我們使用int()函式。

>>> a=int(input('Enter a number'))
複製程式碼

輸入數字7.

現在當我們將之乘以2就會得到:

>>> a*=2
>>> a
 
14
複製程式碼

Q 9. Python中的不可變集合(frozenset)是什麼?

我們舉例來回答此類Python面試問題。

首先,我們討論一下什麼是集合。集合就是一系列資料項的合集,不存在任何副本。另外,集合是無序的。

>>> myset={1,3,2,2}
>>> myset
{1, 2, 3}
複製程式碼

這就意味著我們無法索引它。

>>> myset[0]
Traceback (most recent call last):
File "<pyshell#197>", line 1, in <module>
myset[0]
複製程式碼

TypeError:‘set’不支援索引。 不過,集合是可變的。而不可變集合卻不可變,這意味著我們無法改變它的值,從而也使其無法作為字典的鍵值。

>>> myset=frozenset([1,3,2,2])
>>> myset
frozenset({1, 2, 3})
>>> type(myset)
<class 'frozenset'>
複製程式碼

更多關於集合的內容,檢視這裡

Q 10. 在Python中如何生成一個隨機數?

要想生成隨機數,我們可以從random模組中匯入函式random()。

>>> from random import random
>>> random()
0.7931961644126482
複製程式碼

這裡我們呼叫help函式。

>>> help(random)
複製程式碼

關於內建函式random的help執行結果:

random(…) method of random.Random instance
random() -> x in the interval [0, 1).
複製程式碼

這意味著random()會返回一個大於等於0且小於1 的隨機數。

我們還可以使用函式randint(),它會用兩個參數列示一個區間,返回該區間內的一個隨機整數。

>>> from random import randint
>>> randint(2,7)
6
 
>>> randint(2,7)
5
 
>>> randint(2,7)
7
 
>>> randint(2,7)
6
複製程式碼

Q 11. 怎樣將字串中第一個字母大寫?

最簡單的方法就是用capitalize()方法。

>>> 'ayushi'.capitalize()
‘Ayushi’
>>> type(str.capitalize)
<class 'method_descriptor'>
複製程式碼

不過這也會讓其它字母變為大寫。

>>> '@yushi'.capitalize()
‘@yushi’
複製程式碼

Q 12. 如何檢查字串中所有的字元都為字母數字?

對於這個問題,我們可以使用isalnum()方法。

>>> 'Ayushi123'.isalnum()
True
 
>>> 'Ayushi123!'.isalnum()
False
複製程式碼

我們還可以用其它一些方法:

>>> '123.3'.isdigit()
False
 
>>> '123'.isnumeric()
True
 
>>> 'ayushi'.islower()
True
 
>>> 'Ayushi'.isupper()
False
 
>>> 'Ayushi'.istitle()
True
 
>>> '   '.isspace()
True
 
>>> '123F'.isdecimal()
False

複製程式碼

Q 13. 什麼是Python中的連線(concatenation)?

Python中的連線就是將兩個序列連在一起,我們使用+運算子完成。

>>> '32'+'32'
‘3232’
 
>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
 
>>> (2,3)+(4)
Traceback (most recent call last):
File "<pyshell#256>", line 1, in <module>
(2,3)+(4)
複製程式碼

TypeError:只能將元組(不是“整數”)連線到元組。

這裡4被看作一個整數,我們再來一次。

>>> (2,3)+(4,)
(2, 3, 4)
複製程式碼

Q 14. 什麼是函式?

當我們想執行一系列語句時,我們可以為其賦予一個名字。我們來定義一個函式,讓它取兩個數返回一個更大的數。

>>> def greater(a,b):
返回 a if a>b else b
>>> greater(3,3.5)
3.5
複製程式碼

你可以自己建立函式,也可以使用Python的很多內建函式,看這裡

Q 15. 解釋拉姆達表示式,什麼時候會用到它?

如果我們需要一個只有單一表示式的函式,我們可以匿名定義它。拉姆達表示式通常是在需要一個函式,但是又不想費神去命名一個函式的場合下使用,也就是指匿名函式。

假如我們想將上面Q 14中的函式定義為拉姆達表示式,可以在直譯器中輸入如下程式碼:

>>> (lambda a,b:a if a>b else b)(3,3.5)
3.5
複製程式碼

這裡,a和b都是輸入,a if a>b else b就是返回的輸入,引數為3和3.5.

當然,也有可能沒有任何輸入。

>>> (lambda :print("Hi"))()
Hi
複製程式碼

更多關於拉姆達表示式的內容,參考這裡

Q 16. 什麼是遞迴?

在呼叫一個函式的過程中,直接或間接地呼叫了函式本身這個就叫遞迴。但為了避免出現死迴圈,必須要有一個結束條件,舉個例子:

>>> def facto(n):
    if n==1: return 1
    return n*facto(n-1)
>>> facto(4)
24
複製程式碼

Q 17. 什麼是生成器?

生成器會生成一系列的值用於迭代,這樣看它又是一種可迭代物件。它是在for迴圈的過程中不斷計算出下一個元素,並在適當的條件結束for迴圈。

我們定義一個能逐個“yield”值的函式,然後用一個for迴圈來迭代它。

>>> def squares(n):
    i=1
    while(i<=n):
        yield i**2
        i+=1
>>> for i in squares(7):
    print(i)
1
 
4
 
9
 
16
 
25
 
36
 
49
複製程式碼

更多關於生成器的內容,參看這裡

Q 18. 什麼是迭代器?

迭代器是訪問集合元素的一種方式。迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。我們使用inter()函式建立迭代器。

odds=iter([1,3,5,7,9])
複製程式碼

每次想獲取一個物件時,我們就呼叫next()函式。

>>> next(odds)
1
 
>>> next(odds)
3
 
>>> next(odds)
5
 
>>> next(odds)
7
 
>>> next(odds)
9
複製程式碼

現在我們再次呼叫它,會丟擲StopIteration異常。這是因為它已經抵達需要迭代的值的尾部。

>>> next(odds)
Traceback (most recent call last):
File "<pyshell#295>", line 1, in <module>
next(odds)
StopIteration
複製程式碼

更多關乎迭代器的內容,參看這裡

Q 19. 請說說生成器和迭代器之間的區別

  • 在使用生成器時,我們建立一個函式;在使用迭代器時,我們使用內建函式iter()和next()。

  • 在生成器中,我們使用關鍵字‘yield’來每次生成/返回一個物件。

  • 生成器中有多少‘yield’語句,你可以自定義。

  • 每次‘yield’暫停迴圈時,生成器會儲存本地變數的狀態。而迭代器並不會使用區域性變數,它只需要一個可迭代物件進行迭代。

  • 使用類可以實現你自己的迭代器,但無法實現生成器。

  • 生成器執行速度快,語法簡潔,更簡單。

  • 迭代器更能節約記憶體。

關於生成器和迭代器二者的對比,更多內容檢視這裡

Q 20. 我們都知道現在Python很火,但是對於一門技術我們不光要知道它的優點,也要知道它的缺點,請談談Python的不足之處。

Python有以下缺陷:

  • Python的可解釋特徵會拖累其執行速度。

  • 雖然Python在很多方面都效能良好,但在移動計算和瀏覽器方面表現不夠好。

  • 由於是動態語言,Python使用鴨子型別,即duck-typing,這會增加執行時錯誤。

從Q 21到Q 30都是進階版Python面試問題,不過Python新手也可以參考。

Q 21. 函式zip()的是幹嘛的?

Python新手可能對這個函式不是很熟悉,zip()可以返回元組的迭代器。

>>> list(zip(['a','b','c'],[1,2,3]))
[(‘a’, 1), (‘b’, 2), (‘c’, 3)]
複製程式碼

在這裡zip()函式對兩個列表中的資料項進行了配對,並用它們建立了元組。

>>> list(zip(('a','b','c'),(1,2,3)))
[(‘a’, 1), (‘b’, 2), (‘c’, 3)]
複製程式碼

Q 22. 如果你困在了死迴圈裡,怎麼打破它?

出現了這種問題時,我們可以按Ctrl+C,這樣可以打斷執行程式。我們建立一個死迴圈來解釋一下。

>>> def counterfunc(n):
    while(n==7):print(n)
>>> counterfunc(7)
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
7
 
Traceback (most recent call last):
 File "<pyshell#332>", line 1, in <module>
   counterfunc(7)
 File "<pyshell#331>", line 2, in counterfunc
   while(n==7):print(n)
KeyboardInterrupt
 
>>>
複製程式碼

Q 23. 解釋Python的引數傳遞機制

Python使用按引用傳遞(pass-by-reference)將引數傳遞到函式中。如果你改變一個函式內的引數,會影響到函式的呼叫。這是Python的預設操作。不過,如果我們傳遞字面引數,比如字串、數字或元組,它們是按值傳遞,這是因為它們是不可變的。

Q 24. 如何用Python找出你目前在哪個目錄?

我們可以使用函式/方法getcwd(),從模組os中將其匯入。

>>> import os
>>> os.getcwd()
'C:\\Users\\lifei\\AppData\\Local\\Programs\\Python\\Python36-32'
>>> type(os.getcwd)
<class 'builtin_function_or_method'>
複製程式碼

我們還可以用chdir()修改當前工作目錄。

>>> os.chdir('C:\\Users\\lifei\\Desktop')
>>> os.getcwd()
'C:\\Users\\lifei\\Desktop'
複製程式碼

Q 25. 怎樣發現字串中與‘cake’押韻的第一個字?

我們可以使用函式search(),然後用group()獲取輸出。

>>> import re
>>> rhyme=re.search('.ake','I would make a cake, but I hate to bake')
>>> rhyme.group()
'make'
複製程式碼

我們知道,函式search()會在第一次匹配時停止執行,這樣我們就能得到第一個與‘cake’押韻的字。

Q 26. 如何以相反順序展示一個檔案的內容?

我們首先回到桌面,使用模組os中的chdir()函式/方法。

>>> import os
>>> os.chdir('C:\\Users\\lifei\\Desktop')
複製程式碼

這裡我們要使用的檔案時Today.txt,它的內容如下:

OS, DBMS, DS, ADA

HTML, CSS, jQuery, JavaScript

Python, C++, Java

This sem’s subjects

Debugger

itertools

Container
複製程式碼

我們將內容讀取為一個列表,然後在上面呼叫reversed()函式:

>>> for line in reversed(list(open('Today.txt'))):
   print(line.rstrip())
container
 
itertools
 
Debugger
 
This sem’s subjects
 
Python, C++, Java
 
HTML, CSS, jQuery, JavaScript
 
OS, DBMS, DS, ADA
複製程式碼

如果沒有rstrip(),我們會在輸出中得到空行。

Q 27. 什麼是Tkinter ?

TKinter是一款很知名的Python庫,用它我們可以製作圖形使用者介面。其支援不同的GUI工具和視窗構件,比如按鈕、標籤、文字框等等。這些工具和構件均有不同的屬性,比如維度、顏色、字型等。

我們也能匯入Tkinter模組。

>>> import tkinter
>>> top=tkinter.Tk()
複製程式碼

這會為你建立一個新視窗,然後可以在視窗上新增各個構件。

Q 28. 請談談.pyc檔案和.py檔案的不同之處

雖然這兩種檔案均儲存位元組程式碼,但.pyc檔案是Python檔案的編譯版本,它有平臺無關的位元組程式碼,因此我們可以在任何支援.pyc格式檔案的平臺上執行它。Python會自動生成它以優化效能(載入時間,而非執行速度)。

Q 29. 如何在Python中建立自己的包?

Python中建立包是比較方便的,只需要在當前目錄建立一個資料夾,資料夾中包含一個__init__.py檔案和若干個模組檔案,其中__init__.py可以是一個空檔案,但還是建議將包中所有需要匯出的變數放到__all__中,這樣可以確保包的介面清晰明瞭,易於使用。

Q 30. 如何計算一個字串的長度?

這個也比較簡單,在我們想計算長度的字串上呼叫函式len()即可。

>>> len('Ayushi Sharma')
13
複製程式碼

結語 本文我們緊接著上篇總結了另外一些常見的Python面試題,當然肯定無法涵蓋所有的知識點,後面如有機會再另行補充,歡迎關注。

相關文章