闭包
一:闭包的定义:
目的:保证变量不会因为外部函数调用而销毁。
1:在函数嵌套的前提下,内部函数使用了外部函数的变量,外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。
2:闭包的形成条件:
函数嵌套 //内部函数使用了外部函数的变量 // 外部函数返回了内部函数对象。
3:闭包的作用:闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁。
- 基础代码
1. def out(num1): 2. def inner(num2): 3. result = num1 + num2; 4. print("结果是:",result) 5. return inner 6. f = out(1) 7. f(2) 8. f(3)
- nonlocal
1. def func_out(num1): 2. def func_inner(num2): 3. nonlocal num1 4. num1+=num2 5. print("结果是:", num1) 6. return func_inner 7. f = func_out(66) 8. f(2) 9. f(2) 10. f(2) 11. f(2)
结果是: 68
结果是: 70
结果是: 72
结果是: 74
装饰器
特殊的闭包
区别是只有一个变量,并且变量是函数类型。
1:定义:给已有函数增加额外功能的函数。
2:功能特点:
不修改已有函数的源代码
不修改已有函数的调用方式
给已有函数增加额外的功能
- 基础代码
1. def check(fn): 2. def inner(): 3. print("正在登录") 4. fn() 5. print('评论成功') 6. return inner 7. def comment(): 8. print("评论内容") 9. comment = check(comment) 10. comment()
正在登录
评论内容
评论成功
- 语法糖写法
@修饰函数
1. def check(fn): 2. print("装饰器函数执行了") 3. def inner(): 4. print("正在登录") 5. fn() 6. print('评论成功') 7. return inner 8. 9. @check 10. def comment(): 11. print("评论内容") 12. comment()
装饰器函数执行了
正在登录
评论内容
评论成功
- 利用修饰器计算函数的执行时间
1. import time 2. def out_hello(fn): 3. def inner_hello(): 4. before = time.time() 5. fn() 6. after = time.time() 7. print("函数所用时间是:", after-before) 8. return inner_hello 9. @out_hello 10. def print_hello(): 11. for i in range(10000): 12. print("hello:%d" % i) 13. ph = print_hello()
设计模式
- 单例模式
使用模块
1. class coleak(): 2. pass 3. new_coleak = coleak() 4. print(new_coleak)
1. from tools import new_coleak 2. s1=new_coleak 3. s2=new_coleak 4. print(id(s2)) 5. print(id(s1))
<tools.coleak object at 0x000002002CEA94B0>
2199776826544
2199776826544
- 工厂模式
1. class person(): 2. pass 3. class teacher(person): 4. pass 5. class worker(person): 6. pass 7. class student(person): 8. pass 9. class person_factory(): 10. def get_person(self,ptype): 11. if ptype=='w': 12. return worker() 13. if ptype=='s': 14. return student() 15. if ptype=='t': 16. return teacher() 17. person=person_factory() 18. Worker=person.get_person('w') 19. Student=person.get_person('s') 20. Teacher=person.get_person('t')
多线程、进程
【python】多任务编程之线程、进程知识点详细总结_coleak的博客-CSDN博客
Python3.10中,set.Daemon(aTrue)这种写法已经弃用了,正确的写法是.daemon=True
举例:
t=threading.Thread(target=h)
t.daemon=True
t.start()
用法如下
1. import threading 2. import time 3. def test(): 4. while True: 5. print('执行ing...') 6. time.sleep(0.2) 7. if __name__ == '__main__': 8. p1=threading.Thread(target=test) 9. p1.daemon=True 10. p1.start() 11. time.sleep(0.5) 12. print('over!')
- 探究互斥锁对多线程速度的影响
单线程
1. import time 2. a=0 3. def test1(): 4. for i in range(10000000): 5. global a 6. a+=1 7. 8. def test2(): 9. for i in range(10000000): 10. global a 11. a+=1 12. 13. if __name__ == '__main__': 14. t1=time.time() 15. test1() 16. test2() 17. t2=time.time() 18. print(a) 19. print(t2-t1)
20000000
0.7716963291168213
多线程无互斥锁
1. import threading 2. import time 3. a=0 4. t2=0 5. t3=0 6. lock=threading.Lock() 7. def test1(): 8. global t2 9. # lock.acquire() 10. for i in range(10000000): 11. global a 12. a+=1 13. # lock.release() 14. t2 = time.time() 15. 16. def test2(): 17. global t3 18. # lock.acquire() 19. for i in range(10000000): 20. global a 21. a+=1 22. # lock.release() 23. t3 = time.time() 24. 25. if __name__ == '__main__': 26. p1=threading.Thread(target=test1) 27. p2=threading.Thread(target=test2) 28. t1=time.time() 29. p1.start() 30. p2.start() 31. time.sleep(5) 32. print(a) 33. print(t2-t1) 34. print(t3-t1)
20000000
0.7676887512207031
0.8026957511901855
多线程有互斥锁
1. import threading 2. import time 3. a=0 4. t2=0 5. t3=0 6. lock=threading.Lock() 7. def test1(): 8. global t2 9. for i in range(10000000): 10. lock.acquire() 11. global a 12. a+=1 13. lock.release() 14. t2 = time.time() 15. 16. def test2(): 17. global t3 18. for i in range(10000000): 19. lock.acquire() 20. global a 21. a+=1 22. lock.release() 23. t3 = time.time() 24. 25. if __name__ == '__main__': 26. p1=threading.Thread(target=test1) 27. p2=threading.Thread(target=test2) 28. t1=time.time() 29. p1.start() 30. p2.start() 31. time.sleep(6) 32. print(a) 33. print(t2-t1) 34. print(t3-t1)
20000000
5.125834941864014
5.105830669403076
1. import threading 2. import time 3. a=0 4. t2=0 5. t3=0 6. lock=threading.Lock() 7. def test1(): 8. global t2 9. lock.acquire() 10. for i in range(10000000): 11. global a 12. a+=1 13. lock.release() 14. t2 = time.time() 15. 16. def test2(): 17. global t3 18. lock.acquire() 19. for i in range(10000000): 20. global a 21. a+=1 22. lock.release() 23. t3 = time.time() 24. 25. if __name__ == '__main__': 26. p1=threading.Thread(target=test1) 27. p2=threading.Thread(target=test2) 28. t1=time.time() 29. p1.start() 30. p2.start() 31. time.sleep(6) 32. print(a) 33. print(t2-t1) 34. print(t3-t1)
20000000
0.4250822067260742
0.8749785423278809
网络通信编程
服务端开发
1. # 1. 导包 2. import socket 3. # 2. 建立连接 4. """ 5. family: 表示IP地址类型, 分为TPv4和IPv6。AF_INET表示ipv4 6. type:表示传输协议。SOCK_STREAM表示TCP协议 7. """ 8. server = socket.socket() 9. # 3. 绑定ip和端口 address 10. server.bind(("localhost",8999)) 11. # 3.1 设置端口可重用,不然服务器关闭后几分钟之后才会关闭绑定的端口 12. # 4. 设置监听,2为最大连接数 13. server.listen(2) 14. # 5. 等待客户端连接,收到连接后会返回一个专门服务与本次连接的socket和一个地址元组address 15. conn,address = server.accept() 16. print("客户端的信息是:", address) 17. while True: 18. # 6. 接收数据 19. recv_data = conn.recv(1024) 20. print("recv:",recv_data.decode("utf8")) 21. if recv_data.decode("utf8")=="exit": 22. conn.close() 23. break 24. # 7. 响应数据 25. msg=input("请输入回复信息") 26. if msg=="exit": 27. # 8. 关闭本次连接 28. conn.close() 29. break 30. conn.send(msg.encode("UTF-8")) 31. # 9.如果需要关闭服务器的话 32. server.close()
客户端开发
1. # 1.导包 2. import socket 3. 4. # 2.创建socket 5. 6. client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 7. 8. # 3. 和服务端建立连接 the address is a pair (host, port). 9. client.connect(("localhost", 8999)) 10. 11. # 4. 发送数据 bytes类型 12. client.send("Hello Server".encode("utf8")) 13. 14. while True: 15. # 5. 接收数据 16. recv_data = client.recv(1024) 17. if recv_data.decode("utf8")=="exit": 18. client.close() 19. break 20. # 6. 响应数据 21. print("recv:", recv_data.decode("utf8")) 22. msg=input("请输入回复信息") 23. if msg=="exit": 24. # 7. 关闭本次连接 25. client.close() 26. break 27. client.send(msg.encode("UTF-8"))
正则(RE)
【python】re解析和re模块_coleak的博客-CSDN博客
1. rrGET = re.compile(r"\$_GET\[\'(\w+)\']") # 匹配get参数 2. rrPOST = re.compile(r"\$_POST\[\'(\w+)\']") # 匹配post参数 3. for i in rrGET.findall(content): 4. r = session.get(url + "%s?%s=%s" % (fileName, i, "echo 'coleak';"))
递归
- 递归遍历文件
1. import os 2. def show_files(path): 3. file_list=[] 4. if os.path.exists(path): 5. for i in os.listdir(path): 6. new_path=f"{path}/{i}" 7. if os.path.isdir(new_path): 8. file_list+=show_files(new_path) 9. else: 10. file_list.append(new_path) 11. else: 12. print(f"制定的目录{path}不存在") 13. return [] 14. return file_list 15. 16. if __name__ == '__main__': 17. print(show_files("C:\\test"))
['C:\\test/1.txt', 'C:\\test/2.txt', 'C:\\test/3.txt', 'C:\\test/新建文件夹/10.txt', 'C:\\test/新建文件夹/9.txt', 'C:\\test/新建文件夹/新建文件夹/11.txt', 'C:\\test/新建文件夹 (2)/4.txt', 'C:\\test/新建文件夹 (2)/新建文件夹/8.txt', 'C:\\test/新建文件夹 (2)/新建文件夹 (2)/5.txt', 'C:\\test/新建文件夹 (2)/新建文件夹 (2)/新建文件夹/6.txt', 'C:\\test/新建文件夹 (2)/新建文件夹 (2)/新建文件夹/7.txt']