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