最pythonic的闰年判定

限定最大四位输入年份,分1582年前后新/旧规则计算闰年。


(笔记模板由python脚本于2024年10月30日 09:38:43创建,本篇笔记适合喜欢python,有python基础编程能力的coder翻阅)


【学习的细节是欢悦的历程】


  自学并不是什么神秘的东西,一个人一辈子自学的时间总是比在学校学习的时间长,没有老师的时候总是比有老师的时候多。
            —— 华罗庚


等风来,不如追风去……


限定最大四位年份
闰 年 判 定
(分1582年前后新/旧规则计算)


本文质量分:

97 97 97

本文地址: https://blog.csdn.net/m0_57158496/article/details/143356740

CSDN质量分查询入口:http://www.csdn.net/qc


目 录

  • ◆ 最pythonic的闰年判定
    • 1、涉及知识点及“代码技巧”
    • 2、公元纪年及闰年概念
    • 3、is_leapyear“初稿”
    • 5、if “0”值的书写形式
    • 6、优雅的pythonic代码
    • 7、“四位有效年份”限定
    • 8、“闰年判定”完整源码(Python)


◆ 最pythonic的闰年判定


1、涉及知识点及“代码技巧”


知识点


  • 1582年以前,闰年规则是“四年一闰”

  • 1582年及以后新规:四年一闰,但整除100不可以整除400,不是闰年

  • 公元元年是1年,它的上一年是-1(没有公元0年)


代码技巧


  • 三元操作:简洁代码

  • 链式比较:简化判断逻辑

  • 逻辑非:not反转bool结果


代码支行效果


  • 截屏图片
    qpython
    在这里插入图片描述
    Zero Linux
    在这里插入图片描述



回页目录


2、公元纪年及闰年概念


  • 资料截屏
    在这里插入图片描述



回页目录


3、is_leapyear“初稿”


is_leapyear“初稿”


def is_leapyear(year: int) -> bool:
    ''' 闰年判定
    
    1、1582年以前,闰年规则是“四年一闰”
    2、1582年及以后新规:四年一闰,但整除100不可以整除400,不是闰年。
    3、公元从公元1年开始,即公元元年(1)的上一年是-1(公元前1年)。公元没有0后!
    '''
    if not year: # 排除0
        raise ValueError(f"{' 年份没有0年,公元元年是1年 ':-^30}")
    elif year < 1582: # 老规
        if not year%4:
            return True
    else: # 新规
        if not year%400 or year%4 and year%100:
            return True
    

  • 代码逻辑有“误区”
    在这里插入图片描述

  • 与ai探讨闰年逻辑
    在这里插入图片描述



回页目录


5、if “0”值的书写形式


  • 与ai探讨“0”值if的代码书写形式
    在这里插入图片描述



回页目录


6、优雅的pythonic代码


is_leapyear优雅pythonic修正


def is_leapyear(year: int) -> bool:
    ''' 闰年判定
    
    1、1582年以前,闰年规则是“四年一闰”
    2、1582年及以后新规:四年一闰,但整除100不可以整除400,不是闰年。
    '''
    return year%4 == 0 if year < 1582 else year%400 == 0 or (year%4 == 0 and year%100 != 0)


  • 三元操作
    优雅地用三元操作把闰年判定逻辑条件,“串联”浓缩为一条python语句,极尽优雅简洁,易读易解。😎😎



回页目录


7、“四位有效年份”限定


代码


def main() -> None:
    try:
        year = int(input(f"\n\n{' 闰年判定 ':=^38}\n\n\n\n{'(-9999至9999之间为有效年份)':-^30}\n\n{'输入年份:':>14}").strip()) # 接收键盘输入并转int 

        # 本程序只处理四位年份,因为四位年份已经涵盖“真实世界”纪年实用。另公元元年是1年,它的上一年是-1
        #if year < -9999 or year == 0 or year > 9999:
        if not (-10000 < year < 9999 and year != 0):
            print(f"\n\n{' 无效年份 ':-^38}\n\n\n\n{' 程序已退出!':=^36}\n")
            return 

    except ValueError as e:
        print(f"{' 年份错误 ':-^38}\n\n异常提示:{e}\n\n\n\n{' 程序已退出!':=^36}\n")


  • 两种表达
    a、if year < -9999 or year == 0 or year > 9999
    b、if not (-10000 < year < 9999 and year != 0)
    在这里插入图片描述

  • 详细解析
    在这里插入图片描述

  • 总结
    在这里插入图片描述



回页目录


8、“闰年判定”完整源码(Python)


  • 代码运行效果
    在这里插入图片描述

  • ai学伴的肯定
    在这里插入图片描述

  • 完整脚本
    (源码较长,点此跳过源码)
#!/usr/bin/env python3


all = ['is_leapyear']


def is_leapyear(year: int) -> bool:
    ''' 闰年判定
    
    1、1582年以前,闰年规则是“四年一闰”
    2、1582年及以后新规:四年一闰,但整除100不可以整除400,不是闰年。
    '''
    return year%4 == 0 if year < 1582 else year%400 == 0 or (year%4 == 0 and year%100 != 0)


def main() -> None:
    try:
        year = int(input(f"\n\n{' 闰年判定 ':=^38}\n\n\n\n{'(-9999至9999之间为有效年份)':-^32}\n\n{'输入年份:':>14}").strip()) # 接收键盘输入并转int 

        # 本程序只处理四位年份,因为四位年份已经涵盖“真实世界”纪年实用。另公元元年是1年,它的上一年是-1
        #if year < -9999 or year == 0 or year > 9999:
        if not (-10000 < year < 9999 and year != 0):
            print(f"\n\n{' 无效年份 ':-^38}\n\n\n\n{' 程序已退出!':=^36}\n")
            return 

    except ValueError as e:
        print(f"{' 年份错误 ':-^38}\n\n异常提示:{e}\n\n\n\n{' 程序已退出!':=^36}\n")

    # 输出
    leapyear = '闰' if is_leapyear(year) else '平'
    print(f"\n\n{'':-^42}\n\n{'':>14}{year:0>4}年,是{leapyear}年。\n\n{'':=^42}\n")
   
    
if __name__ == '__main__':
    main()



回页首


上一篇:  与ai聊我的代码架构(以包目录结构模块,以*.py脚本收纳模块)
下一篇: 



我的HOT博:

  本次共计收集 311 篇博文笔记信息,总阅读量43.82w。数据于2024年03月22日 00:50:22完成采集,用时6分2.71秒。阅读量不小于6.00k的有 7 7 7篇。


推荐条件 阅读量突破6.00k
(更多热博,请点击蓝色文字跳转翻阅)

  • 截屏图片
    在这里插入图片描述
      (此文涉及ChatPT,曾被csdn多次下架,前几日又因新发笔记被误杀而落马。躺“未过审”还不如回收站,回收站还不如永久不见。😪值此年底清扫,果断移除。留此截图,以识“曾经”。2023-12-31)



回页首


老齐漫画头像

精品文章:

来源:老齐教室


Python 入门指南【Python 3.6.3】


好文力荐:


CSDN实用技巧博文:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦幻精灵_cq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值