python打印日历,函数式编程

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)

运行结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值