Python字典遍历含IF语句时首次匹配即终止问题排查
月相匹配脚本遍历提前终止的问题解决
问题根源
你的代码里**return moon_name的缩进错误**——它被放在了for循环的内部,导致第一次循环执行完毕就直接返回结果,完全没有遍历后续的满月日期。这就是为什么1月6日的日期只会匹配到第一个满月(2022-12-07)就停止,返回"Able"。
修正方案
把return moon_name移到for循环外面,确保遍历完所有日期后,返回最后一个符合条件的满月名称。另外,建议显式对满月日期排序,避免依赖字典的插入顺序(虽然Python 3.7+字典会保留插入顺序,但显式排序更可靠)。
修正后的代码:
#!/usr/bin/python3 from datetime import date def get_moon_name(d): full_moons = { '2022-12-07': 'Able', '2023-01-06': 'Baker', '2023-02-05': 'Charlie', '2023-03-07': 'Delta' } # 按日期从早到晚排序,确保遍历顺序正确 sorted_dates = sorted(full_moons.keys(), key=lambda x: date.fromisoformat(x)) moon_name = None for md in sorted_dates: moon_date = date.fromisoformat(md) print(f"Comparing {d} to {moon_date}") if d >= moon_date: moon_name = full_moons[md] # 遍历完所有日期后再返回结果 return moon_name if __name__ == "__main__": d_today = date.today() # 测试时可替换为指定日期:date.fromisoformat('2023-01-06') print(f"This full moon's name is {get_moon_name(d_today)}")
运行效果
当日期为2023-01-06时,脚本会遍历所有四个日期,最后匹配到"2023-01-06"对应的"Baker"并返回,符合你的预期。
额外提示
如果当前日期早于所有满月日期,moon_name会返回None,你可以根据需求添加默认值处理,比如:
return moon_name or "No matching full moon"
内容的提问来源于stack exchange,提问作者Gunnar
相关产品推荐
相关产品推荐

