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

Spyder中if语句内函数执行前数据导入代码未运行问题

问题分析与解决方案

核心问题

  1. 程序入口错误:代码最后调用main(),但定义的主函数是main_(),导致程序无法正确启动数据选择流程;若实际运行时误调用main_2(),就会直接进入分析环节,跳过数据导入步骤。
  2. 变量作用域问题:ticker_是main_()内的局部变量,main_2()直接访问会触发NameError,即便数据导入成功,后续分析也无法正常执行。
  3. 分支逻辑冗余:多个独立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_()

关键修复点

  1. 修正程序入口:将最后一行的main()改为main_(),确保程序从数据选择环节启动。
  2. 解决变量作用域:将ticker_作为参数在函数间传递,避免局部变量无法跨函数访问的问题。
  3. 优化分支逻辑:用elif替代多个独立if,添加输入错误处理,防止无效输入导致流程异常。
  4. 修正库名:导入的正确库是yfinance,而非yahoofinance(后者为旧版或错误名称)。

内容的提问来源于stack exchange,提问作者Cormac Egan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:50:30