Spyder中if语句内函数执行前数据导入代码未运行问题
问题分析与解决方案
核心问题
- 程序入口错误:代码最后调用
main(),但定义的主函数是main_(),导致程序无法正确启动数据选择流程;若实际运行时误调用main_2(),就会直接进入分析环节,跳过数据导入步骤。 - 变量作用域问题:
ticker_是main_()内的局部变量,main_2()直接访问会触发NameError,即便数据导入成功,后续分析也无法正常执行。 - 分支逻辑冗余:多个独立
if语句效率低下,且未处理输入非1-7的情况,可能导致无预期的流程跳转。
修复后的代码
import yfinance as yf # 注意:正确库名是yfinance,不是yahoofinance def main_(): print("Choose dataset") print("1.Amazon \n2.Apple \n3.Cisco \n4.Meta \n5.Microsoft \n6.Qualcomm \n7.Starbucks") choice = input("Please choose option: ") ticker_ = None # 用elif简化分支逻辑 if choice == '1': ticker = yf.Ticker('AMZN') ticker = ticker.history(period="5y") ticker_ = ticker[['Close']] elif choice == '2': ticker = yf.Ticker('AAPL') ticker = ticker.history(period="5y") ticker_ = ticker[['Close']] elif choice == '3': ticker = yf.Ticker('CSCO') ticker = ticker.history(period="5y") ticker_ = ticker[['Close']] elif choice == '4': ticker = yf.Ticker('META') ticker = ticker.history(period="5y") ticker_ = ticker[['Close']] elif choice == '5': ticker = yf.Ticker('MSFT') ticker = ticker.history(period="5y") ticker_ = ticker[['Close']] elif choice == '6': ticker = yf.Ticker('QCOM') ticker = ticker.history(period="5y") ticker_ = ticker[['Close']] elif choice == '7': ticker = yf.Ticker('SBUX') ticker = ticker.history(period="5y") ticker_ = ticker[['Close']] else: print("Invalid option, please choose 1-7") main_() return # 数据导入成功后再进入分析选择 print('1.Descriptive Analytics \n2.Visual Analysis \n3.Predictive Analysis') main_2(ticker_) # 将ticker_作为参数传递给main_2 def main_2(ticker_): # 接收ticker_参数 typ = input('Choose type of analysis:') if typ == '1': print(ticker_.describe()) main_() elif typ == '2': print('1.Moving Averages \n2.Scatter plot \n3.Trend Lines') main_3(ticker_) # 传递ticker_给后续分析函数 elif typ == '3': predictive(ticker_) main_() else: print("Invalid option, please choose 1-3") main_2(ticker_) def main_3(ticker_): # 接收ticker_参数 graphical = input('Choose sort of graphical analysis:') if graphical == '1': moving_averages(ticker_) # 传递ticker_ main_4() elif graphical == '2': scatter_plot(ticker_) # 传递ticker_ main_4() elif graphical == '3': trend_line(ticker_) # 传递ticker_ main_4() else: print("Invalid option, please choose 1-3") main_3(ticker_) def main_4(): print('1.Return to Main Menu \n2.Quit') option = input('Choose option:') if option == '1': main_() elif option == '2': exit() # 用exit()替代quit(),更规范 else: print("Invalid option, please choose 1-2") main_4() # 补充定义分析函数,需接收ticker_参数实现具体逻辑 def predictive(ticker_): print("Running predictive analysis...") def moving_averages(ticker_): print("Calculating moving averages...") def scatter_plot(ticker_): print("Generating scatter plot...") def trend_line(ticker_): print("Drawing trend line...") # 修复程序入口,调用正确的主函数 main_()
关键修复点
- 修正程序入口:将最后一行的
main()改为main_(),确保程序从数据选择环节启动。 - 解决变量作用域:将
ticker_作为参数在函数间传递,避免局部变量无法跨函数访问的问题。 - 优化分支逻辑:用
elif替代多个独立if,添加输入错误处理,防止无效输入导致流程异常。 - 修正库名:导入的正确库是
yfinance,而非yahoofinance(后者为旧版或错误名称)。
内容的提问来源于stack exchange,提问作者Cormac Egan
相关产品推荐
相关产品推荐

