python基礎面試題整理—從零開始 每天十題(01)

  • 2019 年 10 月 5 日
  • 筆記

  最近在弄flask的東西,好久沒寫部落格的,感覺少了點什麼,感覺被別人落下好多,可能漸漸的養成了寫部落格的習慣吧。也是自己想學的東西太多了(說白了就是基礎太差了,只是know how,不能做到konw why)。

  不說那些毒雞湯了,我們來說說我們今天的python基礎面試題吧。

一,Q:python的優缺點有什麼?

  A:優點:

    1,基礎語法簡單易學,對於初學者來說,語法還是相對簡單的,比較容易學習,網上的學習資料也很多。

    2,面向對象,在python里繼承和封裝較多,而python的多態還是相對較少的(起個不一樣的名字不就可以嗎….對java的多態表示無奈),從而減少了大量程式碼的輸出。

    3,語言簡潔,相對java比,語法要比java簡單很多(我只會java和python,會一點點Node.js和前端的VUE)

    4,開源,python語言開源便於我們自行去維護和更深入的了解源碼。

    5,豐富的社區資源,具有超級豐富的三方庫。

    缺點:

    1,運行速度慢,由於python是解釋性語言,對比其它語言要相對慢一些。

    2,python2和python3不兼容(python2在2020年1月就不在維護)

    3,程式碼安全性較弱,我們發布項目,其實就是發布我們的源碼,安全性差。

  MA:個人認為python的優點在於他是一種面向對象的動態類型語言,從自動化運維到web開發再到人工智慧,python都有著良好的表現,

    個人覺得還是python有著豐富的三方類庫,給予了python很大的發展,例如NumPy,pandas在自然語言處理內都是很常用,而且是很好用的

    三方庫,缺點就是運行速度稍慢一些,就是因為python是解釋性語言,需要在CPU上一行行翻譯成機器可以讀懂的機器碼,這個翻譯的過程比較耗時,所有運行會慢一些,

    再就是部署時候就是直接源碼部署,安全性差,python2和python3不兼容的問題,我覺得不是問題,python2將要不再維護了,python2也就逐漸推出我們的程式。

  註:開放性題,想了解更多,你可以去自行百度,組織成自己的語言就可以啦。A即為比較官方的說法(只摘取部分),MA為我自己組織的一段話,大家可以參考。

二,Q:說一說你對深拷貝和淺拷貝的理解,他們有什麼不同。

A:假設我們複製了一份A,複製出來的叫做B,如果我們修改A,發現B也隨著變化了,說明這個是淺拷貝,也就是說明了,我們的淺拷貝,只是增加了一個指針指向了同一個記憶體地址,當我們修改A,也就是修改原有的記憶體地址的值,B一定隨之變化;如果我們修改了A,發現B沒有變化,說明這個是深拷貝,也看得出來,深拷貝就是我們拿到A的記憶體的值,開闢了一個新的記憶體空間和創建了一個新的指針,指向了B,就是說,深拷貝就是將記憶體也複製成了兩份,而淺拷貝並沒有。淺拷貝:shallowCopy();深拷貝:deepCope()。

三,Q:python里的基本數據類型都有什麼?

  A:數字-number-數字;布爾型-bool-(True,False);字元串-str-'a'或者"a";列表-list-[];元祖-tuple-();字典-dict-{}。其中列表list,字典dict是可變的,其餘數字number,字元串str,元祖tuple是不可變的

四,Q:簡單說一下python中如何實現多執行緒

A:執行緒是輕量級的進程,多執行緒允許一次執行多個執行緒。眾所周知,Python 是一種多執行緒語言,它有一個多執行緒包。

  GIL(全局解釋器鎖)確保一次執行單個執行緒。一個執行緒保存 GIL 並在將其傳遞給下一個執行緒之前執行一些操作,這就產生了並行執行的錯覺。但實際上,只是執行緒輪流在 CPU 上。當然,所有傳遞都會增加執行的開銷。

 注意:GIL後期會出一個專門的部落格來說一說,剛才查了一下,要說的東西還是比較多的。

五,Q:什麼是Flask,和Django對比有什麼不同

A:Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱採用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權。

    Flask是一個輕量級框架,相當於一個步槍,而 Django是一個個重量級框架,相當於一個重機槍,但是Flask的三方庫也是相當強大的,Django能做到的 Flask也都可以(個人表示只用過Flask)。

   Flask的優勢:

   Flask自由、靈活,可擴展性強,入門簡單,適用於中小型網站的開發,非常試用web服務的API開發,性能方面均優於或高於Django,Django自帶的或第三方的好評如潮的功能,Flask上總會找到與之類似第三方庫,Flask與關係型資料庫的配合使用不弱於Django,而其與NoSQL資料庫的配合遠遠優於Django

   Django的優勢:(三方摘錄)

   Django的自帶ORM非常優秀,綜合評價略高於SQLAlchemy,Django自帶的模板引擎簡單好用,但其強大程度和綜合評價略低於Jinja,Django自帶的資料庫管理app好評如潮,Django目前支援Jinja等非官方模板引擎。

六,Q:如何在python中管理記憶體

A:python的記憶體管理是由私有的堆空間管理的,所有的python對象和數據結構都在一個專有的堆,程式設計師沒有訪問該堆的許可權,只有解釋器才能對他進行操作。可用 is 判斷兩個對象的記憶體地址是否一樣,用 == 判斷兩個對象的值是否一樣。None值也有記憶體地址,用print(id(None))可以列印其記憶體地址。

  備註:這個寫的感覺聽不錯噠,可以參考。https://www.cnblogs.com/wangyuhangboke/p/7802253.html

七,Q:剛剛說完了記憶體管理,現在我們來說說垃圾回收吧

A:python提供了對記憶體的垃圾收集機制,但是他將不用的記憶體放到記憶體池而不是反回給作業系統。python內部使用引用計數,來保持追蹤記憶體中的對象,python內部記錄了對象有多少個引用,就是引用計數,當對象被創建時就創建了一個引用計數,當對象不再需要的時候,這個對象的引用計數為0時,他被垃圾回收。當對象被創建被、作為參數傳遞給函數或作為容器對象的一個元素引用計數增加,相反,一個本地引用離開他的作用域、對象的別名被顯式的銷毀、對象的一個別名被賦值給其他對象或窗口對象本身被銷毀引用計數會減少。

八,Q:能否解釋一下 *args 和 **kwargs?

A:當函數的參數不確定時,可以使用*args和**kwargs。*args沒有key值,**kwargs有key值。*args可以當作可容納多個變數組成的list或tuple。直觀一點來點程式碼吧。

#!/usr/bin/env python  # -*- coding: utf-8 -*-    def parseArgs(*args, **kwargs):      print(type(args))      print(args)      print(type(kwargs))      print(kwargs)    if __name__ == '__main__':      parseArgs("test","123",'456',hello="hello",name='tom')

九,Q:解釋 Python 中的 join() 和 split() 函數

  A:join() 方法用於將序列中的元素以指定的字元連接生成一個新的字元串,例如

#!/usr/bin/env python  # -*- coding: utf-8 -*-    str = "-"  seq = ("a", "b", "c")  # 字元串序列  print(str.join(seq))    li = ['d', 'e', 'f']  # 字元串序列  print(str.join(li))

  split() 通過指定分隔符對字元串進行切片,如果參數 num 有指定值,則分隔 num+1 個子字元串。語法 str.split(str="", num=string.count(str)).

  str — 分隔符,默認為所有的空字元,包括空格、換行(n)、製表符(t)等。

  num — 分割次數。默認為 -1, 即分隔所有。例如

#!/usr/bin/env python  # -*- coding: utf-8 -*-    str = "my name is xc"  print(str.split())  # 以空格為分隔符,包含 n  print(str.split(' ', 2))  # 以空格為分隔符,分隔成2+1個

十,Q:Python 區分大小寫嗎?

  A:python是區分大小寫的,最後一個題我自身覺得挺無聊的,但是仔細想想,還有點懵,自己試了一遍才知道,真的區分,別讓別人的問題問懵了。

最近忙著弄Flask的源碼,寫部落格的時間不多,過幾天整理好了,把基礎的工具類,許可權,OSS登陸寫好以後,我會開源在碼雲上。覺得是可以拆分部署的,不知道真實項目可不可以使用,還在補全注釋和程式碼優化。