python打印日历,用到lambda和functools.reduce
最近老师叫我们用函数式编程,我以为用个def就算函数了,结果要“函数式”,百度了一下,大概是要用到lambda,reduce,filter,map,sorted这些玩意,这里有个函数式编程的链接:北风吹沙
下面是我的代码,怎样,很短很简洁吧
from functools import reduce
#判断闰年
isrun=lambda y:not y%4 if y%100 else not y%400
#用两个数组记录某个月有多少天
l =[0,31,29,31,30,31,30,31,31,30,31,30,31]
ll=[0,31,28,31,30,31,30,31,31,30,31,30,31]
#返回该年之前一共有多少天
yearday=lambda y:365*(y-1)+(y-1)//4-(y-1)//100+(y-1)//400
#返回这年该月之前一共有多少天
f=lambda x,y:x+y
monthday=lambda y,m:reduce(f,l[0:m]) if isrun(y) else reduce(f,ll[0:m])
#返回之前一共有多少天
beforeday=lambda y,m:yearday(y)+monthday(y,m)#只是个加法,但为了美观,我特意写了个函数
#打印
def printcalendar(y,m):
if y<=0 or m<=0 or m>12:
print("年份或月份超出范围")
return None
print(y,"年",m,"月")
print(" Mon Tue Wen Thu Fri Sat Sun")
count=beforeday(y,m)%7
print(" "*count,end='')#补充空格
monthday=ll[m]
if isrun(y):#如果是闰年,那么覆盖掉之前的monthday变量
monthday=l[m]
for i in range(1,monthday+1):
if count==7:
print()
count=0
print("%4d"%i,end='')
count+=1
if __name__=='__main__':
y=int(input("请输入年份:"))
m=int(input("请输入月份:"))
printcalendar(y,m)
运行结果: