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

Python嵌套while循环变量无法递增导致onCall轮值排班分配异常

问题根因

代码的核心错误是r变量的增量逻辑放错了位置:你把r = 1 + r写在了内层逐天赋值的循环里,每处理1天就给r加1,第一周7天处理完r就变成了7,而你设置的总周数weeks = 28/7 =4,此时外层循环的判断条件r < weeks直接不成立,外层循环只执行1次就退出了,自然只有第一周的Billy被分配,后续人员都没触发分配逻辑。

修复方案

把r的增量从内层循环移到外层循环,每处理完整一周再给r加1即可,修复后的完整代码如下:

import datetime

start_date = datetime.date(2021, 11, 1)
end_date = datetime.date(2021, 11, 28)
delta = datetime.timedelta(days=1)
Days = []
while start_date <= end_date:
    taskday = str(start_date)
    taskday = [taskday]
    Days.append(taskday)
    start_date += delta

daysLength = len(Days)
daysi = 0

onCall = ["Billy", "Todd", "Moose", "DJ", "Kach", "Darwin", "Freddy", "Todd"]

personcounter = 0
lengthOfonCall = len(onCall)
weekdaycounter = 0
r = 0
weeks = daysLength//7 # 改成整数除法更稳妥,避免非整周的浮点判断问题
while r < weeks:
    personOnCall = "OnCall: " + onCall[personcounter]
    while weekdaycounter < 7:
        Days[daysi].append(personOnCall)
        weekdaycounter = weekdaycounter + 1
        daysi = 1 + daysi
    personcounter = 1 + personcounter
    weekdaycounter = 0
    r = r + 1 # 增量移到此处,处理完一整周再计数+1
    if (personcounter == lengthOfonCall):
        personcounter = 0
print(Days)

可选优化点

  • 可以直接用datetime的isoweekday()方法判断周边界,不用手动计数天/周,适配非整周的日期范围场景
  • 人员轮询可以直接用itertools.cycle简化代码,不用手动维护personcounter的重置逻辑

内容的提问来源于stack exchange,提问作者gillunderwater

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:39:00