文章目錄
- 一、閉包
- 1.什么是閉包
- 2.優缺點
- 3.nonlocal關鍵字
- 二、裝飾器
- 1.什么是裝飾器
- 2.舉例
- 3.傳統方式
- 4.裝飾器方式
- 5.語法糖寫法
- 三、多線程
- 1.線程參數
- 2.多線程編程
- 四、網絡編程
- 1.Socket服務端編程
- 2.Socket客戶端編程
「章節總覽」
?
??????【2024速通python之python基礎 https://blog.csdn.net/weixin_45404884/article/details/138578955】
??????【2024速通python之python進階 https://blog.csdn.net/weixin_45404884/article/details/138663338】
??????【2024速通python之python高階 https://blog.csdn.net/weixin_45404884/article/details/138810133】
??????【2024速通python之python面向對象https://blog.csdn.net/weixin_45404884/article/details/139473507】
??????【2024速通python之python高階技巧https://blog.csdn.net/weixin_45404884/article/details/139521584】
一、閉包
1.什么是閉包
- 定義雙層嵌套函數, 內層函數可以訪問外層函數的變量
- 將內存函數作為外層函數的返回,此內層函數就是閉包函數
這里的inner就是閉包函數,如果需要修改外層函數的outerNum變量,則需要用nonlocal關鍵字來聲明
def outer(outerNum):def inner(innerNum):nonlocal outerNumouterNum = outerNum + 1print(f"Inner function num is {innerNum} and outer function num is {outerNum}")return innerout = outer(100)
out(200)
2.優缺點
-
優點,使用閉包可以讓我們得到:
無需定義全局變量即可實現通過函數,持續的訪問、修改某個值
閉包使用的變量的所用于在函數內,難以被錯誤的調用修改 -
缺點:
由于內部函數持續引用外部函數的值,所以會導致這一部分內存空間不被釋放,一直占用內存
3.nonlocal關鍵字
在閉包函數(內部函數中)想要修改外部函數的變量值,需要用nonlocal聲明這個外部變量
二、裝飾器
1.什么是裝飾器
裝飾器其實也是一種閉包, 其功能就是在不破壞目標函數原有的代碼和功能的前提下,為目標函數增加新功能。
2.舉例
將下面的睡覺函數,在調用sleep前后輸出,“我打算睡覺了”、“我起床了”
def sleep():time.sleep(2)print("睡眠中....")sleep()
3.傳統方式
def sleep():time.sleep(2)print("睡眠中....")print("我打算睡覺了")
sleep()
print("我起床了")
4.裝飾器方式
def sleep():time.sleep(2)print("睡眠中....")def outer(func):def inner():print("我打算睡覺了")func()print("我起床了")return innerfn = outer(sleep)
fn()
5.語法糖寫法
簡化了調用,增加@outer注解在調用方法上,相當于java中為某個方法增加切面
def outer(func):def inner():print("我打算睡覺了")func()print("我起床了")return inner@outer
def sleep():time.sleep(2)print("睡眠中....")sleep()
三、多線程
1.線程參數
Python的多線程可以通過threading模塊來實現。
- target:執行的目標任務名稱
- args:以元組的方式給執行任務傳參
- name:線程名
- daemon:是否設置為守護線程
- kwargs:以字典方式傳參
2.多線程編程
def sing(msg):print(f"我在唱歌。。。{msg}")def dance(msg):print(f"我在跳舞。。。{msg}")import threadingthread_obj1 = threading.Thread(target=sing, args=('開心!',), name='sing')thread_obj2 = threading.Thread(target=dance, args=('快樂!',), name='dance')thread_obj1.start()
thread_obj2.start()
四、網絡編程
1.Socket服務端編程
主要分為如下幾個步驟:
- 創建socket對象
- 綁定socket_server到指定IP和地址
- 服務端開始監聽端口
- 接收客戶端連接,獲得連接對象
- 客戶端連接后,通過recv方法,接收客戶端發送的消息
- 通過conn(客戶端當次連接對象),調用send方法可以回復消息
- conn(客戶端當次連接對象)和socket_server對象調用close方法,關閉連接
代碼示例:
import socketsocket_server = socket.socket()
socket_server.bind(('127.0.0.1', 8888))
socket_server.listen()conn, addr = socket_server.accept()
print('Connected by', addr)
while True:data = conn.recv(1024).decode('utf-8')if data == 'exit':breakprint(f"接收到的客戶端數據: {data}")conn.send("你好,我是服務端".encode('utf-8'))conn.close()
socket_server.close()
2.Socket客戶端編程
主要分為如下幾個步驟:
- 創建socket對象
- 連接到服務端
- 發送消息
- 接收返回消息
- 關閉鏈接
代碼示例:
import socketsocket_client = socket.socket()
socket_client.connect(('127.0.0.1', 8888))while True:send_msg = input("輸入要發送的消息:")if send_msg == "exit":breaksocket_client.send(send_msg.encode("utf-8"))recv_msg = socket_client.recv(1024)print("服務端回復的消息:", recv_msg.decode("utf-8"))socket_client.close()