1 簡述解釋型和編譯型程式語言?
解釋型語言編寫的程式不需要編譯,在執行的時候,專門有一個直譯器能夠將VB語言翻譯成機器語言,每個語句都是執行的時候才翻譯。這樣解釋型語言每執行一次就要翻譯一次,效率比較低。
用編譯型語言寫的程式執行之前,需要一個專門的編譯過程,通過編譯系統,把源高階程式編譯成為機器語言檔案,翻譯只做了一次,執行時不需要翻譯,所以編譯型語言的程式執行效率高,但也不能一概而論,
部分解釋型語言的直譯器通過在執行時動態優化程式碼,甚至能夠使解釋型語言的效能超過編譯型語言。
2 Python直譯器種類以及特點?
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-8、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)
複製程式碼