Python 3.6能否通过自修改代码简化重复特征计算逻辑?
无需自修改代码!用函数+循环优雅解决重复逻辑问题
首先明确说:你完全不需要写自修改代码来实现这个需求,自修改代码不仅可读性差、调试麻烦,对于你这种重复逻辑场景来说更是大材小用——Python有更简洁、易维护的方式来搞定,而且完全兼容Python 3.6版本。
先看你原来的代码:针对每个特征(ZCR、RMS、Tempo这些),都重复做四件事:取均值、取标准差、算下限、算上限。这种高度重复的模式,刚好可以用「函数封装+循环遍历」的方式完美解决。
最优解决方案:封装函数+字典存储结果
推荐用字典统一管理所有特征的计算结果,避免生成一堆零散的变量,代码更整洁也更易维护:
def get_feature_stats(summary_df, feature_name): # 把重复的四行逻辑封装成函数 mean_val = summary_df[feature_name][1] std_val = summary_df[feature_name][2] lower_limit = mean_val - std_val upper_limit = mean_val + std_val return mean_val, std_val, lower_limit, upper_limit # 列出所有需要处理的特征 target_features = ['ZCR', 'RMS', 'Tempo', 'Beat Spacing'] # 用字典存储所有特征的计算结果 feature_data = {} for feat in target_features: mean, std, lower, upper = get_feature_stats(sample_dataframe_summary, feat) feature_data[feat] = { 'mean': mean, 'std': std, 'lower_limit': lower, 'upper_limit': upper }
之后你要访问某个特征的结果时,直接用feature_data['ZCR']['lower_limit']这样的方式调用就行,比零散的变量清晰多了。
如果一定要生成单独变量(不推荐)
如果你坚持要和原代码一样生成target_ZCR_mean这类单独变量,可以用globals()动态创建,但这种方式会污染全局命名空间,后期维护容易出问题,不建议使用:
def get_feature_stats(summary_df, feature_name): mean_val = summary_df[feature_name][1] std_val = summary_df[feature_name][2] return mean_val, std_val, mean_val - std_val, mean_val + std_val target_features = ['ZCR', 'RMS', 'Tempo', 'Beat Spacing'] for feat in target_features: mean, std, lower, upper = get_feature_stats(sample_dataframe_summary, feat) # 动态创建对应变量 globals()[f'target_{feat}_mean'] = mean globals()[f'target_{feat}_std'] = std globals()[f'lower_{feat}_lim'] = lower globals()[f'upper_{feat}_lim'] = upper
关于自修改代码的补充
Python确实支持自修改代码(比如修改函数的__code__属性,或者用exec动态执行拼接的字符串),但这种做法在实际开发中几乎不会用到——它会让代码变得极其难以调试和维护,而且完全没必要用在你这种场景。你的需求本质是批量处理重复逻辑,用函数+循环就足够优雅高效了。
内容的提问来源于stack exchange,提问作者SomeAverageCoder
相关产品推荐
相关产品推荐

