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

本文爲Python面試題系列的下篇,和上篇同樣,既有基礎知識也有進階版知識,話題涵蓋腳本撰寫、Python編碼和數據結構。若是錯過了上篇,戳這裏查看python

Q 1. Python支持什麼數據類型?git

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

Python支持5種數據類型:shell

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

>>> a=7.0
>>>
複製代碼

2. Strings(字符串)——字符串是一個字符序列。咱們用單引號或雙引號來聲明字符串。編程

>>> title="Ayushi's Book"
複製代碼

3. Lists(列表)——列表就是一些值的有序集合,咱們用方括號聲明列表。api

>>> 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’ 對象不支持數據項分配bash

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面試題,固然確定沒法涵蓋全部的知識點,後面若有機會再另行補充,歡迎關注。

相關文章
相關標籤/搜索