字典上的Python for循环在第一次与IF语句匹配后停止

tcomlyy6  于 2023-01-10  发布在  Python
关注(0)|答案(1)|浏览(172)

尝试编写一个简单的脚本来确定日期的月亮名称。我有一个日期和月亮名称的字典,并尝试迭代每个字典来比较今天的日期和满月的日期,希望最后一个匹配会成功,但Python似乎在第一个匹配后停止。

#!/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' }

    for md in full_moons.keys():
        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()
    print(f"This full moon's name is {get_moon_name(d_today)}")

删除第一个日期将产生贝克作为月球名称,所以它将匹配,如果它可以得到它。
这是Python 3.9.6(Mac OS)或3.10.9(自制程序)。
想法?我相信还有更像Python的方法,但我不明白为什么这个方法会失败。
速记:试着运行这个,期望它输出Baker,因为今天是1月6日,但是我得到的是Able,没有迹象表明它曾经查看过第二个值。

2vuwiymt

2vuwiymt1#

return语句将在第一次匹配后中断for循环,因此您总是会得到Able作为答案。

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' }

    for md in full_moons.keys():
        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()
    print(f"This full moon's name is {get_moon_name(d_today)}");

相关问题