Python自定义函数多次调用返回值一致,如何统计True和False的返回次数
问题根源
- 你定义的
hundred()函数依赖了大量全局变量,包括resultlist、current、total等,这些变量在函数第一次运行后不会自动重置,后续调用函数时会一直沿用之前运行留下的值:- 如果第一次调用返回True,说明
total列表已经有元素,后续所有调用的返回值都会是True - 如果第一次调用返回False,后续调用会继续往已有
resultlist里追加新的抛硬币结果,逻辑完全错乱
- 如果第一次调用返回True,说明
- 你写的循环逻辑里单次迭代调用了两次
hundred()函数,if判断时调用一次,elif判断时又调用一次,相当于每次迭代浪费了一次调用,而且两次返回值可能不一致 - 原函数还有个隐性bug:第一次循环i=0时,
resultlist[i-1]会取到列表最后一个元素,属于越界索引错误,会影响判断结果
修复方案
- 把函数内部用到的临时变量全部移到函数体内定义,不要用全局变量,保证每次调用函数都是独立运行的状态
- 循环里单次迭代只调用一次
hundred(),将返回值存入临时变量后再做判断 - 修正索引越界和连续计数的逻辑错误
修正后完整代码
import random headtails = ['H', 'T'] def hundred(): # 所有临时变量在函数内部初始化,每次调用都是全新状态 resultlist = [] current = 1 total = [] for i in range(100): x = random.choice(headtails) resultlist.append(x) # 跳过第一个元素的对比,避免索引为-1的越界问题 if i == 0: continue if resultlist[i] != resultlist[i-1]: # 新元素和上一个不同,连续次数重置为1(当前元素本身就是1次连续) current = 1 else: current += 1 if current >= 6: total.append(current) # 匹配到连续6次后,重置连续计数即可 current = 1 return len(total) > 0 # 统计逻辑 number_of_true = 0 overalls = 10 # 直接用for循环运行指定次数即可,不用额外写迭代计数变量 for _ in range(overalls): # 单次迭代只调用一次函数,保存结果后再判断 run_result = hundred() if run_result: number_of_true += 1 print("返回True的次数:", number_of_true, "总调用次数:", overalls)
内容的提问来源于stack exchange,提问作者fentalyn
相关产品推荐
相关产品推荐

