You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:16:17