Python循环退出故障:enter_new_trade函数无法在单次交易后终止循环
问题分析与解决方案
核心问题
get_valid_user_input()无返回值:该函数收集了所有交易信息,但未将数据返回给调用者,导致enter_new_trade()中赋值的ticker、buy_sell等变量全为None,且每次调用都会让用户重复输入全套信息,这是循环重复的主要原因。- 函数调用逻辑错误:
enter_new_trade()中多次调用get_valid_user_input(),完全违背原函数“一次性收集一笔交易所有信息”的设计意图。 - 循环与返回逻辑混乱:
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
相关产品推荐
相关产品推荐

