如何用for循环统计布尔函数True/False输出?Python机票作业需求
嘿,Emily!我来帮你搞定这个机票价格函数的统计需求~
解决你的两个核心问题
一、完全可以用for循环统计布尔函数的真假输出数量
这是非常直观的实现方式,你只需要生成多组随机的input_price和input_day,在for循环里逐个调用should_I_buy函数,用变量累计True和False的出现次数就行。
给你个现成的示例代码(记得替换成你自己的data哦):
import random # 示例数据,替换成你实际的机票日期-价格数据 sample_flight_data = [(1, 200), (3, 180), (5, 220), (7, 190), (10, 250)] def should_I_buy(data, input_price, input_day): """Returns whether one should buy flight ticket now or wait longer to buy""" for day, price in data: if day < input_day: if price < input_price: return False return True # 初始化计数器 true_output_count = 0 false_output_count = 0 # 生成100组随机测试用例(数量可以按需调整) for _ in range(100): # 模拟随机价格(150-300)和随机天数(1-15),范围可自定义 rand_price = random.randint(150, 300) rand_day = random.randint(1, 15) # 调用函数并统计结果 result = should_I_buy(sample_flight_data, rand_price, rand_day) if result: true_output_count += 1 else: false_output_count += 1 print(f"函数输出为「立即购买(True)」的次数:{true_output_count}") print(f"函数输出为「等待(False)」的次数:{false_output_count}")
二、统计函数循环内部的True/False判断次数
原函数里的核心判断是price < input_price(仅当day < input_day时触发),但原函数一旦遇到这个条件成立就直接返回False,所以要完整统计所有符合day < input_day的价格判断,我们需要稍微调整函数逻辑,加入计数器:
方法1:修改原函数,同时返回结果和统计数据
这种方式最直接,适合你快速测试:
def should_I_buy_with_stats(data, input_price, input_day): """返回是否应该购买,以及循环内price < input_price的真假判断次数""" judge_true = 0 # 记录price < input_price为True的次数 judge_false = 0 # 记录price < input_price为False的次数 for day, price in data: if day < input_day: if price < input_price: judge_true += 1 # 遇到符合条件的情况,返回结果和当前统计 return False, judge_true, judge_false else: judge_false += 1 # 天数大于等于input_day时,跳过判断 # 遍历完所有符合条件的天数后,返回购买建议和统计 return True, judge_true, judge_false
然后在随机测试中累计总次数:
# 初始化全局统计计数器 total_judge_true = 0 total_judge_false = 0 total_true_output = 0 total_false_output = 0 for _ in range(100): rand_price = random.randint(150, 300) rand_day = random.randint(1, 15) result, jt, jf = should_I_buy_with_stats(sample_flight_data, rand_price, rand_day) # 累计判断次数 total_judge_true += jt total_judge_false += jf # 累计函数输出次数 if result: total_true_output += 1 else: total_false_output += 1 print(f"循环内「price < input_price」为True的总次数:{total_judge_true}") print(f"循环内「price < input_price」为False的总次数:{total_judge_false}") print(f"函数输出为True的总次数:{total_true_output}") print(f"函数输出为False的总次数:{total_false_output}")
方法2:用装饰器包装原函数,不改动原代码
如果你不想修改原函数的逻辑,可以用装饰器来偷偷记录判断次数,保留原函数的完整性:
def track_judge_counts(func): """装饰器:跟踪函数内部price < input_price的判断次数""" # 初始化装饰器的全局计数器 func.judge_true = 0 func.judge_false = 0 def wrapper(data, input_price, input_day): local_true = 0 local_false = 0 # 模拟原函数的遍历逻辑,同时统计判断次数 for day, price in data: if day < input_day: if price < input_price: local_true += 1 func.judge_true += local_true func.judge_false += local_false return False else: local_false += 1 # 遍历结束后更新全局计数器 func.judge_true += local_true func.judge_false += local_false return True return wrapper # 用装饰器包装原函数 tracked_buy_func = track_judge_counts(should_I_buy) # 进行随机测试 total_true_output = 0 total_false_output = 0 for _ in range(100): rand_price = random.randint(150, 300) rand_day = random.randint(1, 15) result = tracked_buy_func(sample_flight_data, rand_price, rand_day) if result: total_true_output += 1 else: total_false_output += 1 print(f"循环内「price < input_price」为True的总次数:{tracked_buy_func.judge_true}") print(f"循环内「price < input_price」为False的总次数:{tracked_buy_func.judge_false}") print(f"函数输出为True的总次数:{total_true_output}") print(f"函数输出为False的总次数:{total_false_output}")
小提示
- 随机测试的参数范围(比如价格区间、天数范围)记得根据你实际的
data调整,确保测试用例有意义。 - 如果需要更细致的分析,可以把每次测试的判断次数存入列表,后续做分布统计或者可视化。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

