作為Python的使用者來說,Python中的垃圾回收主要以引用計數(shù)為主,再引入標(biāo)記、清除,分代為輔來解決循環(huán)引用的問題。
一個對象被引用時,引用計數(shù)加1,當(dāng)對象被del時,引用計數(shù)減去1,為0時,對象就被清除,一般情況下用戶不會去操作Python 的垃圾回收機制,但它留有API接口。
主要區(qū)別是列表是可變的,而元組是不可變的。
>>> mylist=[1,3,3] >>> mylist[1]=2 >>> mytuple=(1,3,3) >>> mytuple[1]=2 Traceback (most recent call last): File "pyshell#97>", line 1, in module>
首先一個對象能不能作為字典的key, 就取決于其有沒有__hash__方法。 所以除了容器對象(list/dict/set)和內(nèi)部包含容器對象的tuple 是不可作為字典的key, 其他的對象都可以。
1、操作系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,多個進(jìn)程之間相互獨立
2、穩(wěn)定性好,如果一個進(jìn)程崩潰,不影響其他進(jìn)程,但是進(jìn)程消耗資源大,開啟的進(jìn)程數(shù)量有限制
1、CPU進(jìn)行資源分配和調(diào)度的基本單位,線程是進(jìn)程的一部分,是比進(jìn)程更小的能獨立運行的基本單位,一個進(jìn)程下的多個線程可以共享該進(jìn)程的所有資源
2、如果IO操作密集,則可以多線程運行效率高,缺點是如果一個線程崩潰,都會造成進(jìn)程的崩潰
1、子程序調(diào)用總是一個入口,一次返回,調(diào)用順序是明確的。而協(xié)程的調(diào)用和子程序不同。
2、協(xié)程看上去也是子程序,但執(zhí)行過程中,在子程序內(nèi)部可中斷,然后轉(zhuǎn)而執(zhí)行別的子程序,在適當(dāng)?shù)臅r候再返回來接著執(zhí)行。
深拷貝就是將一個對象拷貝到另一個對象中,這意味著如果你對一個對象的拷貝做出改變時,不會影響原對象。在Python中,我們使用函數(shù)deepcopy()執(zhí)行深拷貝
淺拷貝則是將一個對象的引用拷貝到另一個對象上,所以如果我們在拷貝中改動,會影響到原對象
GIL是python的全局解釋器鎖,同一進(jìn)程中假如有多個線程運行,一個線程在運行python程序的時候會霸占python解釋器(加了一把鎖即GIL),使該進(jìn)程內(nèi)的其他線程無法運行,等該線程運行完后其他線程才能運行。如果線程運行過程中遇到耗時操作,則解釋器鎖解開,使其他線程運行。所以在多線程中,線程的運行仍是有先后順序的,并不是同時進(jìn)行。
多進(jìn)程中因為每個進(jìn)程都能被系統(tǒng)分配資源,相當(dāng)于每個進(jìn)程有了一個python解釋器,所以多進(jìn)程可以實現(xiàn)多個進(jìn)程的同時運行,缺點是進(jìn)程系統(tǒng)資源開銷大
先通過轉(zhuǎn)換為集合去重,在轉(zhuǎn)列表
外層循環(huán)從1到n-1,內(nèi)循環(huán)從當(dāng)前外層的元素的下一個位置開始,依次和外層的元素比較,出現(xiàn)逆序就交換,通過與相鄰元素的比較和交換來把小的數(shù)交換到最前面。
def bubbleSort(array): if len(array) 2: return array else: isSorted = False counter = 0 while not isSorted: isSorted = True for idx in range(len(array) - 1 - counter): if array[idx] > array[idx + 1]: isSorted = False (array[idx + 1], array[idx]) = (array[idx], array[idx + 1]) counter += 1 return array
8.3 快速排序
通過一趟排序?qū)⒋庞涗浄指舫瑟毩⒌膬刹糠?,其中一部分記錄的關(guān)鍵字均比另一部分的關(guān)鍵字小,則可分別對這兩部分記錄繼續(xù)進(jìn)行排序,以達(dá)到整個序列有序。
1、選定Pivot中心軸
2、從R指針開始,將大于Pivot的數(shù)字放在Pivot的右邊
3、將小于Pivot的數(shù)字放在Pivot的左邊
4、分別對左右子序列重復(fù)前三步操作
def quickSort(array): print(array) if len(array) 2: return array else: pivot_index = 0 pivot = array[pivot_index] less_part = [i for i in array[pivot_index+1:] if i = pivot] large_part = [i for i in array[pivot_index+1:] if i > pivot] return quickSort(less_part) + [pivot] + quickSort(large_part)
函數(shù)的返回值是函數(shù)對象,只有外部函數(shù)才可以對他進(jìn)行訪問,提高了安全性
with語句的使用,可以簡化了代碼,有效避免資源泄露的發(fā)生
打開文件在進(jìn)行讀寫的時候可能會出現(xiàn)一些異常狀況,如果按照常規(guī)的f.open
寫法,我們需要try,except,finally,做異常判斷,并且文件最終不管遇到什么情況,都要執(zhí)行finally f.close()關(guān)閉文件,with方法幫我們實現(xiàn)了finally中f.close
實例方法只能被實例調(diào)用,靜態(tài)方法(@由staticmethod裝飾器的方法)、類方法(由@classmethod裝飾器的方法),可以被類或類的實例對象調(diào)用。
1、實例方法,第一個參數(shù)必須要默認(rèn)傳遞實例對象,一般使用self。
2、靜態(tài)方法,參數(shù)沒有必要。
3、類方法,第一個參數(shù)必須要默認(rèn)傳遞,一般使用cls。
迭代器是一個可以記住遍歷的位置的對象。
迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結(jié)束。迭代器只能往前不會后退。
迭代器有兩個基本的方法:iter() 和 next()。
字符串,列表或元組對象都可用于創(chuàng)建迭代器:
>>> list=[1,2,3,4] >>> it = iter(list) # 創(chuàng)建迭代器對象 >>> print (next(it)) # 輸出迭代器的下一個元素 1 >>> print (next(it)) 2 >>>
使用了yield的函數(shù)被稱為生成器
生成器是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器
在調(diào)用生成器運行的過程中,每次遇到 yield 時函數(shù)會暫停并保存當(dāng)前所有的運行信息,返回 yield 的值, 并在下一次執(zhí)行 next() 方法時從當(dāng)前位置繼續(xù)運行
print [(lambda x:x*x)(x)for x in range(5)] [0, 1, 4, 9, 16, 25]
對可迭代對象中的每個元素進(jìn)行相同的操作
def fn(x): return x+1 resp = map(fn,li) print(list(resp)) [2, 3, 4]
從左到右對一個序列的項累計地應(yīng)用有兩個參數(shù)的函數(shù),以此合并序列到一個單一值。(例如累加或累乘列表元素等等)
from functools import reduce nums=[1, 2, 3, 4] def fn(x, y): return x * y resp = reduce(fn, nums) print(resp) 24
filter函數(shù)用于過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。該接收兩個參數(shù): 第一個為函數(shù),第二個為序列,序列的每個元素作為參數(shù)傳遞給函數(shù)進(jìn)行判,然后返回 True 或 False,最后將返回 True 的元素放到新列表
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] def fn(a): return a%2 == 1 newlist = filter(fn, a) newlist = [i for i in newlist] print(newlist) ## 輸出: [1, 3, 5, 7, 9]
Python Web Server Gateway Interface,翻譯過來是Python web服務(wù)器網(wǎng)關(guān)接口,實際上就是一種協(xié)議,我們的應(yīng)用(Django,Flask)實現(xiàn)了WSGI,就可以配合實現(xiàn)了WSGI(uWSGI,gunicorn)的服務(wù)器工作了
FBV和CBV本質(zhì)是一樣的,基于函數(shù)的視圖叫做FBV,基于類的視圖叫做CBV
在python中使用CBV的優(yōu)點:
class WSGIHandler(base.BaseHandler): request = self.request_class(environ)
請求走到WSGIHandler類的時候,執(zhí)行cell方法,將environ封裝成了request
from django.utils.decorators import method_decorator @method_decorator(check_login) def post(self, request): ...
@method_decorator(check_login) def dispatch(self, request, *args, **kwargs):
@method_decorator(check_login, name="get") @method_decorator(check_login, name="post") class HomeView(View): ...
1> all(): 查詢所有結(jié)果
2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象。獲取不到返回None
3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結(jié)果有且只有一個。
如果符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象
5> order_by(*field): 對查詢結(jié)果排序
6> reverse(): 對查詢結(jié)果反向排序
8> count(): 返回數(shù)據(jù)庫中匹配查詢(QuerySet)的對象數(shù)量。
9> first(): 返回第一條記錄
10> last(): 返回最后一條記錄
11> exists(): 如果QuerySet包含數(shù)據(jù),就返回True,否則返回False
12> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行后得到的
并不是一系 model的實例化對象,而是一個可迭代的字典序列
13> values_list(*field): 它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列
14> distinct(): 從返回結(jié)果中剔除重復(fù)紀(jì)錄
有外鍵存在時,可以很好的減少數(shù)據(jù)庫請求的次數(shù),提高性能
select_related 通過多表 join 關(guān)聯(lián)查詢, 一次性獲得所有數(shù)據(jù), 只執(zhí)行一次SQL查詢
prefetch_related 分別查詢每個表, 然后根據(jù)它們之間的關(guān)系進(jìn)行處理, 執(zhí)行兩次查詢
第一步:django第一次響應(yīng)來自某個客戶端的請求時,后端隨機產(chǎn)生一個token值,把這個token保存在SESSION狀態(tài)中;同時,后端把這個token放到cookie中交給前端頁面;
第二步:下次前端需要發(fā)起請求(比如發(fā)帖)的時候把這個token值加入到請求數(shù)據(jù)或者頭信息中,一起傳給后端;Cookies:{csrftoken:xxxxx}
第三步:后端校驗前端請求帶過來的token和SESSION里的token是否一致。
# 使用Django的信號機制,可以在添加、刪除數(shù)據(jù)前后設(shè)置日志記錄: pre_init # Django中的model對象執(zhí)行其構(gòu)造方法前,自動觸發(fā) post_init # Django中的model對象執(zhí)行其構(gòu)造方法后,自動觸發(fā) pre_save # Django中的model對象保存前,自動觸發(fā) post_save # Django中的model對象保存后,自動觸發(fā) pre_delete # Django中的model對象刪除前,自動觸發(fā) post_delete # Django中的model對象刪除后,自動觸發(fā) # 使用 @receiver(post_save, sender=Myclass) # 信號接收裝飾器。由于內(nèi)置信號,所以直接接收 def signal_handler(sender, **kwargs): # 接收到信號后,在此處理 logger = logging.getLogger() logger.success('保存成功')
CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 緩存后臺使用的引擎 'TIMEOUT': 300, # 緩存超時時間(默認(rèn)300秒,None表示永不過期,0表示立即過期) 'OPTIONS':{ 'MAX_ENTRIES': 300, # 最大緩存記錄的數(shù)量(默認(rèn)300) 'CULL_FREQUENCY': 3, # 緩存到達(dá)最大個數(shù)之后,剔除緩存?zhèn)€數(shù)的比例,即:1/CULL_FREQUENCY(默認(rèn)3) }, } }
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100} # "PASSWORD": "密碼", } } }
主要是通過name的值,來查找url地址,可以理解為反射作用。在html模板中使用name來反射url優(yōu)勢就是后期url規(guī)則發(fā)生改變之后,只需調(diào)整urls.py即可,所有的模板文件都不需要修改。
到此這篇關(guān)于Python常見基礎(chǔ)面試題及答案的文章就介紹到這了,更多相關(guān)Python基礎(chǔ)面試題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:三亞 銀川 呼倫貝爾 呼倫貝爾 烏魯木齊 湘西 安慶 葫蘆島
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《非常全面的Python常見基礎(chǔ)面試題及答案》,本文關(guān)鍵詞 非常,全,面的,Python,常見,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。