【python】基础开发技巧

简介: 【python】基础开发技巧

闭包

一:闭包的定义:

目的:保证变量不会因为外部函数调用而销毁。

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']


目录
相关文章
|
19天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
【4月更文挑战第9天】本文强调了Python开发中性能优化和代码审查的重要性。性能优化包括选择合适数据结构、使用生成器和避免全局变量,而代码审查涉及遵循编码规范、使用静态代码分析工具和编写单元测试。这些实践能提升代码效率和可维护性,促进团队协作。
|
2月前
|
前端开发 关系型数据库 MySQL
基于python+django+vue.js开发的社区养老管理系统
基于python+django+vue.js开发的社区养老管理系统
97 1
|
2月前
|
机器学习/深度学习 设计模式 Java
Python潮流周刊#10:Twitter 的强敌 Threads 是用 Python 开发的!
Python潮流周刊#10:Twitter 的强敌 Threads 是用 Python 开发的!
31 2
|
4天前
|
数据采集 存储 人工智能
【Python+微信】【企业微信开发入坑指北】4. 企业微信接入GPT,只需一个URL,自动获取文章总结
【Python+微信】【企业微信开发入坑指北】4. 企业微信接入GPT,只需一个URL,自动获取文章总结
18 0
|
4天前
|
人工智能 机器人 API
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
【Python+微信】【企业微信开发入坑指北】3. 如何利用企业微信API给微信群推送消息
8 0
|
4天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
9 0
|
9天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
13天前
|
前端开发 数据挖掘 API
使用Python中的Flask框架进行Web应用开发
【4月更文挑战第15天】在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架。它简洁、灵活且易于扩展,使得开发者能够快速地构建出高质量的Web应用。本文将深入探讨Flask框架的核心特性、使用方法以及在实际开发中的应用。
|
16天前
|
JavaScript 前端开发 关系型数据库
金融技术解决方案:用Python和Vue开发加密货币交易平台
【4月更文挑战第11天】本文介绍了如何使用Python和Vue.js构建加密货币交易平台。首先确保安装了Python、Node.js、数据库系统和Git。后端可选择Flask或Django框架,通过RESTful API处理交易。前端利用Vue.js、Vuex和Vue Router创建用户友好的界面,并用Axios与后端通信。这种架构促进团队协作,提升代码质量和平台功能。
|
18天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。