公衆號:吾非同,回覆“面試寶典”獲取python最新面試寶典。
1.python2和python的區別?列舉至少五個
-
Python 2中的print語句被Python 3中的print()函數取代,在Python 3中必須用括號將需要輸出的對象括起來;
-
Python 2有基於ASCII的str()類型,其可通過單獨的unicode()函數轉成unicode類型,但沒有byte類型。
在Python 3中,終於有了Unicode(utf-8)字符串,以及兩個字節類:bytes和bytearrays。
-
Python2.x中有xrange()和range(),xrange()是惰性機制的,如果只循環一次建議使用range(),對此的話range()會在內存中創建多爾列表,內存開銷較大。
python3中只有range(),range有了一個新的__contains__方法。__contains__方法可以有效的加快Python 3.x中整數和布爾型的“查找”速度。
-
異常處理,在python3.x中必須使用‘as‘來處理, python2.x中可以不必使用。
-
在python2.x 中.Next()函數可以作爲函數的屬性使用,也可以單獨作爲函數使用;
在python3.x 中只能使用函數,使用。Next()會觸發attributeError.
-
python2.x中使用raw_input()解析用戶輸入,在python3.x 中使用input()解析。
2.python 內建數據類型有哪些
- 整型–int
- 布爾型–bool
- 字符串–str
- 列表–list
- 元組–tuple
- 字典–dict
3.提高python運行效率的方法
- 使用生成器,因爲可以節約大量內存。
- 循環代碼優化,避免過多重複代碼的執行。
- 核心模塊用Cython PyPy等,提高效率。
- 多進程、多線程、協程。
- 多個if elif條件判斷,可以把最有可能先發生的條件放到前面寫,這樣可以減少程序判斷的次數,提高效率。
4.什麼是PEP8?
《Python Enhancement Proposal #8》 (8號python增強提案)又叫PEP8,他針對的python代碼格式而編訂的風格指南。
5.有哪些工具可以幫助debug或做靜態分析?
- PyChecker是一個靜態分析工具,它不僅能報告源代碼中的錯誤,並且會報告錯誤類型和複雜度。
- Pylint是檢驗模塊是否達到代碼標準的另一個工具。
6.Python 裏面如何實現 tuple 和 list 的轉換?
直接使用 tuple 和 list 函數就行了,type()可以判斷對象的類型。
7.請寫出一段 Python 代碼實現刪除一個 list 裏面的重複元素。
使用 set 函數
set(list)
使用字典函數
a=[1,2,4,2,4,5,6,5,7,8,9,0]
b={}
b=b.fromkeys(a)
c=list(b.keys())
print(c)
8.Python 裏面如何生成隨機數?
在Python中用於生成隨機數的模塊是random,在使用前需要import。
舉例:
- random.random():生成一個0-1之間的隨機浮點數
- random.randint(a,b):生成[a,b]之間的整數,包含a,b
- random.uniform(a,b):生成[a,b]之間的浮點數
- random.randrange(a,b,step):在指定的集合[a,b)中,以step爲基數隨機取一個數,不含b
- random.choice(sequence):從特定序列的中隨機取一個元素,這裏的序列可以是字符列表,元組等。
9.Python中的pass是什麼?
pass是一個在Python中不會被執行的語句。在複雜語句中,如果一個地方需要暫時被留白,它常常被用於佔位符。
10.字符串格式化:%和.format的區別
字符串的format函數非常靈活,很強大,可以接受的參數不限個數,並且位置可以不按順序,而且有較爲強大的格式限定符(比如:填充,對齊,精度等)
11.簡要描述Python的垃圾回收機制(garbage collection)
Python中的垃圾回收是以引用計數爲主,標記-清除和分代收集爲輔。
- 引用計數:Python在內存中存儲每個對象的引用計數,如果計數變成0,該對象就會消失,分配給該對象的內存就會釋放出來。
- 標記-清除:一些容器對象,比如list、dict、tuple,instance等可能會出現引用循環,對於這些循環,垃圾回收器會定時回收這些循環(對象之間通過引用(指針)連在一起,構成一個有向圖,對象構成這個有向圖的節點,而引用關係構成這個有向圖的邊)。
- 分代收集:Python把內存根據對象存活時間劃分爲三代,對象創建之後,垃圾回收器會分配它們所屬的代。每個對象都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚創建的對象越容易被回收。
12.簡述面向對象中new和init區別?
1、__new__至少要有一個參數 cls,代表當前類,此參數在實例化時由Python解釋器自動識別。
2、__new__必須要有返回值,返回實例化出來的實例,這點在自己實現__new__時要特別注意,可以 return 父類(通過 super(當前類名, cls))__new__出來的實例,或者直接是 object 的__new__出來的實例。
3、__init__有一個參數 self,就是這個__new__返回的實例,__init__在__new__的基礎上可以完成一些其它初始化的動作,__init__不需要返回值。
4、如果__new__創建的是當前類的實例,會自動調用__init__函數,通過 return 語句裏面調用的__new__函數的第一個參數是 cls 來保證是當前類實例,如果是其他類的類名,;那麼實際創建返回的就是其他類的實例,其實就不會調用當前類的__init__函數,也不會調用其他類的__init__函數。
13.列出 Python 中可變數據類型和不可變數據類型,爲什麼?
1、可變數據類型:list、dict、set
2、不可變數據類型:int/float、str、tuple
原理:可變數據類型即公用一個內存空間地址,不可變數據類型即每產生一個對象就會產生一個內存地址。
14.python 中交換兩個數值
a,b=1,2
a,b=b,a
15.遇到 bug 如何處理
- 簡單直接、粗暴有效的就是用print()把可能有問題的變量打印出來看看。
- 凡是用print()來輔助查看的地方,都可以用斷言(assert)來替代。
- 把print()替換爲logging是第三種方式,和assert比,logging不會拋出錯誤,而且可以輸出到文件。
- 啓動python的調試器pdb,讓程序以單步方式運行,可以隨時查看運行狀態。
16.使用 pop 和 del 刪除字典中的"name"字段,dic={“name”:“zs”,“age”:18}
dic = {"name": "zs", "age": 18}
dic.pop('name')
del dic['age']
print(dic)
17.列出幾種魔法方法並簡要介紹用途
__init__:對象初始化方法
__new__:創建對象時候執行的方法,單列模式會用到
__str__:當使用print輸出對象的時候,只要自己定義了__str__(self)方法,那麼就會打印從在這個方法中return的數據
__del__:刪除對象執行的方法
18.請說明 sort 和 sorted 對列表排序的區別
- sort()與sorted()的不同在於,sort是在原位重新排列列表,而sorted()是產生一個新的列表。
- sorted(L)返回一個排序後的L,不改變原始的L,L.sort()是對原始的L進行操作,調用後原始的L會改變,沒有返回值;所以a = a.sort()是錯的啦!a = sorted(a)纔對。
- sorted()適用於任何可迭代容器,list.sort()僅支持list(本身就是list的一個方法),sorted使用頻率比list.sort()更高些,所以Python中更高級的排序技巧便通過sorted()來演示
19.Python 字典和 json 字符串相互轉化方法
import json
dic = {"name":"zs"}
res = json.dumps(dic)
print(res,type(res))
ret = json.loads(res)
print(ret,type(ret))
20、is和==區別?
is:比較兩邊的內存地址是否相等,是比較兩個引用是否指向了同一個對象(引用比較)
==:比較兩邊的數值是否相等。