You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python如何在函数间传值 解决read_excel传值给output时title未定义报错

问题原因
    1. 变量作用域问题:title 是read_excel函数内的局部变量,函数执行结束后外部无法直接访问,这是你收到name 'title' is not defined报错的直接原因
    1. 函数返回逻辑错误:read_excel 中写了两个return语句,执行完第一个return array之后,后续代码包括第二个return都不会被触发,也没有把title值返回给调用方
    1. process函数没有显式返回值,调用后得到的processdata会是None,后续传入output函数也会报错
    1. 原代码中使用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:06:00