news 2026/4/27 1:18:14

玩转 Python:多线程、装饰器、视觉检测与正则匹配实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
玩转 Python:多线程、装饰器、视觉检测与正则匹配实战

Python 作为一门简洁又强大的编程语言,在多线程编程、函数增强、计算机视觉、文本处理等多个领域都有着广泛的应用。本文将结合几个实用的代码案例,带你上手 Python 的多线程、装饰器、OpenCV 颜色检测和正则表达式匹配,从基础应用到实际场景,解锁 Python 的多样玩法。

一、多线程编程:让程序 “并行” 起来

在 Python 中,threading库是实现多线程的核心工具,它能让程序在执行耗时操作时,不阻塞主线程,提升运行效率。

1. 基础多线程示例

先看一个简单的多线程执行函数的例子:

import threading import time def worker(): print('线程开始执行') for i in range(5): print(f'线程正在工作: {i}') print('线程执行完毕') thread = threading.Thread(target=worker) thread.start() print('****主线程继续执行****') def worker(name): print(f'{name} 线程开始执行') for i in range(5): print(f'{name} 正在工作: {i}') time.sleep(0.5) print(f'{name} 线程执行完毕') thread1 = threading.Thread(target=worker, args=('线程1',)) thread2 = threading.Thread(target=worker, args=('线程2',)) thread1.start() thread2.start() print('****主线继续执行****')

运行这段代码,你会发现 “线程 1” 和 “线程 2” 交替输出内容,主线程也不会等待子线程完成才执行后续代码,这就是多线程的 “并行” 特性 —— 多个线程在 CPU 中交替执行,看起来像是同时运行。

2. 多线程执行不同耗时任务

我们还可以让不同线程执行不同耗时的任务,比如模拟 “等待不同时间后输出结果”:

def run(t): time.sleep(t) print(f'我等了{t}秒') t1 = threading.Thread(target=run, args=(3,)) t2 = threading.Thread(target=run, args=(6,)) t1.start() print('开始计时') t2.start()

执行后,主线程先打印 “开始计时”,3 秒后t1线程输出 “我等了 3 秒”,6 秒后t2线程输出 “我等了 6 秒”,完美体现了多线程处理异步任务的优势。

二、装饰器:给函数 “加 buff”

装饰器是 Python 的语法糖,能在不修改函数源码的前提下,为函数增加额外功能。比如实现 “每调用 N 次函数,执行指定操作” 的需求。

1. 自定义装饰器示例

下面的装饰器execute_after_n_calls,能实现 “每调用 3 次被装饰函数,就执行一次指定函数”:

import re def execute_after_n_calls(n, w2set): def decorator(func): def wrapper(*args, **kwargs): # 统计函数调用次数 wrapper.count += 1 # 执行原函数并获取结果 result = func(*args, **kwargs) # 每调用n次,执行w2set函数 if wrapper.count % n == 0: w2set() return result # 初始化调用次数 wrapper.count = 0 return wrapper return decorator # 被触发的函数 def bb(): print('b') # 用装饰器增强aa函数 @execute_after_n_calls(3, bb) def aa(): print('a') # 测试调用 for _ in range(6): aa()

运行结果会依次输出:a a a b a a a b。装饰器通过闭包特性,巧妙地统计函数调用次数,实现了函数功能的扩展,这种方式在日志记录、性能统计、权限校验等场景中非常实用。

三、OpenCV 实战:颜色检测识别牛皮纸箱

利用 OpenCV 和 NumPy,我们可以实现基于颜色的物体检测,比如识别摄像头画面中的牛皮纸箱(通过匹配棕色色域)。

1. 颜色检测核心代码
import cv2 import numpy as np # 打开摄像头 cap = cv2.VideoCapture(0) while True: try: # 读取帧 ret, frame3 = cap.read() # 转换为HSV色彩空间(更适合颜色检测) hsv_image = cv2.cvtColor(frame3, cv2.COLOR_BGR2HSV) # 定义棕色的HSV范围 lower_brown = np.array([10, 30, 30]) upper_brown = np.array([30, 255, 255]) # 创建掩码(只保留棕色区域) mask = cv2.inRange(hsv_image, lower_brown, upper_brown) # 计算棕色像素占比 white_pixels = np.sum(mask == 255) total_pixels = mask.shape[0] * mask.shape[1] color_percentage = (white_pixels / total_pixels) * 100 # 占比≥20%时判定为检测到牛皮纸箱 if color_percentage >= 20: print('检测到牛皮纸箱') # 显示画面 cv2.imshow('mask', mask) cv2.imshow('Filtered Image1', frame3) # 按ESC退出 if cv2.waitKey(1) == 27: break except: pass # 释放资源 cap.release() cv2.destroyAllWindows()
2. 关键知识点
  • HSV 色彩空间:相比 RGB,HSV 更能抵抗光照变化的影响,是颜色检测的首选;
  • 掩码(mask):通过cv2.inRange筛选出指定颜色范围的像素,白色(255)为匹配区域,黑色(0)为不匹配;
  • 像素占比计算:通过统计匹配像素的数量,判断画面中目标颜色的占比,实现物体识别。

四、正则表达式:精准匹配文本内容

正则表达式是处理文本的 “利器”,能快速筛选出符合规则的字符串,比如匹配特定格式的编号、密码等。

1. 多规则文本匹配示例

下面的代码实现了两种规则的字符串匹配:① 包含字母 + 数字,长度 2-8 且可含连字符;② 4-7 位纯数字。

import re def process_string(input_string): aa = [] parts = input_string.split() # 规则1:含字母+数字,长度2-8,可含- pattern_alphanumeric = re.compile(r'^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d-]{2,8}$') # 规则2:4-7位纯数字 pattern_at_least_two_digits = re.compile(r'^\d{4,7}$') for part in parts: if pattern_alphanumeric.match(part) or pattern_at_least_two_digits.match(part): aa.append(part) return aa # 测试用例 test_list = ['Aceite p04476', 'sdighsg', 's4967xl', 'v0-4985', '123', '1234568956', '45825'] result = [] for s in test_list: result.extend(process_string(s)) print('匹配结果:', result)

运行结果会输出:['p04476', 's4967xl', 'v0-4985', '45825'],精准筛选出符合规则的字符串。正则表达式的优势在于灵活定义匹配规则,在数据清洗、文本解析、表单验证等场景中必不可少。

五、总结

本文从四个不同的维度展示了 Python 的实战应用:

  • 多线程:利用threading实现并行任务,提升程序执行效率;
  • 装饰器:通过闭包扩展函数功能,让代码更简洁、易维护;
  • OpenCV 颜色检测:结合 HSV 色彩空间实现物体识别,落地计算机视觉小应用;
  • 正则表达式:精准匹配文本规则,高效处理文本数据。

Python 的魅力在于其丰富的库和灵活的语法,这些基础实战案例不仅能帮助你掌握核心知识点,也能为后续的复杂项目打下基础。不妨动手运行代码,尝试修改参数和规则,探索更多 Python 的玩法吧!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 1:05:18

网球发球动作及发力指导

网球发球动作及发力指导 本文将系统讲解网球发球(Serve)的完整技术动作与发力原理,适用于初中级球员自学或教练教学参考。 目录 发球概述与技术分类 准备姿势与握拍 发球动作四阶段分解 动力链与发力原理 平击、上旋与切削发球 常见错误与纠正方法 针对性训练计划 核心要点总…

作者头像 李华
网站建设 2026/4/27 1:04:20

刚开始做 GEO:最容易做错的动作与起步误区拆解

GEO 起步阶段,不建议先按“发多少内容、测多少平台、截多少图”做验收。 更合适的第一轮目标是:固定一批真实问题,检查公开材料能不能被 AI 正确组织成回答。讲不准,先修材料;讲得泛,先补边界;讲…

作者头像 李华
网站建设 2026/4/27 0:56:20

Lichee RV-86开发板:RISC-V在智能家居与HMI的应用

1. Lichee RV-86 开发板深度解析:一款面向智能家居与HMI的RISC-V解决方案 去年11月,Sipeed在推出搭载全志D1 RISC-V处理器的Lichee RV模块时,就预告了这款Lichee RV-86开发板。如今这款产品已经正式上市数月,它配备4英寸480480或7…

作者头像 李华
网站建设 2026/4/27 0:56:00

cv_unet_image-colorization开源工具链整合:与FFmpeg/GIMP/Blender协同工作流

cv_unet_image-colorization开源工具链整合:与FFmpeg/GIMP/Blender协同工作流 1. 工具概述与核心价值 在数字影像处理领域,黑白照片上色一直是个既有挑战又有巨大价值的技术方向。基于ModelScope的cv_unet_image-colorization模型开发的本地黑白照片上…

作者头像 李华
网站建设 2026/4/27 0:54:41

基于潜在扩散模型的加密流量数据集扩充方法

基于潜在扩散模型的加密流量数据集扩充方法 摘要: 加密流量分类在网络安全监控与入侵检测中扮演着关键角色,然而加密流量数据集普遍存在的类别不平衡问题严重制约了分类模型的泛化性能。本文提出一种基于潜在扩散模型的加密流量数据集扩充方法,通过构建条件潜在扩散模型对少…

作者头像 李华