递归函数生成日期范围无法返回结果问题排查
问题分析与修复
核心问题1:递归调用未返回结果
你的递归函数在进入递归分支时,没有返回递归调用的结果。当base <= datetime.datetime.now()时,你调用了dateinterval(...)但未用return返回它,导致上层函数执行完后无返回值,最终整个函数返回None。
核心问题2:默认参数的陷阱
Python中默认参数是在函数定义时初始化的,而非每次调用时。dates=[]会复用同一个列表对象,这种写法容易导致多次调用或递归过程中意外累积数据,属于不安全的写法。
核心问题3:日期重复添加的逻辑错误
当前逻辑每次调用都会把listing_date和next_date加入列表,下一次递归时listing_date是上一次的next_date,因此会重复添加该日期(比如结果里的2019-09-28出现两次)。另外终止条件里添加当前日期的逻辑也有误,应该是当next_date超过当前时间时,用当前日期替代结束日期,而非额外添加。
修复后的代码
from dateutil import parser import datetime def dateinterval(listing_date, dates=None): # 避免默认参数陷阱,每次调用初始化新列表 if dates is None: dates = [] period = 1000 base = parser.parse(listing_date) current_date = datetime.datetime.now() # 添加起始日期 dates.append(listing_date) # 计算下一个日期 next_date = base + datetime.timedelta(days=period) # 如果下一个日期超过当前时间,用当前日期作为结束 if next_date > current_date: dates.append(current_date.strftime('%Y-%m-%d')) return dates # 否则添加下一个日期,继续递归 dates.append(next_date.strftime('%Y-%m-%d')) # 递归调用时必须返回结果 return dateinterval(next_date.strftime('%Y-%m-%d'), dates) a = dateinterval('2017-01-01') print(a)
修复说明
- 将
dates默认参数改为None,在函数内部初始化空列表,彻底避免默认参数复用的问题。 - 递归调用时添加
return,确保上层函数能拿到递归返回的最终结果。 - 调整终止逻辑:当计算出的
next_date超过当前时间时,直接添加当前日期作为区间结束,避免日期重复累积。
运行修复后的代码,会得到预期的日期区间列表,且函数能正确返回结果,不会输出None。
内容的提问来源于stack exchange,提问作者A39-A20
相关产品推荐
相关产品推荐

