Range循环中pa_result列表追加异常及打席流程设计疑问
问题1:pa_result 无法正确收集打席结果的修复
你的代码存在两个核心问题:
- 缩进错误:
pa_result.append(pa_end)仅在「0-0 出局」的分支下执行,一垒安打、二垒安打等其他打席结束场景完全没有被记录。 - 逻辑遗漏:只有当第一个球形成In-Play且结果是出局时,才会向列表添加数据,其他打席结束情况都被忽略。
修复后的代码片段(针对0-0 In-Play场景):
else: Fpitch = "0-0 In-Play" if 18 <= In_Play() < 41: pa_end = "0-0 Single" elif 10 <= In_Play() < 18: pa_end = "0-0 Double" elif 0 <= In_Play() < 1: pa_end = "0-0 Triple" elif 1 <= In_Play() < 10: pa_end = "0-0 Home Run" else: pa_end = "0-0 OUT" # 将append移至所有分支外部,只要进入In-Play就记录打席结果 pa_result.append(pa_end)
问题2:开发架构选择建议
推荐使用「单打席状态循环」的方式开发,而非在每个球数分支下堆砌逻辑,也不建议用剩余打席数的额外循环。
理由:
- 打席是完整流程:从初始0-0球数开始,每次投球后更新球数/状态,直到打席结束(出局或上垒)。用状态机思路单独处理每个打席,逻辑更清晰。
- 避免冗余变量:你当前定义了7个投球结果列表,后续扩展球数(如2-2满球数)会导致变量爆炸,维护成本极高。
- 扩展性强:后续添加坏球保送、三振出局、界外球等规则时,状态循环模式可轻松插入判断,分支堆砌则会让代码臃肿混乱。
示例架构参考:
import random def In_Play(): return random.randint(0,100) def pitch(): return random.randint(0,100) def simulate_pa(): balls = 0 strikes = 0 while True: pitch_val = pitch() # 处理投球结果,更新球数或判定打席结束 if pitch_val <=43: balls +=1 if balls ==4: return "Walk" # 保送打席结束 elif pitch_val >=59: strikes +=1 if strikes ==3: return "Strikeout" # 三振出局 else: # 处理In-Play情况,判定安打/出局 in_play_val = In_Play() if 18 <= in_play_val <41: return "Single" elif 10 <= in_play_val <18: return "Double" elif 0 <= in_play_val <1: return "Triple" elif 1 <= in_play_val <10: return "Home Run" else: return "Out" # 模拟1000次打席,自动收集所有结果 pa_result = [simulate_pa() for _ in range(1000)]
内容的提问来源于stack exchange,提问作者TSned3
相关产品推荐
相关产品推荐

