Python 写的计算指定年指定月日历的脚本

放肆的年华 提交于 2020-03-01 03:10:43

今天初学Python写了一个用于计算指定年指定月日历的脚本

我的Python版本:Python 3.4.2

输入:脚本名 年(4位数字,1900-2100) 月(1-2位数字,1-12)

输出:打印的指定年月日历信息

Calendar.py

import os
import sys

# check if the number of input is legal
if len(sys.argv) != 3:
    print('Invalid input! Example: 2014 12')
    os.system('pause')  # "press any key to continue..."
    os._exit(0)         # terminate this script

# check if input(year) is legal
print("Year: %s" % sys.argv[1])
if not str(sys.argv[1]).isdigit():
    print('Invalid input! Year must be a positive integer')
    os.system('pause') 
    os._exit(0)        
elif int(sys.argv[1]) < 1900 or int(sys.argv[1]) > 2100: 
    print('Invalid input! Year must bigger than 1900 and smaller than 2100')
    os.system('pause') 
    os._exit(0)

# check if input(month) is legal
print("Month: %s" % sys.argv[2])
if not str(sys.argv[2]).isdigit():
    print('Invalid input! Month must be a positive integer')
    os.system('pause') 
    os._exit(0)        
elif int(sys.argv[2]) < 1 or int(sys.argv[2]) > 12: 
    print('Invalid input! Year must bigger than 1 and smaller than 12')
    os.system('pause') 
    os._exit(0)

# check: is a leap year or not
# param @year: the year input
# return: leap: True; not leap: False
def IsLeapYear(year):
    if year % 4 != 0:
        return False
    if year % 100 == 0 and year % 400 != 0:
        return False
    return True

cur_year = sys.argv[1]  # the year input
cur_month = sys.argv[2] # the month input

# counter: the first day in cur_year, cur_month, it indicates the day of week
counter = 0
for i in range(1900, int(cur_year)):
    if IsLeapYear(i):
        counter += 366
    else:
        counter += 365

days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
days_in_month_leap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
for i in range(1, int(cur_month)):
    if not IsLeapYear(int(cur_year)):
        counter += days_in_month[i - 1]
    else: 
        counter += days_in_month_leap[i - 1]

# first_day_in_cur_month: what day is the first day in cur_month
first_day_in_cur_month = counter % 7

# name of each month
month_name = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 
              'August', 'September', 'October', 'November', 'December']

# char numbers of each line
calendar_width = 45

# print title
print()
print('=' * calendar_width)
space_num = (calendar_width - len(month_name[int(cur_month) - 1])) // 2
sys.stdout.write(" "* space_num)
sys.stdout.write(month_name[int(cur_month) - 1])
sys.stdout.write("\n")
print('=' * calendar_width)
print("   MON   TUE   WED   THU   FRI   SAT   SUN")
print('=' * calendar_width)

# establish a calendar
# calendar = [[0] * 7] * 6 # can not do like this! change a number then change a column
calendar = [[0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0]]

days_count = 0
if not IsLeapYear(int(cur_year)):
    days_count = days_in_month[int(cur_month) - 1]
else:
    days_count = days_in_month_leap[int(cur_month) - 1]

for i in range(0, days_count):
    x = (first_day_in_cur_month + i) // 7
    y = (first_day_in_cur_month + i) % 7
    calendar[x][y] = i + 1
    

# print calendar
for i in range(0, 6):
    
    if(i != 0 and calendar[i][0] == 0): # no more days to output then break
        break;

    sys.stdout.write(" " * 3)
    for j in range(0, 7):
        str_date = str(calendar[i][j])
        sys.stdout.write(" ")
        if str_date == "0":
            sys.stdout.write("  ")
        elif len(str_date) == 1:
            sys.stdout.write(str_date)
            sys.stdout.write(" ")
        else:
            sys.stdout.write(str_date)
        sys.stdout.write(" " * 3)
    sys.stdout.write("\n")

# print the end line
print('=' * calendar_width)
print()

# os.system('pause')

 

补充说明:使用 Visual Studio 上的 Python 插件时,调试时要设置命令行输入参数,需要进行如下两步

1)项目→Calendar属性(Calendar为项目名)

2)在属性界面的Debug选项卡中,设置“Script Arguments”,这个程序的输入为“2014 10”

优化:(2014年12月31日)

这3个优化的地方都需要引用calendar,设变量year存储年,变量month存储月

1)遍历一个月的所有天,在本文的代码中,用range(0, days_count),

可以用calendar.monthrange(year, month)代替

2)找出一个月的第一天是星期几,之前用first_day_in_cur_month保存,

可以用calendar.weekday(year, month, 1)代替

calendar.weekday函数中,星期一则返回0,星期二则返回1,以此类推,星期日返回6

3)日历矩阵可以直接用calendar.monthcalendar(year, month)得出

END

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!