本文正在參加「Python主題月」,詳情查看 活動連接html
做爲Python的使用者來講,Python中的垃圾回收主要以引用計數
爲主,再引入標記
、清除
,分代爲輔
來解決循環引用的問題。前端
一個對象被引用時,引用計數加1,當對象被del時,引用計數減去1,爲0時,對象就被清除,通常狀況下用戶不會去操做Python 的垃圾回收機制,但它留有API接口。python
主要區別是列表是可變的,而元組是不可變的。web
>>> 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)和內部包含容器對象的tuple 是不可做爲字典的key, 其餘的對象均可以。redis
一、操做系統進行資源分配和調度的基本單位,多個進程之間相互獨立算法
二、穩定性好,若是一個進程崩潰,不影響其餘進程,可是進程消耗資源大,開啓的進程數量有限制shell
一、CPU進行資源分配和調度的基本單位,線程是進程的一部分,是比進程更小的能獨立運行的基本單位,一個進程下的多個線程能夠共享該進程的全部資源數據庫
二、若是IO操做密集,則能夠多線程運行效率高,缺點是若是一個線程崩潰,都會形成進程的崩潰django
一、子程序調用老是一個入口,一次返回,調用順序是明確的。而協程的調用和子程序不一樣。後端
二、協程看上去也是子程序,但執行過程當中,在子程序內部可中斷,而後轉而執行別的子程序,在適當的時候再返回來接着執行。
深拷貝就是將一個對象拷貝到另外一個對象中,這意味着若是你對一個對象的拷貝作出改變時,不會影響原對象
。在Python中,咱們使用函數deepcopy()執行深拷貝
淺拷貝則是將一個對象的引用拷貝到另外一個對象上,因此若是咱們在拷貝中改動,會影響到原對象
GIL
是python的全局解釋器鎖,同一進程中假若有多個線程運行,一個線程在運行python程序的時候會霸佔python解釋器(加了一把鎖即GIL),使該進程內的其餘線程沒法運行,等該線程運行完後其餘線程才能運行。若是線程運行過程當中遇到耗時操做,則解釋器鎖解開,使其餘線程運行。因此在多線程中,線程的運行還是有前後順序的,並非同時進行。
多進程中由於每一個進程都能被系統分配資源,至關於每一個進程有了一個python解釋器,因此多進程能夠實現多個進程的同時運行,缺點是進程系統資源開銷大
先經過轉換爲集合去重,在轉列表
外層循環從1到n-1,內循環從當前外層的元素的下一個位置開始,依次和外層的元素比較,出現逆序就交換,經過與相鄰元素的比較和交換來把小的數交換到最前面。
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
複製代碼
經過一趟排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另外一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
一、選定Pivot中心軸
二、從R指針開始,將大於Pivot的數字放在Pivot的右邊
三、將小於Pivot的數字放在Pivot的左邊
四、分別對左右子序列重複前三步操做
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)
複製代碼
函數的返回值是函數對象,只有外部函數才能夠對他進行訪問,提升了安全性
with
語句的使用,能夠簡化了代碼,有效避免資源泄露的發生
打開文件在進行讀寫的時候可能會出現一些異常情況,若是按照常規的f.open
寫法,咱們須要try
,except
,finally
,作異常判斷,而且文件最終無論遇到什麼狀況,都要執行finally f.close()
關閉文件,with方法幫咱們實現了finally中f.close
實例方法只能被實例調用,靜態方法(@由staticmethod裝飾器的方法)、類方法(由@classmethod裝飾器的方法),能夠被類或類的實例對象調用。
一、實例方法,第一個參數必需要默認傳遞實例對象,通常使用self。 二、靜態方法,參數沒有必要。 三、類方法,第一個參數必需要默認傳遞,通常使用cls。
迭代器是一個能夠記住遍歷的位置的對象。
迭代器對象從集合的第一個元素開始訪問,直到全部的元素被訪問完結束。迭代器只能往前不會後退。
迭代器有兩個基本的方法:iter()
和 next()
。
字符串,列表或元組對象均可用於建立迭代器:
>>> list=[1,2,3,4]
>>> it = iter(list) # 建立迭代器對象
>>> print (next(it)) # 輸出迭代器的下一個元素
1
>>> print (next(it))
2
>>>
複製代碼
使用了yield
的函數被稱爲生成器
生成器是一個返回迭代器的函數,只能用於迭代操做,更簡單點理解生成器就是一個迭代器
在調用生成器運行的過程當中,每次遇到 yield 時函數會暫停並保存當前全部的運行信息,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續運行
print [(lambda x:x*x)(x)for x in range(5)]
[0, 1, 4, 9, 16, 25]
複製代碼
對可迭代對象中的每一個元素進行相同的操做
def fn(x):
return x+1
resp = map(fn,li)
print(list(resp))
[2, 3, 4]
複製代碼
從左到右對一個序列的項累計地應用有兩個參數的函數,以此合併序列到一個單一值。(例如累加或累乘列表元素等等)
from functools import reduce
nums=[1, 2, 3, 4]
def fn(x, y):
return x * y
resp = reduce(fn, nums)
print(resp)
24
複製代碼
filter
函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。該接收兩個參數: 第一個爲函數
,第二個爲序列
,序列的每一個元素做爲參數傳遞給函數進行判,而後返回 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服務器網關接口,實際上就是一種協議,咱們的應用(Django,Flask)實現了WSGI,就能夠配合實現了WSGI(uWSGI,gunicorn)的服務器工做了
前端發送請求
wsgi, 他就是socket服務端,用於接收用戶請求並將請求進行初次封裝,而後將請求交給web框架(Flask、Django)
中間件處理請求,幫助咱們對請求進行校驗或在請求對象中添加其餘相關數據,例如:csrf、request.session
路由匹配,根據當前請求的URL找到視圖函數,若是是FBV寫法,經過判斷method兩類型,找到對應的視圖函數;若是是CBV寫法,匹配成功後會自動去找dispatch方法,而後Django會經過dispatch反射的方式找到類中對應的方法並執行
視圖函數,在視圖函數中進行業務邏輯的處理,可能涉及到:orm、view視圖將數據渲染到template模板
視圖函數執行完畢以後,會把客戶端想要的數據返回給dispatch方法,由dispatch方法把數據返回經客戶端
中間件處理響應
wsgi,將響應的內容發送給瀏覽器
瀏覽器渲染
Admin: 對model中對應的數據表進行增刪改查提供的組件
model:負責操做數據庫
form:1.生成HTML代碼 2.數據有效性校驗 3校驗信息返回並展現
ModelForm: 即用於數據庫操做,也可用於用戶請求的驗證
process_request : 請求進來時,權限認證
process_view : 路由匹配以後,可以獲得視圖函數
process_exception : 異常時執行
process_template_responseprocess : 模板渲染時執行
process_response : 請求有響應時執行
FBV和CBV本質是同樣的,基於函數的視圖叫作FBV,基於類的視圖叫作CBV
在python中使用CBV的優勢:
class WSGIHandler(base.BaseHandler):
request = self.request_class(environ)
複製代碼
請求走到WSGIHandler類的時候,執行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(): 查詢全部結果
<2> filter(**kwargs): 它包含了與所給篩選條件相匹配的對象。獲取不到返回None
<3> get(**kwargs): 返回與所給篩選條件相匹配的對象,返回結果有且只有一個。
若是符合篩選條件的對象超過一個或者沒有都會拋出錯誤。
<4> exclude(**kwargs): 它包含了與所給篩選條件不匹配的對象
<5> order_by(*field): 對查詢結果排序
<6> reverse(): 對查詢結果反向排序
<8> count(): 返回數據庫中匹配查詢(QuerySet)的對象數量。
<9> first(): 返回第一條記錄
<10> last(): 返回最後一條記錄
<11> exists(): 若是QuerySet包含數據,就返回True,不然返回False
<12> values(*field): 返回一個ValueQuerySet——一個特殊的QuerySet,運行後獲得的
並非一系 model的實例化對象,而是一個可迭代的字典序列
<13> values_list(*field): 它與values()很是類似,它返回的是一個元組序列,values返回的是一個字典序列
<14> distinct(): 從返回結果中剔除重複紀錄
複製代碼
有外鍵存在時,能夠很好的減小數據庫請求的次數,提升性能
select_related 經過多表 join 關聯查詢, 一次性得到全部數據, 只執行一次SQL查詢 prefetch_related 分別查詢每一個表, 而後根據它們之間的關係進行處理, 執行兩次查詢
第一步:django第一次響應來自某個客戶端的請求時,後端隨機產生一個token值,把這個token保存在SESSION狀態中;同時,後端把這個token放到cookie中交給前端頁面;
第二步:下次前端須要發起請求(好比發帖)的時候把這個token值加入到請求數據或者頭信息中,一塊兒傳給後端;Cookies:{csrftoken:xxxxx}
第三步:後端校驗前端請求帶過來的token和SESSION裏的token是否一致。
# 使用Django的信號機制,能夠在添加、刪除數據先後設置日誌記錄:
pre_init # Django中的model對象執行其構造方法前,自動觸發
post_init # Django中的model對象執行其構造方法後,自動觸發
pre_save # Django中的model對象保存前,自動觸發
post_save # Django中的model對象保存後,自動觸發
pre_delete # Django中的model對象刪除前,自動觸發
post_delete # Django中的model對象刪除後,自動觸發
# 使用
@receiver(post_save, sender=Myclass) # 信號接收裝飾器。因爲內置信號,因此直接接收
def signal_handler(sender, **kwargs): # 接收到信號後,在此處理
logger = logging.getLogger()
logger.success('保存成功')
複製代碼
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.dummy.DummyCache', # 緩存後臺使用的引擎
'TIMEOUT': 300, # 緩存超時時間(默認300秒,None表示永不過時,0表示當即過時)
'OPTIONS':{
'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300)
'CULL_FREQUENCY': 3, # 緩存到達最大個數以後,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認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優點就是後期url規則發生改變以後,只需調整urls.py便可,全部的模板文件都不須要修改。