Python | “万年历——日期查询”

图文编辑:逻辑熊猫 图片来源:网络与截图 欢迎朋友圈各种姿势转发

一个软件的关键在于

你想用它来做什么

一、功能描述

  • 查询日期如:wnl.py 2007/01/01
  • 显示月日历:wnl.py 2007/01

二、源代码

from sys import *

Weeks = ['Sun', "Mon", 'Tus', 'Wed', 'Thu', 'Fri', 'Sat']   
    
try :
    date_in = argv[1]
except:
    print('\n ERROR! you forgot to enter the date you want to view\n')
    date_in = input("Please input a date!\n > ")
    
# print(date_in)
year, month, day = date_in.split('/')
try :
    year, month, day = int(year), int(month), int(day)
except :
    year = int(year)
    month = int(month)
    day = 0

if month < 1 or month > 12:
    print('\n ERROR! the entered MONTH is invalid\n')
    exit()

# 判断闰年,同时得到d用来计算日差,m2为闰月标记
if year > 2000:
    d = (year-1-2000)//4-(year-1-2000)//100+(year-1-2000)//400+1
elif year == 2000:
    dy = 0
    m2 = 1
else:
    d = (year-2000)//4-(year-2000)//100+(year-2000)//400

dy=(year-2000)+d
if (year%4==0 and year%100 != 0) or (year%100==0 and year%400==0):
    m2 = 1
else:
    m2 = 0

# 为精简代码行数,使用下面格式
# 判断每月天数
if month == 1 : dm = 0; month = 31
elif month == 2 : 
    dm = 3
    if d == 1 :
        month = 29
    else:
        month = 28
elif month == 3 : dm = 3 + m2; month = 31
elif month == 4 : dm = 6 + m2; month = 30
elif month == 5 : dm = 1 + m2; month = 31
elif month == 6 : dm = 4 + m2; month = 30
elif month == 7 : dm = 6 + m2; month = 31
elif month == 8 : dm = 2 + m2; month = 31
elif month == 9 : dm = 5 + m2; month = 30
elif month == 10 :dm = m2;   month = 31
elif month == 11 :dm = 3 + m2; month = 30
elif month == 12 :dm = 5 + m2; month = 31
else:
    print("What is it?")

if day < 0 or day > month :
    print("\n Error! The entered Day is invalid\n")
    exit()

# 判断该日期为星期几,若参数为月,则用来判断该月第一天为星期几
week = (dy + dm + day - 1 + 6) % 7

if week < 0 :
    week += 7

if day > 0:
    if week == 0:   WEEK = Weeks[0]
    elif week == 1:  WEEK = Weeks[1]
    elif week == 2:  WEEK = Weeks[2]
    elif week == 3:  WEEK = Weeks[3]
    elif week == 4:  WEEK = Weeks[4]
    elif week == 5:  WEEK = Weeks[5]
    elif week == 6:  WEEK = Weeks[6]
    else:
        pass
    print("\n this day is ", WEEK, "(",int(week),")"+ "\n OK!\n")
else:
    week = (week+1) % 7
    # 格式化输出
    print("\n the calender of this month as following")
    print("\n ***************************************")
    print(" SUN  MON  TUR  WEN  THU  FRI  STA\n")
    for i in range(int(week)):
        print("    ", end = ' ')
    for i in range(1, month+1):
        print(" %2d "%i, end = ' ')
        if (week+1) % 7 == 0 and i != month :
            print("\n")
        week = week + 1
    print("\n****************************************\n")
    print("\n OK! \n")

三、代码拆解

  • 参数获取:
    • 如果想要从操作系统获取参数,需要使用sys模块。
    • 为使调试方便,增加了手动输入参数的功能,输入参数的格式应该正确,否则会报错
      • 如:2007/01/01
      • 或:2007/01/
    • 日期判断:
      • 使用了dy,dm等参数表示一年中的日差和一月中的日差。m2为闰月的标志以及作为一个日差来使用。
      • 使用到的公式:
week = (dy + dm + day - 1 + 6) % 7
dy=(year-2000)+d
if year > 2000:
   d = (year-1-2000)//4-(year-1-2000)//100+(year-1-2000)//400+1
elif year == 2000:
   dy = 0
   m2 = 1
else:
   d = (year-2000)//4-(year-2000)//100+(year-2000)//400
  • 代码备注:
    • print()打印月日历时,将end设置为空格。否则会换行,每行仅剩一个数字
    • dm从每个月的判断中获得,由于python未提供switch相关的功能,这里只能使用if-elif-else格式
    • 为减少代码行数,使用“;”使一行中可以写下多个语句
    • 该程序中基本年为2000年。

四、笔者评述

这是一个简单小程序,从这个程序说明,对于编程而言,有一定的数学基础是比较重要的,除此之外锻炼逻辑思维能力可以提高编程能力。

从实用性角度来讲,这并不是一个有用的程序,但是作为学习,是非常不错的。

代码的优化力度不大,但是可优化空间很大,这是一个简单的实现,从操作性上来讲,比较头疼,比如,不能连续查询,对参数格式比较依赖等。

五、思考

关于此代码的不足,请读者们在学习或者作为积累代码库的时候,尝试修改代码,比如给代码添加连续查询功能,让参数的格式变得自由,或者给程序带上参数,增加新的功能等。

六、结尾

功能简介:领域包括了「面向 Python 基础,进阶和有趣应用」的一站式技术分享,挖掘学习者在学习当中遇到的各类问题并分享经验,关注实用技能和有趣新闻,感兴趣的推荐关注。

原文发布于微信公众号 - 逻辑熊猫带你玩Python(LogicPanda)

原文发表时间:2018-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

书写高质量代码之状态维护

状态之始 我们第一眼接触新事物所触发的思考方式,决定了以后我们看待这样事物的角度,进而影响更深层次的理解和行为。 编程相对于人类历史的进程而言,不过是个六七岁孩...

37550
来自专栏北京马哥教育

Python新手应该如何练手?知乎5600赞答案告诉你!

作者:小小搬运工 链接:https://www.zhihu.com/question/29372574/answer/88624507 一直在学习python,...

42570
来自专栏java一日一条

有经验的Java开发者和架构师容易犯的10个错误(上)

首先允许我们问一个严肃的问题?为什么Java初学者能够方便的从网上找到相对应的开发建议呢?每当我去网上搜索想要的建议的时候,我总是能发现一 大堆是关于基本入门的...

8520
来自专栏Jimoer

Java设计模式学习记录-责任链模式

 已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式)。

14420
来自专栏Java3y

纳税服务系统七(投诉管理模块)【显示投诉信息、处理回复、我要投诉、Quartz自动受理、统计图FusionCharts】

投诉受理管理模块 接下来,就是来开发我们的投诉受理管理模块了…..我们来看看原型图与需求吧: 查询用户提交的投诉信息,可以根据投诉部门(部门A/B)、投诉时间段...

63970
来自专栏狮乐园

【译】Understanding SOLID Principles - Dependency Inversion

当我们在读书,或者在和一些别的开发者聊天的时候,可能会谈及或者听到术语SOILD。在这些讨论中,一些人会提及它的重要性,以及一个理想中的系统,应当包含它所包含的...

10430
来自专栏Java学习网

面向对象设计的 10 条戒律

不,这不是上帝说的。 这也不是Jon Skeet / Martin Fowler / Jeff Atwood / Joel Spolsky(可以用你最喜欢的技术...

30530
来自专栏平凡文摘

成为java高级程序员需要掌握哪些

23730
来自专栏Golang语言社区

Golang语言社区--Go基础课程第一节聊聊Go语言

提及Go语言,有些人还是很陌生,不过更多的人是有所耳闻;还有一些人已经开始接触学习了。越来越多的人开始留意她,特别是再大数据下Go语言本身层面支...

574150
来自专栏CDA数据分析师

Python进阶学习之阅读代码

起因 最近在公司的任务是写一些简单的运营工具,因为是很小的工具,所以就用了github上面的一个开源项目flask-admin,可以省去很多的事情。 但是,这个...

30070

扫码关注云+社区

领取腾讯云代金券