Python嵌套While循环问题:后续循环致首次循环重复输出已输入数据
解决Python多while循环重复使用旧输入的问题
嘿,这个问题我之前写类似交易计算程序的时候也踩过坑!咱们来一步步捋清楚问题出在哪,怎么解决。
首先看你给出的代码片段(我把后面的逻辑补全了,应该和你实际写的差不多):
repeat = 'y' p = 'y' b = 'y' s = 'y' while repeat != 'n': while p == 'y': stocksPurchased = float(input("Number of stocks purchased: ")) if stocksPurchased < 0: print("Negative Values are not allowed. Please re-enter.") else: p = 'n' while b == 'y': buyPrice = float(input("Buy price per stock: ")) if buyPrice < 0: print("Negative Values are not allowed. Please re-enter.") else: b = 'n' # 这里应该还有卖出价格的输入和计算逻辑 # ... repeat = input("Do you want to calculate another transaction? (y/n): ")
问题根源
你把p、b、s这些内层循环的控制变量定义在了外层循环的外面。第一次运行外层循环时,内层循环会正常让你输入数据,输入合法后把p改成'n';但当你选择继续计算(repeat设为'y'),外层循环再次启动时,p依然是'n',所以while p == 'y'这个循环直接跳过,就会用上一次输入的stocksPurchased值,自然就出现了重复打印旧数据的情况。
快速修复方案
把内层循环的控制变量移到外层循环的内部,每次启动新的交易计算时,重新把这些变量设为'y',这样内层循环就会重新触发输入:
repeat = 'y' while repeat != 'n': # 每次外层循环开始时,重置所有内层循环的控制开关 p = 'y' b = 'y' s = 'y' while p == 'y': stocksPurchased = float(input("Number of stocks purchased: ")) if stocksPurchased < 0: print("Negative Values are not allowed. Please re-enter.") else: p = 'n' while b == 'y': buyPrice = float(input("Buy price per stock: ")) if buyPrice < 0: print("Negative Values are not allowed. Please re-enter.") else: b = 'n' # 补充卖出价格的输入循环示例 while s == 'y': sellPrice = float(input("Sell price per stock: ")) if sellPrice < 0: print("Negative Values are not allowed. Please re-enter.") else: s = 'n' # 计算并打印收益 total_profit = (sellPrice - buyPrice) * stocksPurchased print(f"Total profit/loss: ${total_profit:.2f}") repeat = input("Do you want to calculate another transaction? (y/n): ")
进阶优化建议
你会发现每个输入的验证逻辑几乎一模一样,重复写while循环太冗余了。可以把输入验证的逻辑抽成一个独立函数,代码会更简洁易维护:
def get_positive_number(prompt): """获取一个非负的数值输入,处理非法输入情况""" while True: try: value = float(input(prompt)) if value >= 0: return value else: print("Negative Values are not allowed. Please re-enter.") except ValueError: print("Invalid input. Please enter a number.")
用这个函数重构主代码后,就不用再写一堆嵌套的while循环了:
repeat = 'y' while repeat != 'n': stocks_purchased = get_positive_number("Number of stocks purchased: ") buy_price = get_positive_number("Buy price per stock: ") sell_price = get_positive_number("Sell price per stock: ") total_profit = (sell_price - buy_price) * stocks_purchased print(f"Total profit/loss: ${total_profit:.2f}") repeat = input("Do you want to calculate another transaction? (y/n): ")
这样不仅解决了旧数据重复的问题,代码可读性和可维护性也提升了不少~
内容的提问来源于stack exchange,提问作者NavyCat
相关产品推荐
相关产品推荐

