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

Python循环退出故障:enter_new_trade函数无法在单次交易后终止循环

问题分析与解决方案

核心问题

  1. get_valid_user_input()无返回值:该函数收集了所有交易信息,但未将数据返回给调用者,导致enter_new_trade()中赋值的ticker、buy_sell等变量全为None,且每次调用都会让用户重复输入全套信息,这是循环重复的主要原因。
  2. 函数调用逻辑错误:enter_new_trade()中多次调用get_valid_user_input(),完全违背原函数“一次性收集一笔交易所有信息”的设计意图。
  3. 循环与返回逻辑混乱:enter_new_trade()的return语句缩进错误,放在while循环内部,导致第一次交易处理后直接返回,无法支持多笔交易输入;同时while choice:的条件判断不严谨,易引发无意义循环。

修正后的代码

import datetime

def get_valid_user_input():
    # 验证股票代码
    while True:
        ticker = input("Enter a Ticker: ")
        if ticker != "":
            break
        print("Ticker cannot be blank")
    
    # 验证买卖方向
    b_s = ['b','s']
    while True:
        buy_sell = input("Buy or Sell (b/s): ").lower()
        if buy_sell in b_s:
            break
        print("Please enter b or s")
    
    # 验证股票数量
    while True:
        try:
            stock_qty = int(input("Quantity of Stock: "))
            if stock_qty > 0:
                break
            print("Please enter a positive whole number")
        except ValueError:
            print("Please enter a positive whole number")
    
    # 验证交易价格
    while True:
        try:
            stock_price = float(input("Total Cost (including brokerage): "))
            if stock_price >= 0:
                break
            print("Price cannot be negative")
        except ValueError:
            print("Enter a valid price")
    
    # 验证交易日期
    while True:
        try:
            date = datetime.datetime.strptime(input("Date (yyyy-mm-dd): "), "%Y-%m-%d").date()
            break
        except:
            print("Enter the date format in yyyy-mm-dd")
    
    # 返回收集到的所有交易数据
    return ticker, buy_sell, stock_qty, stock_price, date

# 手动录入新交易
def enter_new_trade():
    trading_data = []
    
    while True:
        choice = input("Are you looking to buy or sell stocks? (b/s, enter 'q' to quit): ").lower()
        if choice == 'q':
            break
        if choice not in ['b', 's']:
            print("Invalid Input, please enter b/s or q to quit")
            continue
        
        # 单次调用获取完整交易信息
        ticker, _, stock_qty, stock_price, trade_date = get_valid_user_input()
        # 确保买卖方向与用户初始选择一致
        buy_sell = choice
        
        if choice == 'b':
            print(f"{trade_date} {ticker}   BUY   {stock_qty} for $ {stock_price}")
        else:
            print(f"{trade_date} {ticker}   SELL   {stock_qty} for $ {stock_price}")
        
        trading_data.append([ticker, buy_sell, stock_qty, stock_price, trade_date])
    
    return trading_data

# 执行测试
trades = enter_new_trade()
print("\nTrades are added to the system:")
for trade in trades:
    print(trade)

关键修改点

  • 给get_valid_user_input()添加返回值,一次性返回一笔交易的所有字段,避免重复调用。
  • 优化enter_new_trade()循环逻辑:添加退出选项q,让用户可主动结束输入;过滤无效输入提示,提升交互体验。
  • 移除原代码中冗余的valid_input变量,改用while True+break的简洁写法,简化逻辑。
  • 确保买卖方向与用户初始选择一致,避免重复输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 19:05:47