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


目录
相关文章
|
23天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
【10月更文挑战第12天】本文探讨了Python开发中性能优化和代码审查的重要性,介绍了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
31 5
|
29天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
【10月更文挑战第6天】本文探讨了性能优化和代码审查在Python开发中的重要性,提供了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
53 5
|
8天前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
84 44
|
3天前
|
JSON 安全 API
如何使用Python开发API接口?
在现代软件开发中,API(应用程序编程接口)用于不同软件组件之间的通信和数据交换,实现系统互操作性。Python因其简单易用和强大功能,成为开发API的热门选择。本文详细介绍了Python开发API的基础知识、优势、实现方式(如Flask和Django框架)、实战示例及注意事项,帮助读者掌握高效、安全的API开发技巧。
21 3
如何使用Python开发API接口?
|
2天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
9天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
42 7
|
11天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
探讨了Python开发中性能优化和代码审查的重要性,介绍了选择合适数据结构、使用生成器、避免全局变量等性能优化技巧,以及遵守编码规范、使用静态代码分析工具、编写单元测试等代码审查方法,旨在帮助开发者提升开发效率和代码质量。
34 8
|
7天前
|
算法 测试技术 开发者
性能优化与代码审查:提升Python开发效率
性能优化与代码审查:提升Python开发效率
17 1
|
9天前
|
安全 数据库 开发者
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第26天】本文详细介绍了如何在Django框架下进行全栈开发,包括环境安装与配置、创建项目和应用、定义模型类、运行数据库迁移、创建视图和URL映射、编写模板以及启动开发服务器等步骤,并通过示例代码展示了具体实现过程。
26 2
|
10天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
14 3