最近在弄flask的東西,好久沒寫博客的,感覺少了點(diǎn)什么,感覺被別人落下好多,可能漸漸的養(yǎng)成了寫博客的習(xí)慣吧。也是自己想學(xué)的東西太多了(說白了就是基礎(chǔ)太差了,只是know how,不能做到konw why)。
不說那些毒雞湯了,我們來說說我們今天的python基礎(chǔ)面試題吧。
一, Q:python的優(yōu)缺點(diǎn)有什么?
A:優(yōu)點(diǎn):
1,基礎(chǔ)語法簡單易學(xué),對于初學(xué)者來說,語法還是相對簡單的,比較容易學(xué)習(xí),網(wǎng)上的學(xué)習(xí)資料也很多。
? ?2,面向?qū)ο螅趐ython里繼承和封裝較多,而python的多態(tài)還是相對較少的(起個不一樣的名字不就可以嗎....對java的多態(tài)表示無奈),從而減少了大量代碼的輸出。
3,語言簡潔,相對java比,語法要比java簡單很多(我只會java和python,會一點(diǎn)點(diǎn)Node.js和前端的VUE)
4,開源,python語言開源便于我們自行去維護(hù)和更深入的了解源碼。
5,豐富的社區(qū)資源,具有超級豐富的三方庫。
缺點(diǎn):
1,運(yùn)行速度慢,由于python是解釋性語言,對比其它語言要相對慢一些。
2,python2和python3不兼容(python2在2020年1月就不在維護(hù))
3,代碼安全性較弱,我們發(fā)布項(xiàng)目,其實(shí)就是發(fā)布我們的源碼,安全性差。
MA:個人認(rèn)為python的優(yōu)點(diǎn)在于他是一種面向?qū)ο蟮膭討B(tài)類型語言,從自動化運(yùn)維到web開發(fā)再到人工智能,python都有著良好的表現(xiàn),
個人覺得還是python有著豐富的三方類庫,給予了python很大的發(fā)展,例如NumPy,pandas在自然語言處理內(nèi)都是很常用,而且是很好用的
三方庫,缺點(diǎn)就是運(yùn)行速度稍慢一些,就是因?yàn)閜ython是解釋性語言,需要在CPU上一行行翻譯成機(jī)器可以讀懂的機(jī)器碼,這個翻譯的過程比較耗時,所有運(yùn)行會慢一些,
再就是部署時候就是直接源碼部署,安全性差,python2和python3不兼容的問題,我覺得不是問題,python2將要不再維護(hù)了,python2也就逐漸推出我們的程序。
注:開放性題,想了解更多,你可以去自行百度,組織成自己的語言就可以啦。 A即為比較官方的說法(只摘取部分),MA為我自己組織的一段話,大家可以參考。
二,Q:說一說你對深拷貝和淺拷貝的理解,他們有什么不同。
A:假設(shè)我們復(fù)制了一份A,復(fù)制出來的叫做B,如果我們修改A,發(fā)現(xiàn)B也隨著變化了,說明這個是淺拷貝,也就是說明了,我們的淺拷貝,只是增加了一個指針指向了同一個內(nèi)存地址,當(dāng)我們修改A,也就是修改原有的內(nèi)存地址的值,B一定隨之變化;如果我們修改了A,發(fā)現(xiàn)B沒有變化,說明這個是深拷貝,也看得出來,深拷貝就是我們拿到A的內(nèi)存的值,開辟了一個新的內(nèi)存空間和創(chuàng)建了一個新的指針,指向了B,就是說,深拷貝就是將內(nèi)存也復(fù)制成了兩份,而淺拷貝并沒有。淺拷貝:shallowCopy();深拷貝:deepCope()。
三,Q:python里的基本數(shù)據(jù)類型都有什么?
A:數(shù)字-number-數(shù)字;布爾型-bool-(True,F(xiàn)alse);字符串-str-' a '或者" a ";列表-list-[];元祖-tuple-();字典-dict-{}。其中列表list,字典dict是可變的,其余數(shù)字number,字符串str,元祖tuple是不可變的
四,Q:簡單說一下python中如何實(shí)現(xiàn)多線程
A: 線程是輕量級的進(jìn)程,多線程允許一次執(zhí)行多個線程。眾所周知,Python 是一種多線程語言,它有一個多線程包。
?
GIL(全局解釋器鎖)確保一次執(zhí)行單個線程。一個線程保存 GIL 并在將其傳遞給下一個線程之前執(zhí)行一些操作,這就產(chǎn)生了并行執(zhí)行的錯覺。但實(shí)際上,只是線程輪流在 CPU 上。當(dāng)然,所有傳遞都會增加執(zhí)行的開銷。
注意:GIL后期會出一個專門的博客來說一說,剛才查了一下,要說的東西還是比較多的。
五,Q:什么是Flask,和Django對比有什么不同
A:Flask是一個使用?Python?編寫的輕量級 Web 應(yīng)用框架。其?WSGI?工具箱采用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權(quán)。
Flask是一個輕量級框架,相當(dāng)于一個步槍,而 Django是一個個重量級框架,相當(dāng)于一個重機(jī)槍,但是Flask的三方庫也是相當(dāng)強(qiáng)大的,Django能做到的 Flask也都可以(個人表示只用過Flask)。
Flask的優(yōu)勢:
Flask自由、靈活,可擴(kuò)展性強(qiáng),入門簡單,適用于中小型網(wǎng)站的開發(fā),非常試用web服務(wù)的API開發(fā),性能方面均優(yōu)于或高于Django, Django自帶的或第三方的好評如潮的功能,F(xiàn)lask上總會找到與之類似第三方庫,F(xiàn)lask與關(guān)系型數(shù)據(jù)庫的配合使用不弱于Django,而其與NoSQL數(shù)據(jù)庫的配合遠(yuǎn)遠(yuǎn)優(yōu)于Django
Django的優(yōu)勢:(三方摘錄)
Django的自帶ORM非常優(yōu)秀,綜合評價略高于SQLAlchemy,Django自帶的模板引擎簡單好用,但其強(qiáng)大程度和綜合評價略低于Jinja,Django自帶的數(shù)據(jù)庫管理app好評如潮,Django目前支持Jinja等非官方模板引擎。
六,Q:如何在python中管理內(nèi)存
A:python的內(nèi)存管理是由私有的堆空間管理的,所有的python對象和數(shù)據(jù)結(jié)構(gòu)都在一個專有的堆,程序員沒有訪問該堆的權(quán)限,只有解釋器才能對他進(jìn)行操作。可用 is 判斷兩個對象的內(nèi)存地址是否一樣,用 == 判斷兩個對象的值是否一樣。None值也有內(nèi)存地址,用print(id(None))可以打印其內(nèi)存地址。
備注:這個寫的感覺聽不錯噠,可以參考。https://www.cnblogs.com/wangyuhangboke/p/7802253.html
七,Q:剛剛說完了內(nèi)存管理,現(xiàn)在我們來說說垃圾回收吧
A:python提供了對內(nèi)存的垃圾收集機(jī)制,但是他將不用的內(nèi)存放到內(nèi)存池而不是反回給操作系統(tǒng)。python內(nèi)部使用引用計數(shù),來保持追蹤內(nèi)存中的對象,python內(nèi)部記錄了對象有多少個引用,就是引用計數(shù),當(dāng)對象被創(chuàng)建時就創(chuàng)建了一個引用計數(shù),當(dāng)對象不再需要的時候,這個對象的引用計數(shù)為0時,他被垃圾回收。當(dāng)對象被創(chuàng)建被、作為參數(shù)傳遞給函數(shù)或作為容器對象的一個元素引用計數(shù)增加,相反,一個本地引用離開他的作用域、對象的別名被顯式的銷毀、對象的一個別名被賦值給其他對象或窗口對象本身被銷毀引用計數(shù)會減少。
八,Q:能否解釋一下 *args 和 **kwargs?
A:當(dāng)函數(shù)的參數(shù)不確定時,可以使用*args和**kwargs。*args沒有key值,**kwargs有key值。*args可以當(dāng)作可容納多個變量組成的list或tuple。直觀一點(diǎn)來點(diǎn)代碼吧。

# !/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() 函數(shù)
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()?通過指定分隔符對字符串進(jìn)行切片,如果參數(shù) num 有指定值,則分隔 num+1 個子字符串。語法 ? str . split ( str = "" , num = string . count ( str )).? ??
str -- 分隔符,默認(rèn)為所有的空字符,包括空格、換行(\n)、制表符(\t)等。
num -- 分割次數(shù)。默認(rèn)為 -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 區(qū)分大小寫嗎?
? ? A:python是區(qū)分大小寫的,最后一個題我自身覺得挺無聊的,但是仔細(xì)想想,還有點(diǎn)懵,自己試了一遍才知道,真的區(qū)分,別讓別人的問題問懵了。
?
?
?
最近忙著弄Flask的源碼,寫博客的時間不多,過幾天整理好了,把基礎(chǔ)的工具類,權(quán)限,OSS登陸寫好以后,我會開源在碼云上。覺得是可以拆分部署的,不知道真實(shí)項(xiàng)目可不可以使用,還在補(bǔ)全注釋和代碼優(yōu)化。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
