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 的玩法吧!