Python如何在if条件满足时暂存迭代值并保持后续逻辑序列正常执行
问题根本原因
Python中for i in range(xxx)的循环变量i由range迭代器统一赋值,每次循环开始时会自动取下一个序列值覆盖循环体内的修改,所以你在循环里给i减1只能影响当前轮次的输出,下一轮还是会按原有节奏递增,这就是你第一个示例代码输出不符合预期的核心原因。
日期场景解决方案
你的实际需求是碰到闰年2月29日时,对应的迭代编号i和次日(2月28日)的i保持一致,同时保证i、日期、关联数据集的对应关系正确,可改用手动控制迭代变量的while循环实现,完全避免for循环的自动赋值问题:
from datetime import date, timedelta sDate = date(2021,7,24) eDate = date(2016,1, 1) current_date = sDate i = 0 # 按日期倒序遍历,直到到达结束日期 while current_date >= eDate: # 这里可以加你对应i的数据集处理逻辑,i和当前日期完全对应 print(i, current_date) # 闰年判断:兼容整百年规则,如果你业务场景不需要可以简化为 year%4==0 is_leap = (current_date.year % 4 == 0 and current_date.year % 100 != 0) or (current_date.year % 400 == 0) # 只有当前日期不是闰年2月29日时,才递增迭代编号i if not (current_date.day == 29 and current_date.month == 2 and is_leap): i += 1 # 日期往前推一天 current_date = current_date - timedelta(days=1)
输出效果验证
改后输出会完全符合你的预期,不会出现日期重复问题,闰年2月的对应输出如下:
... 510 2020-03-01 511 2020-02-29 511 2020-02-28 512 2020-02-27 ... 1971 2016-03-01 1972 2016-02-29 1972 2016-02-28 1973 2016-02-27 ...
内容的提问来源于stack exchange,提问作者jayhal
相关产品推荐
相关产品推荐

