python语言面试基础_【python面试指北】1.语言基础
1. python是動(dòng)態(tài)強(qiáng)類型的語(yǔ)言。
動(dòng)態(tài)還是靜態(tài)指的是編譯器還是運(yùn)行期確定類型
強(qiáng)類型指的是不會(huì)發(fā)生隱式類型轉(zhuǎn)換。比如js能夠執(zhí)行1+"1",但是python不行,所以python是弱類型的語(yǔ)言。
2. 鴨子類型
當(dāng)一只鳥走起來(lái)像鴨子、游泳起來(lái)像鴨子、叫氣力啊也像鴨子,那么這只鳥就可以被稱為鴨子。
鴨子類型關(guān)注的是對(duì)象的行為,而不是類型。比如file,StringIO,socket對(duì)象都支持read/write方法,再比如定義了iter魔術(shù)方法的對(duì)象可以用for迭代。
3. monkey patch
所謂的monkey patch就是運(yùn)行時(shí)替換。
4. 自省
運(yùn)行時(shí)判斷一個(gè)對(duì)象類型的能力。
python一切皆對(duì)象,用type, id, isinstance獲取對(duì)象類型信息。
5. 列表和字典推導(dǎo)
如 [i for i in range(10) if i % 2 == 0],如果[]改為(),則為生成器
6. python2和python3
print成為函數(shù)
編碼問(wèn)題。python3不再有unicode對(duì)象,默認(rèn)str就是unicode
除法變化。python3除號(hào)返回浮點(diǎn)數(shù),如果要返回整數(shù),應(yīng)使用//
類型注解。幫助IDE實(shí)現(xiàn)類型檢查
優(yōu)化的super()方便直接調(diào)用父類函數(shù)
高級(jí)解包操作。a, b, *rest = range(10)
keyword only arguments。限定關(guān)鍵字參數(shù)
chained exceptions。python3重新拋出異常不會(huì)丟失棧信息
一切返回迭代器。range, zip, map, dict.values, etc. are all iterators
性能優(yōu)化等。。。
7. python如何傳遞參數(shù)
python既不是值傳遞也不是引用傳遞,唯一支持的參數(shù)傳遞是共享傳參。
call by object(call by object reference or call by sharing)
call by sharing(共享傳參),函數(shù)形參獲得實(shí)參中各個(gè)引用的副本。
變量一切都是對(duì)象。list是可變對(duì)象,string是不可變對(duì)象
總結(jié)一下:根據(jù)對(duì)象的引用來(lái)傳遞,根據(jù)對(duì)象是可變對(duì)象還是不可變對(duì)象,得到兩種不同的結(jié)果。如果是可變對(duì)象,則直接修改。如果是不可變對(duì)象,則生產(chǎn)新對(duì)象,讓形參指向新對(duì)象
8. python可變/不可變對(duì)象
不可變對(duì)象: bool/int/float/tuple/str/frozenset
可變對(duì)象:list/set/dict
練習(xí)題:
# 1
def clear_list(l)
l = []
ll = [1,2,3]
clear_list(ll)
print(lll)
# 2
def fl(l=[1]):
l.append(1)
print(l)
fl()
fl()
# 記住:默認(rèn)參數(shù)只計(jì)算一次
**9. *args, kwargs
用來(lái)處理可變參數(shù),args被打包成tuple,kwargs被打包成dict
傳遞方式有兩種
# 第一種
foo(1,2,3)
foo(a=1,b=2)
# 第二種
foo(*[1,2,3])
foo(**dict(a=1,b=2)})
10. python異常機(jī)制
BaseException
下面有SystemExit/KeyboardInterrupt/GeneratorExit/Exception(其他異常都屬于它)
try:
# func # 可能會(huì)拋出異常的代碼
except (Exception1, Exception2) as e: # 可以捕獲多個(gè)異常并處理
# 異常處理的代碼
else:
# pass # 異常沒(méi)有發(fā)生的時(shí)候代碼邏輯
finally:
pass # 無(wú)論異常有沒(méi)有發(fā)生都會(huì)執(zhí)行的代碼,一般處理資源的關(guān)閉和釋放
11. 自定義異常
繼承Exception實(shí)現(xiàn)自定義異常,給異常加上一些附加信息
不用baseException是因?yàn)檫@樣的話ctrl+c的keybord異常就用不了了
12. python性能分析與優(yōu)化,GIL
cpython解釋器的內(nèi)存管理并不是線程安全的
保護(hù)多線程情況下對(duì)python對(duì)象的訪問(wèn)
cpython使用簡(jiǎn)單的鎖機(jī)制避免多個(gè)線程同時(shí)執(zhí)行字節(jié)碼
GIL的影響
限制了程序的多核執(zhí)行
同一個(gè)時(shí)間只能有一個(gè)線程執(zhí)行字節(jié)碼
CPU密集程序難以利用多核優(yōu)勢(shì)
IO期間會(huì)釋放GIL,對(duì)IP密集程序影響不大
對(duì)IO密集程序影響不大
如何規(guī)避GIL的影響
區(qū)分CPI和IO密集程序
CPU密集可以使用多進(jìn)程+進(jìn)程池
IO密集使用多線程/協(xié)程
cpython擴(kuò)展
13. 服務(wù)端性能優(yōu)化措施
web應(yīng)用一般語(yǔ)言不會(huì)成為瓶頸
數(shù)據(jù)結(jié)構(gòu)與算法優(yōu)化
數(shù)據(jù)庫(kù)層:索引優(yōu)化,慢查詢消除,批量操作減少IO,NoSQL
網(wǎng)絡(luò)IO:批量操作,pipeline操作,減少IO
緩存:使用內(nèi)存數(shù)據(jù)庫(kù) redis/memcached
異步:asyncio,celery
并發(fā):gevent/多線程
14. python生成器與協(xié)程
Generator
生成器就是可以生成值的函數(shù)
當(dāng)一個(gè)函數(shù)里有了yield關(guān)鍵字就成了生成器
生成器可以掛起執(zhí)行并且保持當(dāng)前執(zhí)行的狀態(tài)
協(xié)程不懂
15. python3原生協(xié)程
async/await支持原生協(xié)程
16. python單元測(cè)試
三無(wú)代碼不可取(無(wú)穩(wěn)定、無(wú)注釋、無(wú)單測(cè))
保證的代碼邏輯的正確性
單側(cè)影響設(shè)計(jì),易測(cè)的代碼往往是高內(nèi)聚低耦合的
回歸測(cè)試,防止改一處整個(gè)服務(wù)不可用
單元測(cè)試相關(guān)的庫(kù)
nose/pytest較為常用
mock模塊用來(lái)模擬替換網(wǎng)絡(luò)請(qǐng)求等
coverage統(tǒng)計(jì)測(cè)試覆蓋率
17. python深拷貝與淺拷貝
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的python语言面试基础_【python面试指北】1.语言基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python的语法类似php_PHP实现
- 下一篇: ‌新车挑选车膜需要注意