Python 作为一门简洁又强大的编程语言,在多线程编程、函数增强、计算机视觉、文本处理等多个领域都有着广泛的应用。本文将结合几个实用的代码案例,带你上手 Python 的多线程、装饰器、OpenCV 颜色检测和正则表达式匹配,从基础应用到实际场景,解锁 Python 的多样玩法。
一、多线程编程:让程序 "并行" 起来
在 Python 中,threading库是实现多线程的核心工具,它能让程序在执行耗时操作时,不阻塞主线程,提升运行效率。
1. 基础多线程示例
先看一个简单的多线程执行函数的例子:
python
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 次被装饰函数,就执行一次指定函数":
python
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. 颜色检测核心代码
python
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 位纯数字。
python
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 的玩法吧!
