如何让Python自定义函数中布尔可选参数的所有组合生效?
优化文本清洗函数的分支逻辑
原函数通过大量多分支判断处理四个布尔参数的组合,不仅代码冗余,还容易遗漏参数组合。更高效的方式是按处理顺序逐步执行对应操作,每个步骤仅在参数为True时触发,自动基于前一步的结果继续处理,无需枚举所有组合。
优化步骤说明
- 把依赖库的导入和初始化移到函数外:避免每次调用函数都重复下载nltk资源、重复初始化工具类,提升性能。
- 按逻辑顺序拆分处理步骤:按照「去除标点 → 转小写 → 分词 → 移除停用词 → 词形还原」的顺序,逐个判断参数是否开启对应操作,每一步都基于上一步的输出处理。
- 统一数据格式流转:处理过程中保持数据格式的一致性(比如先处理文本,分词后用列表操作,最后再拼接成字符串返回)。
优化后的完整代码
import re import nltk from nltk.corpus import stopwords from nltk.stem import WordNetLemmatizer # 提前下载并初始化资源,避免重复操作 nltk.download('stopwords', quiet=True) nltk.download('wordnet', quiet=True) # 词形还原依赖wordnet资源 eng_stops = set(stopwords.words('english')) lemmatizer = WordNetLemmatizer() def clean(text, punct=True, lowercase=True, stopword=True, lemma=True): processed = text # 1. 去除标点 if punct: processed = re.sub(r'[^\w\s]', '', processed) # 2. 转小写 if lowercase: processed = processed.lower() # 3. 分词(词级操作的前置步骤) words = processed.split() # 4. 移除停用词 if stopword: words = [w for w in words if w not in eng_stops] # 5. 词形还原 if lemma: words = [lemmatizer.lemmatize(word) for word in words] return ' '.join(words)
方案优势
- 覆盖所有参数组合:不管四个布尔参数怎么组合,每个操作仅在对应参数为
True时执行,自动继承前序处理结果,无需手写16种分支。 - 代码简洁易维护:每个处理逻辑独立,后续要新增或修改操作(比如增加词干提取),只需添加新的判断步骤即可。
- 性能提升:资源初始化移到函数外,避免重复下载和实例化,减少不必要的开销。
内容的提问来源于stack exchange,提问作者Bella
相关产品推荐
相关产品推荐

