python高階進階全知識知識筆記總結完整教程(附程式碼資料)主要內容講述:作業系統,虛擬機器軟體,Ubuntu作業系統,Linux核心及發行版,檢視目錄命令,切換目錄命令,絕對路徑和相對路徑,建立、刪除檔案及目錄命令,複製、移動檔案及目錄命令,終端命令格式的組成,檢視命令幫助。HTTP 請求報文,HTTP響應報文,搭建Python自帶靜態Web伺服器,靜態Web伺服器-返回固定頁面資料。靜態Web伺服器-返回指定頁面資料,靜態Web伺服器-多工版,靜態Web伺服器-物件導向開發。靜態Web伺服器-命令列啟動動態繫結埠號,html 的介紹,html 的基本結構,vscode 的基本使用,初始常用的 html 標籤,資源路徑,列表標籤,表格標籤。表單標籤,表單提交,css 的介紹,css 的引入方式,css 選擇器。css 屬性,JavaScript的介紹,JavaScript的使用方式,變數和資料型別,函式定義和呼叫,變數作用域,條件語句,獲取標籤元素。操作標籤元素屬性,陣列及操作方法,迴圈語句,字串拼接,定時器,jQuery的介紹,jQuery的用法,jQuery選擇器,選擇集過濾。選擇集轉移,獲取和設定元素內容,獲取和設定元素屬性,jQuery事件,事件,JavaScript物件,json。ajax,資料庫,關係型資料庫管理系統。MySQL資料庫,資料型別和約束。命令列客戶端MySQL的使用,as和distinct關鍵字,where條件查詢,排序,分頁查詢。ls命令選項,mkdir和rm命令選項,cp和mv命令選項,重定向命令,檢視檔案內容命令,連結命令,文字搜尋命令,查詢檔案命令。聚合函式,分組查詢,連線查詢-內連線,連線查詢-左連線,連線查詢-右連線,連線查詢-自連線,子查詢。資料庫設計之三正規化,外來鍵SQL語句的編寫,演練-分組和聚合函式的組合使用,將查詢結果插入到其它表中,使用連線更新表中某個欄位資料。建立表並給某個欄位新增資料,修改goods表結構,PyMySQL的使用。事務,索引。閉包,閉包的使用,修改閉包內使用的外部變數,裝飾器,裝飾器的使用,通用裝飾器的使用,多個裝飾器的使用。帶有引數的裝飾器,類裝飾器的使用,web框架概述,框架程式開發,模板替換功能開發。路由列表功能開發,裝飾器方式的新增路由,顯示股票資訊頁面的開發,個人中心資料介面的開發,ajax請求資料渲染個人中心頁面。logging日誌,property屬性。with語句和上下文管理器,生成器的建立方式。深複製和淺複製,正規表示式的概述,re模組介紹,匹配單個字元。壓縮和解壓縮命令,檔案許可權命令,獲取管理員許可權的相關命令,使用者相關操作,使用者組相關操作,遠端登入、遠端複製命令。匹配多個字元,匹配開頭和結尾,匹配分組。編輯器 vim,軟體安裝,軟體解除安裝,多工的介紹,程序,多程序的使用。獲取程序編號,程序執行帶有引數的任務,程序的注意點,執行緒,多執行緒的使用。執行緒執行帶有引數的任務,執行緒的注意點,互斥鎖。死鎖,程序和執行緒的對比,IP 地址的介紹,埠和埠號的介紹,TCP 的介紹,socket 的介紹。TCP 網路應用程式開發流程,TCP 客戶端程式開發,TCP服務端程式開發,TCP網路應用程式的注意點。案例-多工版TCP服務端程式開發,socket之send和recv原理剖析,HTTP 協議,URL,檢視HTTP協議的通訊過程。
全套筆記資料程式碼移步: 前往gitee倉庫檢視
感興趣的小夥伴可以自取哦,歡迎大家點贊轉發~
全套教程部分目錄:
部分檔案圖片:
獲取程序編號
學習目標
- 能夠知道如果獲取程序編號
1. 獲取程序編號的目的
獲取程序編號的目的是驗證主程序和子程序的關係,可以得知子程序是由那個主程序建立出來的。
獲取程序編號的兩種操作
- 獲取當前程序編號
- 獲取當前父程序編號
2. 獲取當前程序編號
os.getpid() 表示獲取當前程序編號
示例程式碼:
import multiprocessing
import time
import os
# 跳舞任務
def dance():
# 獲取當前程序的編號
print("dance:", os.getpid())
# 獲取當前程序
print("dance:", multiprocessing.current_process())
for i in range(5):
print("跳舞中...")
time.sleep(0.2)
# 擴充套件:根據程序編號殺死指定程序
os.kill(os.getpid(), 9)
# 唱歌任務
def sing():
# 獲取當前程序的編號
print("sing:", os.getpid())
# 獲取當前程序
print("sing:", multiprocessing.current_process())
for i in range(5):
print("唱歌中...")
time.sleep(0.2)
if __name__ == '__main__':
# 獲取當前程序的編號
print("main:", os.getpid())
# 獲取當前程序
print("main:", multiprocessing.current_process())
# 建立跳舞的子程序
# group: 表示程序組,目前只能使用None
# target: 表示執行的目標任務名(函式名、方法名)
# name: 程序名稱, 預設是Process-1, .....
dance_process = multiprocessing.Process(target=dance, name="myprocess1")
sing_process = multiprocessing.Process(target=sing)
# 啟動子程序執行對應的任務
dance_process.start()
sing_process.start()
執行結果:
main: 70763
main: <_MainProcess(MainProcess, started)>
dance: 70768
dance: <Process(myprocess1, started)>
跳舞中...
sing: 70769
sing: <Process(Process-2, started)>
唱歌中...
唱歌中...
唱歌中...
唱歌中...
唱歌中...
3. 獲取當前父程序編號
os.getppid() 表示獲取當前父程序編號
示例程式碼:
import multiprocessing
import time
import os
# 跳舞任務
def dance():
# 獲取當前程序的編號
print("dance:", os.getpid())
# 獲取當前程序
print("dance:", multiprocessing.current_process())
# 獲取父程序的編號
print("dance的父程序編號:", os.getppid())
for i in range(5):
print("跳舞中...")
time.sleep(0.2)
# 擴充套件:根據程序編號殺死指定程序
os.kill(os.getpid(), 9)
# 唱歌任務
def sing():
# 獲取當前程序的編號
print("sing:", os.getpid())
# 獲取當前程序
print("sing:", multiprocessing.current_process())
# 獲取父程序的編號
print("sing的父程序編號:", os.getppid())
for i in range(5):
print("唱歌中...")
time.sleep(0.2)
if __name__ == '__main__':
# 獲取當前程序的編號
print("main:", os.getpid())
# 獲取當前程序
print("main:", multiprocessing.current_process())
# 建立跳舞的子程序
# group: 表示程序組,目前只能使用None
# target: 表示執行的目標任務名(函式名、方法名)
# name: 程序名稱, 預設是Process-1, .....
dance_process = multiprocessing.Process(target=dance, name="myprocess1")
sing_process = multiprocessing.Process(target=sing)
# 啟動子程序執行對應的任務
dance_process.start()
sing_process.start()
main: 70860
main: <_MainProcess(MainProcess, started)>
dance: 70861
dance: <Process(myprocess1, started)>
dance的父程序編號: 70860
跳舞中...
sing: 70862
sing: <Process(Process-2, started)>
sing的父程序編號: 70860
唱歌中...
唱歌中...
唱歌中...
唱歌中...
唱歌中...
4. 小結
-
獲取當前程序編號
- os.getpid()
-
獲取當前父程序編號
- os.getppid()
-
獲取程序編號可以檢視父子程序的關係
程序執行帶有引數的任務
學習目標
- 能夠寫出程序執行帶有引數的任務
1. 程序執行帶有引數的任務的介紹
前面我們使用程序執行的任務是沒有引數的,假如我們使用程序執行的任務帶有引數,如何給函式傳參呢?
Process類執行任務並給任務傳引數有兩種方式:
- args 表示以元組的方式給執行任務傳參
- kwargs 表示以字典方式給執行任務傳參
2. args引數的使用
示例程式碼:
import multiprocessing
import time
# 帶有引數的任務
def task(count):
for i in range(count):
print("任務執行中..")
time.sleep(0.2)
else:
print("任務執行完成")
if __name__ == '__main__':
# 建立子程序
# args: 以元組的方式給任務傳入引數
sub_process = multiprocessing.Process(target=task, args=(5,))
sub_process.start()
執行結果:
任務執行中..
任務執行中..
任務執行中..
任務執行中..
任務執行中..
任務執行完成
3. kwargs引數的使用
示例程式碼:
import multiprocessing
import time
# 帶有引數的任務
def task(count):
for i in range(count):
print("任務執行中..")
time.sleep(0.2)
else:
print("任務執行完成")
if __name__ == '__main__':
# 建立子程序
# kwargs: 表示以字典方式傳入引數
sub_process = multiprocessing.Process(target=task, kwargs={"count": 3})
sub_process.start()
執行結果:
任務執行中..
任務執行中..
任務執行中..
任務執行完成
4. 小結
-
程序執行任務並傳參有兩種方式:
- 元組方式傳參(args): 元組方式傳參一定要和引數的順序保持一致。
- 字典方式傳參(kwargs): 字典方式傳參字典中的key一定要和引數名保持一致。
程序的注意點
學習目標
- 能夠說出程序的注意點
1. 程序的注意點介紹
- 程序之間不共享全域性變數
- 主程序會等待所有的子程序執行結束再結束
2. 程序之間不共享全域性變數
import multiprocessing
import time
# 定義全域性變數
g_list = list()
# 新增資料的任務
def add_data():
for i in range(5):
g_list.append(i)
print("add:", i)
time.sleep(0.2)
# 程式碼執行到此,說明資料新增完成
print("add_data:", g_list)
def read_data():
print("read_data", g_list)
if __name__ == '__main__':
# 建立新增資料的子程序
add_data_process = multiprocessing.Process(target=add_data)
# 建立讀取資料的子程序
read_data_process = multiprocessing.Process(target=read_data)
# 啟動子程序執行對應的任務
add_data_process.start()
# 主程序等待新增資料的子程序執行完成以後程式再繼續往下執行,讀取資料
add_data_process.join()
read_data_process.start()
print("main:", g_list)
# 總結: 多程序之間不共享全域性變數
執行結果:
add: 0
add: 1
add: 2
add: 3
add: 4
add_data: [0, 1, 2, 3, 4]
main: []
read_data []
程序之間不共享全域性變數的解釋效果圖:
3. 程序之間不共享全域性變數的小結
- 建立子程序會對主程序資源進行複製,也就是說子程序是主程序的一個副本,好比是一對雙胞胎,之所以程序之間不共享全域性變數,是因為操作的不是同一個程序裡面的全域性變數,只不過不同程序裡面的全域性變數名字相同而已。
4. 主程序會等待所有的子程序執行結束再結束
假如我們現在建立一個子程序,這個子程序執行完大概需要2秒鐘,現在讓主程序執行0.5秒鐘就退出程式,檢視一下執行結果,示例程式碼如下:
import multiprocessing
import time
# 定義程序所需要執行的任務
def task():
for i in range(10):
print("任務執行中...")
time.sleep(0.2)
if __name__ == '__main__':
# 建立子程序
sub_process = multiprocessing.Process(target=task)
sub_process.start()
# 主程序延時0.5秒鐘
time.sleep(0.5)
print("over")
exit()
# 總結: 主程序會等待所有的子程序執行完成以後程式再退出
執行結果:
任務執行中...
任務執行中...
任務執行中...
over
任務執行中...
任務執行中...
任務執行中...
任務執行中...
任務執行中...
任務執行中...
任務執行中...
說明:
透過上面程式碼的執行結果,我們可以得知: 主程序會等待所有的子程序執行結束再結束
假如我們就讓主程序執行0.5秒鐘,子程序就銷燬不再執行,那怎麼辦呢?
- 我們可以設定守護主程序 或者 在主程序退出之前 讓子程序銷燬
守護主程序:
- 守護主程序就是主程序退出子程序銷燬不再執行
子程序銷燬:
- 子程序執行結束
保證主程序正常退出的示例程式碼:
import multiprocessing
import time
# 定義程序所需要執行的任務
def task():
for i in range(10):
print("任務執行中...")
time.sleep(0.2)
if __name__ == '__main__':
# 建立子程序
sub_process = multiprocessing.Process(target=task)
# 設定守護主程序,主程序退出子程序直接銷燬,子程序的生命週期依賴與主程序
# sub_process.daemon = True
sub_process.start()
time.sleep(0.5)
print("over")
# 讓子程序銷燬
sub_process.terminate()
exit()
# 總結: 主程序會等待所有的子程序執行完成以後程式再退出
# 如果想要主程序退出子程序銷燬,可以設定守護主程序或者在主程序退出之前讓子程序銷燬
執行結果:
任務執行中...
任務執行中...
任務執行中...
over
5. 主程序會等待所有的子程序執行結束再結束的小結
- 為了保證子程序能夠正常的執行,主程序會等所有的子程序執行完成以後再銷燬,設定守護主程序的目的是主程序退出子程序銷燬,不讓主程序再等待子程序去執行。
- 設定守護主程序方式: 子程序物件.daemon = True
- 銷燬子程序方式: 子程序物件.terminate()
執行緒
學習目標
能夠知道執行緒的作用
1. 執行緒的介紹
在Python中,想要實現多工除了使用程序,還可以使用執行緒來完成,執行緒是實現多工的另外一種方式。
2. 執行緒的概念
執行緒是程序中執行程式碼的一個分支,每個執行分支(執行緒)要想工作執行程式碼需要cpu進行排程 ,也就是說執行緒是cpu排程的基本單位,每個程序至少都有一個執行緒,而這個執行緒就是我們通常說的主執行緒。
3. 執行緒的作用
多執行緒可以完成多工
多執行緒效果圖:
4. 小結
- 執行緒是Python程式中實現多工的另外一種方式,執行緒的執行需要cpu排程來完成。
多執行緒的使用
學習目標
- 能夠使用多執行緒完成多工
1. 匯入執行緒模組
#匯入執行緒模組
import threading
2. 執行緒類Thread引數說明
Thread([group [, target [, name [, args [, kwargs]]]]])
- group: 執行緒組,目前只能使用None
- target: 執行的目標任務名
- args: 以元組的方式給執行任務傳參
- kwargs: 以字典方式給執行任務傳參
- name: 執行緒名,一般不用設定
3. 啟動執行緒
啟動執行緒使用start方法
4. 多執行緒完成多工的程式碼
import threading
import time
# 唱歌任務
def sing():
# 擴充套件: 獲取當前執行緒
# print("sing當前執行的執行緒為:", threading.current_thread())
for i in range(3):
print("正在唱歌...%d" % i)
time.sleep(1)
# 跳舞任務
def dance():
# 擴充套件: 獲取當前執行緒
# print("dance當前執行的執行緒為:", threading.current_thread())
for i in range(3):
print("正在跳舞...%d" % i)
time.sleep(1)
if __name__ == '__main__':
# 擴充套件: 獲取當前執行緒
# print("當前執行的執行緒為:", threading.current_thread())
# 建立唱歌的執行緒
# target: 執行緒執行的函式名
sing_thread = threading.Thread(target=sing)
# 建立跳舞的執行緒
dance_thread = threading.Thread(target=dance)
# 開啟執行緒
sing_thread.start()
dance_thread.start()
執行結果:
正在唱歌...0
正在跳舞...0
正在唱歌...1
正在跳舞...1
正在唱歌...2
正在跳舞...2
5. 小結
-
匯入執行緒模組
- import threading
-
建立子執行緒並指定執行的任務
- sub_thread = threading.Thread(target=任務名)
-
啟動執行緒執行任務
- sub_thread.start()