Python如何在函数间传值 解决read_excel传值给output时title未定义报错
问题原因
- 变量作用域问题:
title是read_excel函数内的局部变量,函数执行结束后外部无法直接访问,这是你收到name 'title' is not defined报错的直接原因
- 变量作用域问题:
- 函数返回逻辑错误:
read_excel中写了两个return语句,执行完第一个return array之后,后续代码包括第二个return都不会被触发,也没有把title值返回给调用方
- 函数返回逻辑错误:
process函数没有显式返回值,调用后得到的processdata会是None,后续传入output函数也会报错
- 原代码中使用的
pd.DataFrame.append方法已经在pandas 2.0+版本中废弃,存在版本兼容风险
- 原代码中使用的
修正后的完整代码
import os import pandas as pd import math class Item(): __name = "" __cost = 0 __gender = "" __prime = "" def has_all_properties(self): return bool(self.__name and not math.isnan(self.__cost) and self.__gender and self.__prime) def clean(self,wanted_cost,wanted_gender,wanted_prime): return bool(self.__name and self.__gender == wanted_gender and self.__cost <= wanted_cost and self.__prime == wanted_prime) def __init__(self, name, cost, gender, prime): self.__name = name self.__cost = cost self.__gender = gender self.__prime = prime def __eq__(self, other): return (self.__name == other.__name and self.__cost == other.__cost and self.__gender == other.__gender and self.__prime == other.__prime) def __hash__(self): return hash((self.__name, self.__cost, self.__gender, self.__prime)) def __repr__(self): return f"Item({self.__name},{self.__cost},{self.__gender},{self.__prime})" def tuple(self): return self.__name, self.__cost, self.__gender, self.__prime def read_excel(filetype): cwd = os.path.abspath('') files = os.listdir(cwd) df = pd.DataFrame() for file in files: if file.endswith(filetype): df = pd.concat([df, pd.read_excel(file)], ignore_index=True) # 替换已废弃的append方法 df = df.where(df.notnull(), None) df = df[['name', 'cost', 'used_by', 'prime']] title = list(df.columns.values) print(title) array = df.values.tolist() print(array) # 同时返回数组和表头 return array, title def process(array): mylist = {Item(*k) for k in array} print(mylist) filtered = {obj for obj in mylist if obj.has_all_properties()} clean = {obj for obj in filtered if obj.clean(20,"male","yes")} result = list(clean) print(result) # 增加返回值 return result def output(where, sort_data, title): t_list = [obj.tuple() for obj in sort_data] output_df = pd.DataFrame(t_list, columns = title) output_df.to_excel(where, index = False, header = True) if __name__ == "__main__": # 接收read_excel返回的两个值 inputfile, title = read_excel('.XLSX') processdata = process(inputfile) output('clean_data.xlsx', processdata, title)
内容的提问来源于stack exchange,提问作者zhangruibo101
相关产品推荐
相关产品推荐

