【问题标题】:leap year python script闰年python脚本
【发布时间】:2021-02-17 02:27:07
【问题描述】:

我正在尝试编写一个代码,该代码将接受一年中的任何月份并输出输入的月份以及该月中的日期列表。但是如果输入二月,它应该询问出生年份并检查那是否是闰年并输出二月加上二月的天数。 我哪里做错了?

month = input("Enter any month of the year: ")
for n in month:
    if (n == "January" or 
     n == "March" or 
     n == "April" or
     n == "May" or 
     n == "June" or 
     n == "July" or 
     n == "August" or
     n == "September" or 
     n == "October" or 
     n == "November" or 
     n == "December"):
       print (n + range(1, 32))
 elif n == "February" :
    year = input("Enter a year")
    for i in year:
        if i % 4 == 0:
            print (year + range(1,29))

【问题讨论】:

  • 使用日历模块...它看起来更漂亮,而且小菜一碟
  • 我不是 python 开发者,但你不只需要下面的else print (year + range(1,28) 之类的东西。

标签: python python-3.x list


【解决方案1】:

我会建议你简单地使用内置的日历模块

# Program to display calendar of the given month and year

# importing calendar module
import calendar

yy = 2014  # year
mm = 11    # month

# To take month and year input from the user
# yy = int(input("Enter year: "))
# mm = int(input("Enter month: "))

# display the calendar
print(calendar.month(yy, mm))

# output
#   November 2014
#Mo Tu We Th Fr Sa Su
#                1  2
# 3  4  5  6  7  8  9
#10 11 12 13 14 15 16
#17 18 19 20 21 22 23
#24 25 26 27 28 29 30

【讨论】:

    【解决方案2】:

    假设您的目的是学习如何编程(例如完成教育任务),以下内容应该会有所帮助。如果只是为了完成工作,您可能应该使用一些内置的 Python 模块(例如 datetimecalendar),因为它们会为您完成很多艰苦的工作.


    首先,input 返回一个字符串,当您遍历一个字符串 (for n in month) 时,您一次会得到一个字符。所以迭代"May" 会得到"M""a""y",它们都不等于"May"。不用迭代,只比较整个字符串:

    if month == "January" ...
    

    其次,并非所有月份都有 31 天,您需要区分那些有 30 天的月份:

    if month == "February":
        doFebStuff()
    elif month in ['September', 'April', 'June', 'November']:
        do30DayStuff()
    else:
        do31DayStuff()
    

    第三,你不能连接一个字符串和一个范围,你需要做这样的事情:

    print(month, end='')
    for i in range(1, 32):
        print(f" {i}", end='')
    print()
    

    第四,今年再次,input 给你一个字符串,你不想迭代它。如果您要对其进行数学计算,您还希望将其设为整数,例如:

    year = int(input("Enter a year: "))
    

    第五,闰年的规则比每四年稍微复杂一点,具体来说:

    • 如果是 400 的倍数,则为闰年;其他
    • 如果是 100 的倍数,则不是;其他
    • 如果是 4 的倍数,则为;其他
    • 不是。

    考虑到所有这些,这是一个的方法,增加了有效性检查(月份名称和年份):

    Days30 = ["September", "April", "June", "November"]
    Days31 = ["January", "March", "May", "July", "August", "October", "December"]
    
    lastDay = None
    month = input("Enter any month of the year: ")
    if month == "February":
        lastDay = 28
        year = -1
        while year < 0:
            try:
                year = int(input("Enter the year: "))
            except:
                year = -1
        if year % 400 == 0 or (year % 100 != 0 and year % 4 == 0):
            lastDay = 29
    elif month in Days30:
        lastDay = 30
    elif month in Days31:
        lastDay = 31
    
    if lastDay is None:
        print(f"I don't know the month {month}")
    else:
        print(f"{month}:", end="")
        for day in range(1, lastDay + 1):
            print(f" {day}", end="")
        print()
    

    我不会尝试将其作为您的自己的作品(您几乎肯定会因为抄袭而被 ping),但这是获得一些想法的好代码。

    【讨论】:

      【解决方案3】:

      如果你问你哪里出错了,有一些地方:

      • 您的ifelif 没有正确缩进,它们没有对齐。
      • 当您编写for n in month: 时,n 获取输入月份中每个字母的值。例如如果您输入“July”,n 将迭代为“J”、“u”、“l”和“y”。因此,将n 与月份的全名进行比较总是会得到False。只需比较 month 而不是对其进行迭代。
      • 在接受输入时,python 将用户输入的值存储为字符串 (year = input("Enter a year"))。因此,当您迭代变量 year (for i in year) 时,您迭代的是一串数字而不是数字。此外,模运算符不适用于字符串 (i % 4),因为在这种情况下,i 是一个字符串。只需执行 year = int(input("Enter a year")) 将年份转换为 ineger 并且不要对其进行迭代,直接使用 4 检查余数。

      您可以参考paxdiablo的代码以获取工作代码。

      【讨论】:

        猜你喜欢
        • 2022-12-10
        • 2022-10-20
        • 1970-01-01
        • 2022-10-13
        • 2011-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多