Python經典面試題|Python面試寶典

公衆號:吾非同,回覆“面試寶典”獲取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.簡述面向對象中newinit區別?

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:比較兩邊的內存地址是否相等,是比較兩個引用是否指向了同一個對象(引用比較)

==:比較兩邊的數值是否相等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章