python面試題(一)

1 簡述解釋型和編譯型編程語言?python

解釋型語言編寫的程序不須要編譯,在執行的時候,專門有一個解釋器可以將VB語言翻譯成機器語言,每一個語句都是執行的時候才翻譯。這樣解釋型語言每執行一次就要翻譯一次,效率比較低。程序員

用編譯型語言寫的程序執行以前,須要一個專門的編譯過程,經過編譯系統,把源高級程序編譯成爲機器語言文件,翻譯只作了一次,運行時不須要翻譯,因此編譯型語言的程序執行效率高,但也不能一律而論,編程

部分解釋型語言的解釋器經過在運行時動態優化代碼,甚至可以使解釋型語言的性能超過編譯型語言。瀏覽器

2 Python解釋器種類以及特色?bash

CPython編程語言

當 從Python官方網站下載並安裝好Python2.7後,就直接得到了一個官方版本的解釋器:Cpython,這個解釋器是用C語言開發的,因此叫 CPython,在命名行下運行python,就是啓動CPython解釋器,CPython是使用最廣的Python解釋器。函數

IPython性能

IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所加強,可是執行Python代碼的功能和CPython是徹底同樣的,比如不少國產瀏覽器雖然外觀不一樣,但內核實際上是調用了IE。學習

PyPy優化

PyPy是另外一個Python解釋器,它的目標是執行速度,PyPy採用JIT技術,對Python代碼進行動態編譯,因此能夠顯著提升Python代碼的執行速度。

Jython

Jython是運行在Java平臺上的Python解釋器,能夠直接把Python代碼編譯成Java字節碼執行。

IronPython

IronPython和Jython相似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,能夠直接把Python代碼編譯成.Net的字節碼。

在Python的解釋器中,使用普遍的是CPython,對於Python的編譯,除了能夠採用以上解釋器進行編譯外,技術高超的開發者還能夠按照本身的需求自行編寫Python解釋器來執行Python代碼,十分的方便!

3 位和字節的關係?

bit就是位,也叫比特位,是計算機表示數據最小的單位

byte就是字節

1byte=8bit

1byte就是1B

一個字符=2字節

1KB=1024B

字節就是Byte,也是B

位就是bit也是b

轉換關係以下:1)1KB=1024B

1B= 8b

4 請至少列舉5個 PEP8 規範(越多越好)。

PEP8 編碼規範 a.不要在行尾加分號, 也不要用分號將兩條命令放在同一行。

b.每行不超過80個字符(長的導入模塊語句和註釋裏的URL除外)

c.不要使用反斜槓鏈接行。Python會將圓括號, 中括號和花括號中的行隱式的鏈接起來

d.寧缺毋濫的使用括號,除非是用於實現行鏈接, 不然不要在返回語句或條件語句中使用括號. 不過在元組兩邊使用括號是能夠的.

e.用4個空格來縮進代碼,不要用tab, 也不要tab和空格混用. 對於行鏈接的狀況, 你應該要麼垂直對齊換行的元素,或者使用4空格的懸掛式縮進

f.頂級定義之間空2行, 方法定義之間空1行,頂級定義之間空兩行, 好比函數或者類定義. 方法定義, 類定義與第一個方法之間, 都應該空一行. 函數或方法中, 某些地方要是你以爲合適, 就空一行.

5 經過代碼實現以下轉換:

二進制轉換成十進制:v = 「0b1111011」

#先將其轉換爲字符串,再使用int函數,指定進制轉換爲十進制。
print(int("0b1111011",2))
值爲123
複製代碼

十進制轉換成二進制:v = 18

print("轉換爲二進制爲:", bin(18))
#轉換爲二進制爲: 0b10010
複製代碼

八進制轉換成十進制:v = 「011」

print(int("011",8))
#9
複製代碼

十進制轉換成八進制:v = 30

print("轉換爲八進制爲:", oct(30))
#轉換爲八進制爲: 0o36
複製代碼

十六進制轉換成十進制:v = 「0x12」

print(int("0x12",16))
#18
複製代碼

十進制轉換成十六進制:v = 87

print("轉換爲十六進制爲:", hex(87))
轉換爲十六進制爲: 0x57
複製代碼

6 python遞歸的最大層數?

def fab(n):
if n == 1:
return 1
else:
return fab(n-1)+ n
print (fab(998))
#獲得的最大數爲998,之後就是報錯了,998這個數值莫名想起廣告詞····
複製代碼
import sys
sys.setrecursionlimit(100000)
def foo(n):
   print(n)
   n += 1
   foo(n)
if __name__ == '__main__':
   foo(1)
#獲得的最大數字在3922-3929之間浮動,這個是和計算機有關係的,將數字調到足夠大了,已經大於系統堆棧,python已經沒法支撐到太大的遞歸崩了。
複製代碼

7 ascii、unicode、utf-八、gbk 區別?

最先只有127個字母被編碼到計算機裏,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,好比大寫字母A的編碼是65,小寫字母z的編碼是122。

可是要處理中文顯然一個字節是不夠的,至少須要兩個字節,並且還不能和ASCII編碼衝突,因此,中國製定了GB2312編碼,用來把中文編進去。

你能夠想獲得的是,全世界有上百種語言,日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏,各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。

所以,Unicode應運而生。Unicode把全部語言都統一到一套編碼裏,這樣就不會再有亂碼問題了。

Unicode標準也在不斷髮展,但最經常使用的是用兩個字節表示一個字符(若是要用到很是偏僻的字符,就須要4個字節)。現代操做系統和大多數編程語言都直接支持Unicode。

新的問題又出現了:若是統一成Unicode編碼,亂碼問題今後消失了。可是,若是你寫的文本基本上所有是英文的話,用Unicode編碼比ASCII編碼須要多一倍的存儲空間,在存儲和傳輸上就十分不划算。

因此,本着節約的精神,又出現了把Unicode編碼轉化爲「可變長編碼」的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不一樣的數字大小編碼成1-6個字節,經常使用的英文字母被編碼成1個字節,漢字一般是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。若是你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間。

UTF-8編碼有一個額外的好處,就是ASCII編碼實際上能夠被當作是UTF-8編碼的一部分,因此,大量只支持ASCII編碼的歷史遺留軟件能夠在UTF-8編碼下繼續工做。

8 字節碼和機器碼的區別?

機器碼(machine code),學名機器語言指令,有時也被稱爲原生碼(Native Code),是電腦的CPU可直接解讀的數據。

一般意義上來理解的話,機器碼就是計算機能夠直接執行,而且執行速度最快的代碼。

用機器語言編寫程序,編程人員要首先熟記所用計算機的所有指令代碼和代碼的涵義。手編程序時,程序員得本身處理每條指令和每一數據的存儲分配和輸入輸出,還得記住編程過程當中每步所使用的工做單元處在何種狀態。這是一件十分繁瑣的工做,編寫程序花費的時間每每是實際運行時間的幾十倍或幾百倍。並且,編出的程序全是些0和1的指令代碼,直觀性差,還容易出錯。如今,除了計算機生產廠家的專業人員外,絕大多數的程序員已經再也不去學習機器語言了。

機器語言是微處理器理解和使用的,用於控制它的操做二進制代碼。

8086到Pentium的機器語言指令長度能夠從1字節到13字節。

儘管機器語言好像是很複雜的,然而它是有規律的。

存在着多至100000種機器語言的指令。這意味着不能把這些種類所有列出來。

總結:機器碼是電腦CPU直接讀取運行的機器指令,運行速度最快,可是很是晦澀難懂,也比較難編寫,通常從業人員接觸不到。

字節碼(Bytecode)是一種包含執行程序、由一序列 op 代碼/數據對 組成的二進制文件。字節碼是一種中間碼,它比機器碼更抽象,須要直譯器轉譯後才能成爲機器碼的中間代碼。

一般狀況下它是已經通過編譯,但與特定機器碼無關。字節碼一般不像源碼同樣可讓人閱讀,而是編碼後的數值常量、引用、指令等構成的序列。

字節碼主要爲了實現特定軟件運行和軟件環境、與硬件環境無關。字節碼的實現方式是經過編譯器和虛擬機器。編譯器將源碼編譯成字節碼,特定平臺上的虛擬機器將字節碼轉譯爲能夠直接執行的指令。字節碼的典型應用爲Java bytecode。

字節碼在運行時經過JVM(JAVA虛擬機)作一次轉換生成機器指令,所以可以更好的跨平臺運行。

總結:字節碼是一種中間狀態(中間碼)的二進制代碼(文件)。須要直譯器轉譯後才能成爲機器碼。

9 三元運算規則以及應用場景?

表達式格式
爲真時的結果 if 斷定條件 else 爲假時的結果

事例
1 if 3>2 else 0
複製代碼

10 用一行代碼實現數值交換:

a =1
b =2
a,b=b,a
print(a,b)
複製代碼

識別圖中二維碼,領取python全套視頻資料
相關文章
相關標籤/搜索