python筆記-基礎篇面試題!必須掌握的面試題!

這是一篇長文,由於篇幅太長,以至於我不得不分割成幾部分給大家展現,我們都知道網上有很多的面試題,但是大多數沒有答案。所以在找到了大量的面試題和知識點之後。我打算整一個專題好好的給大家整理一下。儘量每一題的知識點都和大家解釋一下。

大家可以看看自己薄弱的地方在什麼地方,我推薦看那個編程題和31,33

2

python筆記-基礎篇面試題!必須掌握的面試題!

Python和Java、PHP、C、C#、C++等其他語言的對比?

一般而言,C,C++,java被視為同一系的語言,它們長期佔據著程序使用榜的前三名。

C#是微軟公司發佈的一種面向對象的,C# 和JAVA一樣,簡直就是照搬了C++的部分語法

Java語言,Java是一種可以撰寫跨平臺應用軟件的面向對象的程序設計語言

php語言,(“PHP:超文本預處理器”)入門門檻較低,使用廣泛,主要適用於Web開發領域。

python語言,是一種面向對象、直譯式計算機程序設計語言,具有豐富和強大的類庫。稱為膠水語言,能夠很輕鬆的把用其他語言製作的各種模塊(尤其是C/C++)輕鬆地聯結在一起。

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

解釋型語言編寫的程序不需要編譯,在執行的時候,專門有一個解釋器能夠將VB語言翻譯成機器語言,每個語句都是執行的時候才翻譯。

這樣解釋型語言每執行一次就要翻譯一次,效率比較低。

編譯型語言寫的程序執行之前,需要一個專門的編譯過程,通過編譯系統,把源高級程序編譯成為機器語言文件,翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執行效率高,但也不能一概而論,

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

Python解釋器種類以及特點?

Python解釋器及數據類型(參考我這篇文章)

位和字節的關係?

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

byte就是字節, 也是B

1byte=8bit

1byte就是1B

一個字符=2字節

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

每級縮進用4個空格。

每行最大行寬不超過 79 個字符

一般續行可使用反斜槓

括號內續行不需要使用反斜槓

兩行空行用於分割頂層函數和類的定義

通過代碼實現如下轉換:

其他進制轉二進制----bin(var)

其他進制轉八進制----oct(var)

其他進制轉十進制----int(var)

其他進制轉十六進制----hex(var)

字符串轉byte----str_var.encode()

byte轉字符串----byte_var.decode()

二進制轉換成十進制:v = “0b1111011”

print(int("0b1111011",2))

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

print("轉換為二進制為:", bin(18))

八進制轉換成十進制:v = “011”

print(int("011",8))

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

print("轉換為八進制為:", oct(30))

十六進制轉換成十進制:v = “0x12”

print(int("0x12",16))

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

print("轉換為十六進制為:", hex(87))

請編寫一個函數實現將IP地址轉換成一個整數。

如 10.3.9.12 轉換規則為:

10 00001010

3 00000011

9 00001001

12 00001100

再將以上二進制拼接起來計算十進制結果:00001010 00000011 00001001 00001100 = ?

(注:我寫的這段程序,有些知識點還是比較雜的,有需要的話,會把所有的程序整合起來個大家解釋一下)

1# 編寫一個函數將IP地址轉換成整數,並且用二進制表示進行拼接

2

3s =input('請輸入字符串:')

4nu_list=s.split('.')

5# print(nu_list)

6l =[]

7nu_s=''

8sum_nu=0

9for i in nu_list:

10 nu =bin(int(i))[2:]

11 nu = nu.rjust(8,'0')

12 l.append(nu)

13 print(nu)

14

15nu_s =''.join(l)

16print(nu_s)

17for i in range(len(nu_s)):

18 # print(int(nu_s[len(nu_s) - 1 - i]))

19 sum_nu +=int(nu_s[len(nu_s)-1-i])*pow(2,i)

20print ("轉換成十進制整數是:",sum_nu)

11、python遞歸的最大層數?

1000

12、求結果:

(and和or我覺得大家都沒有重視認為很簡單,其實我之前講過很多次,這裡面有陷阱!!)

v1 = 1 or 3

1

v2 = 1 and 3

3

v3 = 0 and 2 and 1

0

v4 = 0 and 2 or 1

1

v5 = 0 and 2 or 1 or 4

1

v6 = 0 or False and 1

False

13、ascii、unicode、utf-8、gbk 區別?

ASCII碼使用一個字節編碼,所以它的範圍基本是隻有英文字母、數字和一些特殊符號 ,只有256個字符。

Unicode能夠表示全世界所有的字節

UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,又稱萬國碼

GBK是隻用來編碼漢字的,GBK全稱《漢字內碼擴展規範》,使用雙字節編碼。

14、字節碼和機器碼的區別?

機器碼,學名機器語言指令,有時也被稱為原生碼,是電腦的CPU可直接解讀的數據。機器碼就是計算機可以直接執行,並且執行速度最快的代碼。

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

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

三元運算符就是在賦值變量的時候,可以直接加判斷,然後賦值

三元運算符的功能與'if....else'流程語句一致,它在一行中書寫,代碼非常精煉,執行效率更高

格式:[真值] if [表達式] else [假值]

r = 值1 if 條件 else 值2

16、列舉 Python2和Python3的區別?

Python2.x版本和python3.x區別-01

Python2.x版本和python3.x區別-02

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

a = 1

b = 2

a,b=b,a

18、Python3和Python2中 int 和 long的區別?

int(符號整數):沒有小數點的正或負整數;python3中的功能合併了long()所以3中沒有long

long(長整數):無限大小的整數,這樣寫整數和一個大寫或小寫的L。

19、xrange和range的區別?

range: range([start,] stop[, step]),根據start與stop指定的範圍以及step設定的步長,生成一個列表。

xrange:函數說明,xrange 用法與 range 完全相同,所不同的是生成的不是一個list對象,而是一個生成器。

注意:Python 3.x已經去掉xrange,全部用range代替。

20、文件操作時:xreadlines和readlines的區別?

二者使用時相同,但返回類型不同,xreadlines返回的是一個生成器,readlines返回的是list

21、列舉布爾值為False的常見值?

0 , [ ] , " , ( ) , { }

22、字符串、列表、元組、字典每個常用的5個方法?

(這個大家平時注重總結)

23、lambda表達式格式以及應用場景?

lambda表達式,通常是在需要一個函數,但是又不想去命名一個函數的場合下使用,也就是指匿名函數。

add = lambda x, y : x+y

print(add(1,2)) # 結果為3

應用在函數式編程中 應用在閉包中

24、pass的作用?

空語句 do nothing

保證格式完整,保證語義完整

佔位語句

25、*arg和**kwarg作用

*args:可以理解為只有一列的表格,長度不固定。

**kwargs:可以理解為字典,長度也不固定。

函數調用裡的*arg和**kwarg:

*arg:元組或列表“出現”

**kwarg:字典“出沒”

分割參數

函數定義時傳的*arg /**kwarg:

接收參數

26、is和==的區別

is是對比地址(id),==是對比值

27、簡述Python的深淺拷貝以及應用場景?

淺拷貝:copy.copy

深拷貝:copy.deepcopy

淺拷貝指僅僅拷貝數據集合的第一層數據,深拷貝指拷貝數據集合的所有層

主要應用在字符串,數字的深淺拷貝

28、Python垃圾回收機制?

Python的GC模塊主要運用了“引用計數”(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,還可以通過“標記-清除”(mark and sweep)解決容器對象可能產生的循環引用的問題。通過“分代回收”(generation collection)以空間換取時間來進一步提高垃圾回收的效率。

引用計數--跟蹤和回收垃圾

標記-清除

--解決容器對象可能產生的循環引用的問題

分代回收--以空間換取時間來進一步提高垃圾回收的效率

29、Python的可變類型和不可變類型?

Python的每個對象都分為可變和不可變

可變:列表、字典  

不可變:數字、字符串、元組

30、求結果:

v = dict.fromkeys(['k1','k2'],[])

v[‘k1’].append(666)

print(v) #{'k1': [666], 'k2': [666]}

v[‘k1’] = 777

print(v) #{'k1': 777, 'k2': [666]}

注意加值和賦值的區別

31、求結果:

def multipliers():

return [lambda x : i * x for i in range(4)]

print [m(2) for m in multipliers()]

以上代碼的輸出是 [6, 6, 6, 6] (而不是 [0, 2, 4, 6])。

引自網上--

這個的原因是 Python 的閉包的後期綁定導致的 late binding,這意味著在閉包中的變量是在內部函數被調用的時候被查找。所以結果是,當任何 multipliers() 返回的函數被調用,在那時,i 的值是在它被調用時的周圍作用域中查找,到那時,無論哪個返回的函數被調用,for 循環都已經完成了,i 最後的值是 3,因此,每個返回的函數multiplies 的值都是 3。因此一個等於 2 的值被傳遞進以上代碼,它們將返回一個值 6 (比如: 3 x 2)。

最普遍的解決方案是創建一個閉包,通過使用默認參數立即綁定它的參數。例如:

def multipliers():

return [lambda x, i=i : i * x for i in range(4)]

32、列舉常見的內置函數?

python筆記之內建函數

33、filter、map、reduce的作用?

map函數:

map(func, *iterables)

用函數和對可迭代對象中的每一個元素作為參數計算出新的可迭代對象。當最短的一個可迭代對象不再提供數據時,此可迭代對象生成結束

示例:

1def pow2(x):

2 return x**2

3

4for x in map(pow2, range(1, 10)):

5 print(x)

filter 函數

私信小編007即可獲取數十套PDF哦!

格式:

filter(func, iterable)

作用:

篩選可迭代對象iterable中的數據,返回一個可迭代對象,此可迭代對象將對iterable進行篩選

說明:

函數func將對每個元素進行求值,返回False則將此數據丟棄,返回True則保留此數據

示例:

1def isodd(x): # 此函數判斷x是否為奇數

2 return x % 2 == 1

3for x in filter(isodd, range(10)):

4 print(x)

5

6even = [x for x in filter(lambda x: x%2==0, range(10))]

reduce

是用某種方法依次把所有數據丟進去最後得到一個結果..字面意思是化簡..比如計算一個列表所有數的和的過程,就是維持一個部分和然後依次把每個數加進去..

reduce把一個函數作用在一個序列[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

functools.reduce

reduce把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,

1from functools import reduce

2

3reduce(lambda x,y: x+y, [1, 2, 3]) # 6

4

5reduce(lambda x, y: x+y, [1,2,3], 9) # 15

34、一行代碼實現9*9乘法表

1print ('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))

2

35、如何安裝第三方模塊?以及用過哪些第三方模塊?

Pip3 list #看看自己用了哪些模塊

36、至少列舉8個常用模塊都有那些?

37、re的match和search區別?

match()函數只檢測re是不是在string的開始位置匹配,search()會掃描整個string查找匹配;

也就是說match()只有在0位置匹配成功的話才有返回,如果不是開始位置匹配成功的話,match()就返回None

38、什麼是正則的貪婪匹配?

貪婪匹配

總是嘗試匹配儘可能多的字符

非貪婪匹配(匹配規則前加?)

是嘗試匹配儘可能少的字符

39、求結果:

a. [ i % 2 for i in range(10) ]

b. ( i % 2 for i in range(10) )

一個a是生成列表,一個b是生成迭代器

40、求結果:

a. 1 or 2 #1

b. 1 and 2 #2

c. 1 < (2==2) #False

d. 1 < 2 == 2 #True

注意c&d


分享到:


相關文章: