【问题标题】:Make a yearly calendar without importing a calendar在不导入日历的情况下制作年历
【发布时间】:2021-09-10 13:55:18
【问题描述】:

写一个给定的函数:

  1. 一年

  2. 那一年的 1/1 星期几。

该函数应打印该年的年历

示例:

还要考虑闰年。能被 4 整除但不能被 100 整除的年份是闰年!除非它可以被 400 整除,否则就是闰年。 示例:1900 可以被 4 和 100 整除,但它不是闰年。 2000 年可以被 4 和 100 “AND 400”整除,是闰年。

制作此日历时考虑闰年。

【问题讨论】:

  • 这是一种非常迂回的询问方式。为我做这件事。
  • 我不知道如何开始并让球滚动

标签: python python-3.x calendar


【解决方案1】:

我想这应该差不多了。

# List of tuples for Months and date ranges
calender = [('January', 31),
            ('Feburary', 28),
            ('March', 31),
            ('April', 30),
            ('May', 31),
            ('June', 30),
            ('July', 31),
            ('August', 31),
            ('September', 30),
            ('October', 31),
            ('November', 30),
            ('December', 31)]

week = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']

def make_calendar(year, start_day):
    """
    make_calendar(int, str) --> None
    """
    # Determine current starting position on calendar
    start_pos = week.index(start_day)

    # if True, adjust Feburary date range for leap year | 29 days
    if is_leap(year):
        calender[1] = ('Feburary', 29)
    
    for month, days in calender:
        # Print month title
        print('{0} {1}'.format(month, year).center(20, ' '))
        # Print Day headings
        print(''.join(['{0:<3}'.format(w) for w in week]))
        # Add spacing for non-zero starting position
        print('{0:<3}'.format('')*start_pos, end='')
        
        for day in range(1, days + 1):
            # Print day
            print('{0:<3}'.format(day), end='')
            start_pos += 1
            if start_pos == 7:
                # If start_pos == 7 (Sunday) start new line
                print()
                start_pos = 0 # Reset counter
        print('\n')

def is_leap(year):
    """Checks if year is a leap year"""
    if year % 4 == 0:
        if year % 100 == 0:
            if year % 400 == 0:
                return True
            else:
                return False
        else:
            return True
    else:
        return False
yr=int(input('Enter Year'))
strtday=input('Enter start day of the year Mo,Tu,We,Th,Fr,Sa,Su')
make_calendar(yr,strtday)

【讨论】:

    【解决方案2】:

    这是一个替代日历,它使用 datetime 模块来获取给定年份和月份内的星期几。类似的代码主体,只是实现有点不同。

    import datetime
    # I started by creating lists for the months, their days, and the days of the week.
    month_list = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december']
    days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    days_of_week = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
    
    def calendar(month, year):
        '''
        (int, int) -> None
    
        Prints a calendar for
        given month and year.
    
        CALLS: is_leap(year)
    
        CALLED BY: main()
        '''
        # I first wanted to check if the year is a leap year, and if so, modify the days in feb
        if is_leap(year):
            days_in_month[1] = 29
        # Now i set variables to values within my lists based of input data for year and month
        month_corrected = month_list[month-1]
        num_days = days_in_month[month-1]
        # Now I figure out what my start date is for the given month of the year
        day_one = datetime.date(year, month, 1)
        start_day = day_one.isoweekday()
        # Begin by printing the month and year
        print(month_corrected[:3], year)
        # Print the days of the week for my calendar
        print(' '.join(['{0:<2}'.format(w) for w in days_of_week]))
        # Print a blank space on the days before my start day variable
        print('{0:>3}'.format('')*start_day, end='')
        # if my start day begins on sunday, start a new line and set my start day to zero
        if start_day >= 7:
            print()
            start_day = 0
        # Begin looping through the number of days in the month starting with my start day
        for day in range(1, num_days+1):
            # Print each day
            print('{0:>2}'.format(day), end=' ')
            # up my start day variable each time to act as a counter
            start_day += 1
            if start_day >= 7:
                # If my start day variable is on Sunday, start new line
                print()
                # Reset my day counter
                start_day = 0
        print()
    
    def is_leap(year):
        '''
        (int) -> bool
    
        Checks if year is a leap year
        credit to Steven Summers
    
        CALLS:
    
        CALLED BY: calendar()
    
        >>> is_leap(2000)
        True
        >>> is_leap(1900)
        False
        '''
        if year % 4 == 0:
            if year % 100 == 0:
                if year % 400 == 0:
                    return True
                else:
                    return False
            else:
                return True
        else:
            return False
    
    def main():
        '''
        () -> None
    
        Drives calendar program
    
        CALLS: calendar(month, year)
    
        CALLED BY:
        '''
        make_calendars = True
        while make_calendars:
            # create input loops for year and month to run calendar function
            good_year = False
            while good_year == False:
                input_year = input('Enter year (blank to exit): ')
                # some code to ensure input is within datetime parameters
                if input_year == '':
                    make_calendars = False
                    return None
                else:
                    year = int(input_year)
                    if 1 > year > 9999:
                        print("Must enter an integer between 1 and 9999")
                    else:
                        good_year = True        
            good_month = False
            while good_month == False:
                # a blank entry will print the entire year
                input_month = input('Enter month (blank to print entire year: ')
                # some code to ensure input is within datetime parameters
                if input_month == '':
                    for i in range(1,13):
                        calendar(i, year)
                    main()
                else:
                    if input_month[0] == '0':
                        input_month = input_month[1:]                
                    month = int(input_month)
                    if 1 > month > 12:
                        print("Must enter an integer between 1 and 12")
                    else:
                        good_month = True 
            if good_year == True and good_month == True:
                calendar(month, year)
    
    if __name__ == '__main__':
        main()
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-15
      • 2020-06-12
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2020-06-08
      • 1970-01-01
      • 2015-08-23
      相关资源
      最近更新 更多