最近在弄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登陸寫好以后,我會開源在碼雲上。覺得是可以拆分部署的,不知道真實項目可不可以使用,還在補全注釋和代碼優化。