315道面試題(一)
1、為什麽學習Python?
語言本身簡潔,優美,功能超級強大
跨平臺
非常火爆的社區
很多有名的大公司在用
2、通過什麽途徑學習的Python?
培訓機構 + 自學
3、Python和Java、PHP、C、C#、C++等其他語言的對比?
C,它是現代編程語言的祖師爺,所以非常古老了,在現代應用中使用不多。但由於C是祖師爺,所以絕大部分語言,寫法都和C語言差不多。。。常常用作學習其他語言的基礎。。而C語言也有其他語言不可替代的用途,現在最主要的應用就是單片機。。。單片機是啥?就是用C語言控制一些簡單的電子元件。。。比如電視用的遙控器,其實就是一個單片機。
PHP是用來做網站的,其實從技術角度,屬於第一代的後端技術(植入式腳本技術),現在最新的後端技術,已經發展到第三代了(MVC架構),因此從技術上講,PHP早該過時了,但由於市場需求的存在,所以它依然是做網站後臺的主流之一。。就類似於WindowsXP一樣,技術上太淘汰了,但市場卻依然是主流,普及度依然很高。缺點一大堆,但又個最主要的優勢,就是簡單。。。MVC雖好,但學習難度遠比PHP要高的多。
C++是面向對象的C語言,由於偏底層,所以性能非常高,僅次於C語言,主要用在一個要求高性能的領域。。。這個不好說,因為實際需求上,用處挺雜的,而且也確實不太好學。。因為它把C語言面向過程的那套東西,和JAVA面向對象的那些東西,堆砌到了一起。。也就同時把兩種完全不同的思想揉在了一起。。個人的理解是,它就像周星馳電影裏的那個“要你命3000”,把蒼蠅拍,殺蟲劑,手槍,手榴彈,滅鼠靈,用一根麻繩串在一起。。。殺蟲可以,滅鼠可以,殺人也可以,堪稱無所不能。。。但用起來,真是麻煩死了。。所以對於很多人來說,認可它的地位,承認它的功能,但敬而遠之。
JAVA是今天真正意義上的大道正宗,名門正派。。。。丐幫有降龍十八掌,華山派有獨孤九劍。。但你卻很難說出,少林派有什麽武功特別強。。而它又是公認的名門正宗。。。這其實就已經說明問題了,JAVA沒有什麽特別強的方面,但每個方面都不弱。。整體平均值,便非常高。。JAVA還有一個比較突出的優勢,就是它是安卓系統的官方開發語言。。既然說到了少林,就不得不提一下武當。。。那就是微軟的官方語言C#。。。.C#和JAVA相比,其實80%都是一樣的。。幾乎等於學一門,會兩門,C#比JAVA稍微簡單一些,IDE也好一些,其實比JAVA更適合新手,但由於之前不能跨平臺,所以流行度比JAVA低,但確是遊戲開發行業的第一大語言。。JAVA與C#基本可以看成一門語言的兩種方言。。英式英語和美式英語的差別一樣。。說到底還是半斤八兩。。。一個是傳統應用和安卓系統的第一大語言,一個是WINDOWS系統和遊戲開發的第一大語言。。而且學一門會兩門,你還要求啥?
Python也是個很有歷史的語言,誕生時間和JAVA,C#差不多,但今天卻依然非常時髦。。因為它的語法,簡潔,優雅,風騷到了極致。。像寫信一樣寫代碼。。而又無所不能,JAVA和C#能做到的,Python幾乎一樣都不少。。。簡單易學,尤其受到初學者喜愛。。但Python更像一把雙刃劍,優點特別突出,缺點也特別明顯,就是特別慢。。。一般認為,Python比JAVA慢25倍到50倍。。還有一門語言叫Ruby,和Python相似,也是語法特別簡潔。。但比Python更慢,用途也不如Python。。。基本可以看作華山,丐幫,在某些情況下,可以勝過少林武當。。但整體上比較,還是要差一截。。但即便如此,它的前景也是非常好的。。由於語法簡單,更容易被機器解析,所以在人工智能領域非常有前途。比如那個下圍棋的Alpha Go,以及中國的北鬥衛星定位系統。。都有大量的Python代碼在裏面。
4、簡述解釋型和編譯型編程語言?
編譯型語言:把做好的源程序全部編譯成二進制代碼的可運行程序。然後,可直接運行這個程序。
解釋型語言:把做好的源程序翻譯一句,然後執行一句,直至結束!python是一門解釋型語言
5、Python解釋器種類以及特點?
Python是一門解釋器語言,代碼想運行,必須通過解釋器執行,Python存在多種解釋器,分別基於不同語言開發,每個解釋器有不同的特點,但都能正常運行Python代碼,以下是常用的種Python解釋器:
CPython:
當 從Python官方網站下載並安裝好Python2.7後,就直接獲得了一個官方版本的解釋器:Cpython,這個解釋器是用C語言開發的,所以叫 CPython,在命名行下運行python,就是啟動CPython解釋器,CPython是使用最廣的Python解釋器。
IPython:
IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所增強,但是執行Python代碼的功能和CPython是完全一樣的
PyPy:
PyPy是另一個Python解釋器,它的目標是執行速度,PyPy采用JIT技術,對Python代碼進行動態編譯,所以可以顯著提高Python代碼的執行速度。
6、位和字節的關系?
位(bit),數據存儲是以“字節”(Byte)為單位,數據傳輸是以大多是以“位”(bit,又名“比特”)為單位,一個位就代表一個0或1(即二進制),每8個位(bit,簡寫為b)組成一個字節(Byte,簡寫為B),是最小一級的信息單位,是計算機信息技術用於計量存儲容量的一種計量單位,也表示一些計算機編程語言中的數據類型和語言字符。
7、b、B、KB、MB、GB 的關系?
1 B = 8b (8個bit/ 位) 一個字節(byte)等於8位(bit)
1 kB = 1024 B (kB - kilobajt)
1 MB = 1024 kB (MB - megabajt)
1 GB = 1024 MB (GB - gigabajt)
8、請至少列舉5個 PEP8 規範(越多越好)。
1 縮進。4個空格的縮進(編輯器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
2 每行最大長度79,換行可以使用反斜杠,最好使用圓括號。換行點要在操作符的後邊敲回車。
3 類和top-level函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其他地方盡量不要再空行。
4 不要在一句import中多個庫,比如import os, sys不推薦。
5 避免不必要的空格。
9、通過代碼實現如下轉換:
二進制轉換成十進制:v = “0b1111011”
>>> int(‘0b1111011‘,2)
123
1
2
十進制轉換成二進制:v = 18
>>> bin(18)
‘0b10010‘
1
2
八進制轉換成十進制:v = “011”
>>> int(‘011‘,8)
9
1
2
十進制轉換成八進制:v = 30
>>> oct(30)
‘0o36‘
1
2
十六進制轉換成十進制:v = “0x12”
>>> int(‘0x12‘,16)
18
1
2
十進制轉換成十六進制:v = 87
>>> hex(87)
‘0x57‘
1
2
10、請編寫一個函數實現將IP地址轉換成一個整數。
如 10.3.9.12 轉換規則為:
10 00001010
3 00000011
9 00001001
12 00001100
再將以上二進制拼接起來計算十進制結果:00001010 00000011 00001001 00001100 = ?
def ip(value):
res = value.split(‘.‘)
s=‘‘
for i in res:
i = (bin(int(i)).strip(‘0b‘))
if len(i) != 8:
i = i.zfill(8)
s+=i
return int(s,2)
1
2
3
4
5
6
7
8
9
11、python遞歸的最大層數?
python默認遞歸最大的層數是998 不過這個值是可以通過sys.setrecursionlimit(1000)來設置
12、求結果:
v1 = 1or3
1
1
v2 = 1and3
3
1
v3 = 0and2and1
0
1
v4 = 0and2or1
1
1
v5 = 0and2or1or4
1
1
v6 = 0orFlase and1
False
1
13、ascii、unicode、utf-8、gbk 區別?
ASCII碼使用一個字節編碼,所以它的範圍基本是只有英文字母、數字和一些特殊符號 ,只有256個字符。
在表示一個Unicode的字符時,通常會用“U+”然後緊接著一組十六進制的數字來表示這一個字符。在基本多文種平面(英文為 Basic Multilingual Plane,簡寫 BMP。它又簡稱為“零號平面”, plane 0)裏的所有字符,要用四位十六進制數(例如U+4AE0,共支持六萬多個字符);在零號平面以外的字符則需要使用五位或六位十六進制數了。舊版的Unicode標準使用相近的標記方法,但卻有些微的差異:在Unicode 3.0裏使用“U-”然後緊接著八位數,而“U+”則必須隨後緊接著四位數。
Unicode能夠表示全世界所有的字節
GBK是只用來編碼漢字的,GBK全稱《漢字內碼擴展規範》,使用雙字節編碼。
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,又稱萬國碼。由Ken Thompson於1992年創建。現在已經標準化為RFC 3629。UTF-8用1到6個字節編碼UNICODE字符。用在網頁上可以同一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。
14、字節碼和機器碼的區別?
通常意義上來理解的話,機器碼就是計算機可以直接執行,並且執行速度最快的代碼。
字節碼是一種中間狀態(中間碼)的二進制代碼(文件)。需要直譯器轉譯後才能成為機器碼。
15、三元運算規則以及應用場景?
三元運算符就是在賦值變量的時候,可以直接加判斷,然後賦值
格式:
[on_true] if [expression] else [on_false]
res = 值1 if 條件 else 值2
1
2
16、python2與python3的區別
https://blog.csdn.net/qq_37275405/article/details/80906906
17、用一行代碼實現數值交換:a = 1 b = 2
a,b = b,a
1
18、Python3和Python2中 int 和 long的區別?
int(符號整數):通常被稱為是整數或整數,沒有小數點的正或負整數
long(長整數):無限大小的整數,這樣寫整數和一個大寫或小寫的L。
19、xrange和range的區別?
1.range和xrange都是在循環中使用,輸出結果一樣。
2.range返回的是一個list對象,而xrange返回的是一個生成器對象(xrange object)。
3.xrange則不會直接生成一個list,而是每次調用返回其中的一個值,內存空間使用極少,因而性能非常好。
註意:Python 3.x已經去掉xrange,全部用range代替。
20、文件操作時:xreadlines和readlines的區別?
二者使用時相同,但返回類型不同,xreadlines返回的是一個生成器,readlines返回的是list
21、列舉布爾值為False的常見值?
0 , [ ] , ” ” , ( ) , { }
22、字符串、列表、元組、字典每個常用的5個方法?
字符串:
words = ‘today is a wonderfulday‘
print(words.strip(‘today‘))#如果strip方法指定一個值的話,那麽會去掉這兩個值
print(words.count(‘a‘))#統計字符串出現的次數
print(words.index(‘is‘))#找下標
print(words.index(‘z‘))#找下標如果元素不找不到的話,會報錯
print(words.find(‘z‘))#找下標,如果元素找不到的話,返回-1
1
2
3
4
5
6
列表:
sample_list = [‘a‘,1,(‘a‘,‘b‘)] #創建列表
sample_list = [‘a‘,‘b‘,0,1,3] # Python 列表操作
value_start = sample_list[0] #得到列表中的某一個值
end_value = sample_list[-1] #得到列表中的某一個值
del sample_list[0] #刪除列表的第一個值
sample_list[0:0] = [‘sample value‘] #在列表中插入一個值
1
2
3
4
5
6
元祖:
#元組也是一個list,他和list的區別是元組的元素無法修改
tuple1 = (2,3,4,5,6,4,7)
print(type(tuple1))
print(tuple1[:7])
print(tuple1[:5:-1])
1
2
3
4
5
字典:
dict = {‘ob1‘:‘computer‘, ‘ob2‘:‘mouse‘, ‘ob3‘:‘printer‘}
#每一個元素是pair,包含key、value兩部分。key是Integer或string類型,value 是任意類型。鍵是唯一的,字典只認最後一個賦的鍵值。
D.get(key, 0) #同dict[key],多了個沒有則返回缺省值,0。[]沒有則拋異常
D.has_key(key) #有該鍵返回TRUE,否則FALSE
D.keys() #返回字典鍵的列表
D.values()
D.items()
1
2
3
4
5
6
7
8
23、lambda表達式格式以及應用場景?
lambda表達式,通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數。
lambda所表示的匿名函數的內容應該是很簡單的,如果復雜的話,幹脆就重新定義一個函數了,使用lambda就有點過於執拗了。
lambda就是用來定義一個匿名函數的,如果還要給他綁定一個名字的話,就會顯得有點畫蛇添足,通常是直接使用lambda函數。如下所示:
# 需求:將列表中的元素按照絕對值大小進行升序排列
list1 = [3,5,-4,-1,0,-2,-6]
print(sorted(list1, key=lambda x: abs(x))) #[0, -1, -2, 3, -4, 5, -6]
1
2
3
24、pass的作用?
空語句
保證格式完整
占位語句
25、*arg和**kwarg作用
函數調用裏的*arg和**kwarg:
*arg:元組或列表“出現”
**kwarg:字典“出沒”
分割參數
函數定義時傳的*arg /**kwarg:
接收參數
26、is和==的區別
==是python標準操作符中的比較操作符,用來比較判斷兩個對象的value(值)是否相等
is也被叫做同一性運算符,這個運算符比較判斷的是對象間的唯一身份標識,也就是id是否相同。
27、簡述Python的深淺拷貝以及應用場景?
字面理解:淺拷貝指僅僅拷貝數據集合的第一層數據,深拷貝指拷貝數據集合的所有層。所以對於只有一層的數據集合來說深淺拷貝的意義是一樣的,比如字符串,數字,還有僅僅一層的字典、列表、元祖等.
應用場景:比如在CMDB系統中,我們定義了一個報警模版call給所有的服務器使用,此時有一批特殊應用的服務器需要不通的報警參數,我們既不想單獨新建模版來一個一個添加報警參數,又不想修改默認模版而影響其他機器的報警閾值。此時我們就需要用深拷貝來完成。
28、Python垃圾回收機制?
Python的GC模塊主要運用了“引用計數”(reference counting)來跟蹤和回收垃圾。在引用計數的基礎上,還可以通過“標記-清除”(mark and sweep)解決容器對象可能產生的循環引用的問題。通過“分代回收”(generation collection)以空間換取時間來進一步提高垃圾回收的效率。沒有變量引用及回收。
29、Python的可變類型和不可變類型?
可變:列表、字典
對於可變類型,無論創建多少個可變類型,只要值相同,都不指向同個內存地址(除非進行復制操作,那麽他們將會指向同一個地址)。
不可變:數字、字符串、元祖
對不可變類型的變量重新賦值,實際上是重新創建一個不可變類型的對象,並將原來的變量重新指向新創建的對象(如果沒有其他變量引用原有對象的話(即引用計數為0),原有對象就會被回收)。
30、求結果:
v = dict.fromkeys([ ‘k1‘, ‘k2‘],[])
v[‘k1’]. append( 666)
print(v)
v[‘k1’] = 777
print(v)
1
2
3
4
5
結果為:
<<<{‘k1‘: [666], ‘k2‘: [666]}
1
31、求結果
def num():
return [lambda x:i*x for i in range(4)]
print([ m(2) for m in num()])
1
2
3
4
5
結果為:
[6, 6, 6, 6]
1
32、列舉常見的內置函數?
https://mp.csdn.net/postedit/80946751
33、filter、map、reduce的作用?
map() 會根據提供的函數對指定序列做映射。
第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表
In [11]: for i in map(lambda x:x*x,[1,2,3,4]):
...: print(i)
...:
1
4
9
16
1
2
3
4
5
6
7
filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
該接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判,然後返回 True 或 False,最後將返回 True 的元素放到新列表中。
In [12]: def is_odd(n):
...: return n % 2 == 1
In [15]: for i in filter(is_odd,[1,2,3]):
...: print(i)
...:
1
3
1
2
3
4
5
6
7
8
reduce() 函數會對參數序列中元素進行累積。
函數將一個數據集合(鏈表,元組等)中的所有數據進行下列操作:用傳給 reduce 中的函數 function(有兩個參數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個數據用 function 函數運算,最後得到一個結果。
在 Python3 中,reduce() 函數已經被從全局名字空間裏移除了,它現在被放置在 fucntools 模塊裏,如果想要使用它,則需要通過引入 functools 模塊來調用 reduce() 函數
In [19]: from functools import reduce
In [20]: def add(x,y):
...: return x+y
...: reduce(add,range(1,101))
...:
Out[20]: 5050
1
2
3
4
5
6
7
8
34、一行代碼實現9*9乘法表
print (‘\n‘.join([‘ ‘.join([‘%s*%s=%-2s‘ % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))
1
35、如何安裝第三方模塊?以及用過哪些第三方模塊?
在Python中,安裝第三方模塊,是通過setuptools這個工具完成的。Python有兩個封裝了setuptools的包管理工具:easy_install和pip。目前官方推薦使用pip
如果你正在使用Mac或Linux,安裝pip本身這個步驟就可以跳過了。
如果你正在使用Windows,確保安裝時勾選了pip和Add python.exe to Path。
在命令提示符窗口下嘗試運行pip,如果Windows提示未找到命令,可以重新運行安裝程序添加pip。
現在,讓我們來安裝一個第三方庫——bs4
pip install bs4
用過的第三方模塊 bs4/pymysql/redis/lxml/tkinter/urllib/requests等
36、至少列舉8個常用模塊都有那些?
Django Flask Scrapy Tkinter Pygame numpy pillow-python pymysql pip
37、re的match和search區別?
match只找字符串的開始位置,而search是全盤查找
38、什麽是正則的貪婪匹配?
1、貪婪匹配
總是嘗試匹配盡可能多的字符
2、非貪婪匹配
是嘗試匹配盡可能少的字符
39、求結果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
In [32]: a = [i % 2 for i in range(10)]
In [33]: a
Out[33]: [0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
1
2
3
In [34]: b = (i%2 for i in range(10))
In [35]: b
Out[35]: <generator object <genexpr> at 0x000000000552E938>
1
2
3
4
詳情請看https://blog.csdn.net/qq_37275405/article/details/80945446
40、求結果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
In [48]: 0 or False
Out[48]: False
In [49]: 1 or 2
Out[49]: 1
In [50]: 1 and 2
Out[50]: 2
In [51]: 1 < (2==2)
Out[51]: False
In [52]: 1<2==2
Out[52]: True
1
2
3
4
5
6
7
8
9
10
11
12
13
14
41、def func(a,b=[ ]) 這種寫法有什麽坑?
In [55]: def func(a,b=[]):
...: b.append(a)
...: print(b)
...: func(1)
...: func(1)
...: func(1)
...: func(1)
...:
[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
1
2
3
4
5
6
7
8
9
10
11
12
函數的第二個默認參數是一個list,當第一次執行的時候實例化了一個list,第二次執行還是用第一次執行的時候實例化的地址存儲,所以三次執行的結果就是 [1, 1, 1] ,想每次執行只輸出[1] ,默認參數應該設置為None。
42、如何實現 “1,2,3” 變成 [‘1’,’2’,’3’] ?
In [56]: a = ‘1,2,3‘
In [57]: list(a)
Out[57]: [‘1‘, ‘,‘, ‘2‘, ‘,‘, ‘3‘]
1
2
3
4
43、如何實現[‘1’,’2’,’3’]變成[1,2,3] ?
In [65]: a = [‘1‘,‘2‘,‘3‘]
In [66]: [ int(i) for i in a]
Out[66]: [1, 2, 3]
1
2
3
4
44、比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區別?
a = [1,2,3] 和 b = [(1),(2),(3) ] 都是列表 b = [(1,),(2,),(3,) ] 是列表裏面套元組
45、如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?
In [74]: [ i*i for i in range(1,11)]
Out[74]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
1
2
46、一行代碼實現刪除列表中重復的值 ?
In [75]: a = [1,2,3,4,5,1,2,3,4,5]
In [76]: set(a)
Out[76]: {1, 2, 3, 4, 5}
1
2
3
4
47、如何在函數中設置一個全局變量 ?
In [78]: def a():
...: global aaa
...: aaa = 123
In [80]: a()
In [81]: aaa
Out[81]: 123
1
2
3
4
5
6
7
48、logging模塊的作用?以及應用場景?
可以通過設置不同的日誌等級,在release版本中只輸出重要信息,而不必顯示大量的調試信息;
print將所有信息都輸出到標準輸出中,嚴重影響開發者從標準輸出中查看其它數據;logging則可以由開發者決定將信息輸出到什麽地方,以及怎麽輸出;
49、請用代碼簡答實現stack 。
class Stack(object):
def __init__(self):
self.stack = []
def push(self, value): # 進棧
self.stack.append(value)
def pop(self): #出棧
if self.stack:
self.stack.pop()
else:
raise LookupError(‘stack is empty!‘)
def is_empty(self): # 如果棧為空
return bool(self.stack)
def top(self):
#取出目前stack中最新的元素
return self.stack[-1]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
50、常用字符串格式化哪幾種?
第一種:
In [88]: "hello %s"%(‘word‘)
Out[88]: ‘hello word‘
1
2
第二種:
In [89]: ‘hellow {}‘.format(‘word‘)
Out[89]: ‘hellow word‘
1
2
51、簡述 生成器、叠代器、可叠代對象 以及應用場景?
https://blog.csdn.net/qq_37275405/article/details/80945446
52、用Python實現一個二分查找的函數。
data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
def binary_search(dataset,find_num):
if len(dataset) > 1:
mid = int(len(dataset) / 2)
if dataset[mid] == find_num: # find it
print("找到數字", dataset[mid])
elif dataset[mid] > find_num: # 找的數在mid左面
print("\033[31;1m找的數在mid[%s]左面\033[0m" % dataset[mid])
return binary_search(dataset[0:mid], find_num)
else: # 找的數在mid右面
print("\033[32;1m找的數在mid[%s]右面\033[0m" % dataset[mid])
return binary_search(dataset[mid + 1:], find_num)
else:
if dataset[0] == find_num: # find it
print("找到數字啦", dataset[0])
else:
print("沒的分了,要找的數字[%s]不在列表裏" % find_num)
binary_search(data,20)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
53、談談你對閉包的理解?
在一個外函數中定義了一個內函數,內函數裏運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包。
一般情況下,在我們認知當中,如果一個函數結束,函數的內部所有東西都會釋放掉,還給內存,局部變量都會消失。但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的臨時變量將來會在內部函數中用到,就把這個臨時變量綁定給了內部函數,然後自己再結束。
def outer(a):
b = 10
def inner():
print(a+b)
return inner
1
2
3
4
5
54、os和sys模塊的作用?
sys模塊主要是用於提供對python解釋器相關的操作
OS模塊是Python標準庫中的一個用於訪問操作系統功能的模塊,使用OS模塊中提供的接口,可以實現跨平臺訪問
55、如何生成一個隨機數?
random模塊
如:random.random()
56、如何使用python刪除一個文件?
os.remove(path)
57、談談你對面向對象的理解?
面向對象就是將一些零散的具有相同功能的屬性方法通過類封裝起來,實現模塊化
https://blog.csdn.net/qq_37275405/article/details/80979592
58、Python面向對象中的繼承有什麽特點?
在繼承中基類的構造(init()方法)不會被自動調用,它需要在其派生類的構造中親自專門調用。有別於C#
在調用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數變量。區別於在類中調用普通函數時並不需要帶上self參數
Python總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找。(先在本類中查找調用的方法,找不到才去基類中找)。
https://blog.csdn.net/qq_37275405/article/details/80979592
59、面向對象深度優先和廣度優先是什麽?
pass
60、面向對象中super的作用?
super不是一個關鍵字,也是不是有函數,他是一個類
super()的作用不是查找父類,而是找MRO列表的上一個類
super()和父類沒有任何實質性的關系,只是有時候能調用到父類而已。
在單繼承的情況下,super()永遠調用的是父類/父對象
super()多用於菱形繼承
格式:
super().方法() #python3的格式
61、是否使用過functools中的函數?其作用是什麽?
functools用於高階函數:指那些作用於函數或者返回其他函數的函數。通常情況下,只要是可以被當做函數調用的對象就是這個模塊的目標。
62、列舉面向對象中帶雙下劃線的特殊方法,如:new、init
__init__初始化魔術對象,當一個對象被實例化是自動觸發
__new__ 當一個對象被實例化前自動觸發,通過傳遞參數判斷對象是否被創建或其他
__del__當一個對象沒有任何引用是被觸發,回收內存
__call__將對象當作函數調用時觸發
63、如何判斷是函數還是方法?
函數:
函數是封裝了一些獨立的功能,可以直接調用,python內置了許多函數,同時可以自建函數來使用。
方法:
方法和函數類似,同樣封裝了獨立的功能,但是方法是需要通過對象來調用的,表示針對這個對象要做的操作,使用時采用點方法。
64、靜態方法和類方法區別?
實例方法,類方法,靜態方法都可以通過實例或者類調用,只不過實例方法通過類調用時需要傳遞實例的引用(python 3可以傳遞任意對象,其他版本會報錯)。
三種方法從不同層次上來對方法進行了描述:實例方法針對的是實例,類方法針對的是類,他們都可以繼承和重新定義,而靜態方法則不能繼承,可以認為是全局函數。
65、列舉面向對象中的特殊成員以及應用場景
魔術方法 用於在某一時刻調用時
66、1、2、3、4、5 能組成多少個互不相同且無重復的三位數
for x in range(1,5):
for z in range(1,5):
if i!=x and i!=z and x!=z:
print(i,x,z)
1
2
3
4
67、什麽是反射?以及應用場景?
本質其實就是利用字符串的形式去對象(模塊)中操作(查找/獲取/刪除/添加)成員,一種基於字符串的事件驅動!
具體請參考:https://www.cnblogs.com/yooma/p/8004788.html
68、metaclass作用?以及應用場景?
元類就是創建類這種對象的東西
69、用盡量多的方法實現單例模式。
class Earth(object):
__instance=None #定義一個類屬性做判斷
def __new__(cls):
if cls.__instance==None:
#如果__instance為空證明是第一次創建實例
#通過父類的__new__(cls)創建實例
cls.__instance==object.__new__(cls)
return cls.__instance
else:
#返回上一個對象的引用
return cls.__instance
a = Earth()
print(id(a))
b = Earth()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
70、裝飾器的寫法以及應用場景。
裝飾器是一個工廠函數,接受一個函數作為參數,然後返回一個新函數,其閉包中包含被裝飾的函數。有了裝飾器,可以提取大量函數中與本身功能無關的類似代碼 ( 這塊在Flask中用於定義路由的@app.route,就是一個很好的例子),達到代碼重用的目的。可應用於插入日誌、性能測試、事務處理等方面。
def deco(func):
def warpper(*args, **kwargs):
print(‘start‘)
func(*args, **kwargs)
print(‘end‘)
return warpper
@deco
def myfunc(parameter):
print("run with %s" % parameter)
myfunc("something")
1
2
3
4
5
6
7
8
9
10
11
12
71、異常處理寫法以及如何主動跑出異常(應用場景)
try:
pirnt(‘123‘)
except:
print(‘456‘)
1
2
3
4
通過raise 異常對象主動拋出異常
72、什麽是面向對象的mro
Method Realtion Order 用來制作一個繼承關系的列表
MRO列表的制作原則:
1.子類永遠在父類的前面
2.如果繼承了多個父類,那麽按照()中的順序在列表中擺放
3.如果多個類同時繼承了一個父類,孫子類中只會選取第一個父類中的父類的該方法
73、isinstance作用以及應用場景?
檢測一個數據是否由指定的類型創建
74、寫代碼並實現:
給定一個由編碼器組成的數組,返回兩個數字的索引,使它們加起來成為一個特定的目標。你可以假設每一個輸入都會
只有一個解決方案,您可能不會使用相同的元素兩次。
例子:
給定nums =[2,7,11,15],目標= 9,
因為nums[0] + nums[1] = 2+ 7= 9,
返回[0,1]
In [102]: def nums(lists,n):^M
...: if isinstance(lists,list):^M
...: for i in range(len(lists)):^M
...: for v in lists:^M
...: if lists[i]+v == n:^M
...: print(i,lists.index(v))^M
...: break
...: nums([1,2,3,4,5],9)
...:
3 4
4 3
1
2
3
4
5
6
7
8
9
10
11
75、json序列化時,可以處理的數據類型有哪些?如何定制支持datetime類型?
可以處理數組、對象
定制datetime類型
In [107]: import json
In [108]: class ComplexEncoder(json.JSONEncoder):
...: def default(self, obj):
...: if isinstance(obj, datetime):
...: return obj.strftime(‘%Y-%m-%d %H:%M:%S‘)
...: elif isinstance(obj, date):
...: return obj.strftime(‘%Y-%m-%d‘)
...: else:
...: return json.JSONEncoder.default(self, obj)
...:
In [109]: json.dumps({‘now‘:datetime.now()},cls=ComplexEncoder)
Out[109]: ‘{"now": "2018-07-10 18:12:31"}‘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
76、json序列化時,默認遇到中文會轉換成unicode,如果想要保留中文怎麽辦?
json.dumps(jsonData,ensure_ascii=False);
77、什麽是斷言?應用場景?
在沒完善一個程序之前,我們不知道程序在哪裏會出錯,與其讓它在運行最崩潰,不如在出現錯誤條件時就崩潰,這時候就需要assert斷言的幫助
python assert斷言是聲明其布爾值必須為真的判定,如果發生異常就說明表達示為假。可以理解assert斷言語句為raise-if-not,用來測試表示式,其返回值為假,就會觸發異常。
78、有用過with statement嗎?它的好處是什麽?
with語句的作用是通過某種方式簡化異常處理
自動管理文件關閉
79、使用代碼實現查看列舉目錄下的所有文件。
import os
In [119]: for i in os.listdir():
...: print(i)
...:
1
2
3
4
5
80、簡述 yield和yield from關鍵字。
yield 的作用就是把一個函數變成一個生成器, 帶有yield的函數不再是一個普通的函數。python解釋器會將其視為一個generator
315道面試題(一)