python万年历节气查询_Python -- 万年历

本文介绍如何使用Python编写万年历程序,包括判断闰年、计算指定日期的星期几、格式化输出等功能。通过计算1900年1月1日到目标日期的天数差并取模7,得出星期几。利用格式化输出控制日期对齐,程序支持用户输入年份和月份,展示对应日历。
摘要由CSDN通过智能技术生成

万年历的主要难点:

算出当月一号是星期几

格式化输出字符串

思路:

先指定一个确定了星期几的日期作为参考日期。比如1900/1/1 是星期一。

然后将需要打印万年历的年月算出总天数 -- 参考日期的总天数 = 相差的天数,

对 7 取余,就能得到指定日期是星期几了。算总天数的同时,需要用到 对闰年的判断,和每个月天数的判断,这就是题目提示为什么要算这两个的原因。

格式化输出字符串,因为默认的print每次打印都会换行,Python3 就可以用这个print("%3d"%i,end=''),来不换行输出字符。打印了七次再换行。还有就是用%3d控制打印字符的宽度,就可以对齐了,效果图如下。

日历.png

# -*- coding: utf-8 -*-

def is_leap_year(year):

if (year % 400 == 0 or year % 4 == 0 and year % 100 != 0):

return True

else:

return False

def count_leap_year(year): #算出当年之前的闰年的总个数

count = 0

for i in range(1, year + 1):

if is_leap_year(i):

count += 1

return count

def get_month_days(year, month): #算出当月的天数

if (is_leap_year(year)):

month_days = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

else:

month_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

return month_days[month - 1]

def get_whatday(year, month): #参考的日期,1900年1月1号是星期一

base_days = 1900 * 365 + count_leap_year(1900) #算出1900/1/1的总天数

total_month_days = 0

for i in range(0, month - 1):

total_month_days += get_month_days(year, i) #算出当年前几个月总天数

days = year * 365 + count_leap_year(year) + total_month_days + 1 #算出当年,当月1号的总天数

what_weekday = (days - base_days) % 7 #算出总天数的差值,对7取余数,就能得到星期几了

return what_weekday #当星期一时,返回值为1,星期日,返回值为0

def print_calendar(year,month):

print(" "*4,year,"年",month,"月")

print(" 日","一","二","三","四","五","六") #打印日历头部,汉字和逗号共占3个空格,“日”前加了个空格对齐

weekday = get_whatday(year,month)

spaces = " " #不打印日期时,使用3个空格代替

print("%s"%spaces * (weekday - 1),end='') #打印出第一行的日期,星号表示重复前面的字符串,重复次数为星号后的数

for i in range(1, get_month_days(year,month) + 1):

print("%3d"%i,end='') #拼接出日期字符串,每个日期占3格位置,来对齐。

if (((i - (7 - weekday + 1)) % 7) is 0): #每行打印7次,然后换下一行打印,7 - weekday + 1表示第二行开始的日期

print("")

if __name__ == '__main__':

year = int(input('year:'))

month = int(input('month:'))

print_calendar(year,month)

这次作业学到新知识, 主要就是Python3的格式化输出字符串:

例如print("%3d"%i,end='') ,%3d 代表 i占用3个格的位置输出,可以统一不同位数的数字占用的位置

end = ""表示print输出后不接任何字符,而默认是接换行符的,。而Python2是这样print "", 后面跟个逗号就不会换行,相比之下感觉还是Python3的end = ""的更加灵活。

" "*4 ,这个星号可以对前面的字符串重复拼接,而这个例子表示4个空格的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值