【作业】2022.7.6 写一个自己的cal函数

在linux中用vim写日历函数,基本功能有:

  1. 输入月和年,输出日历
  2. 如果不输入月,但有年,则输出1-12月日历
  3. 如果都不输入,则输出当前日历
  4. 如果输入月,但不输入年,则默认今年

vim own_cal.py

import datetime


def first_day(m, y):
    # 计算出公式中需要的m, y, c 
    if m == 1 or m == 2:
        m += 12
        y -= 1
    
    c = y // 100
    y %= 100
    
    # 计算并返回每月第一天是星期几 
    return (y + y//4 + c//4 - 2 * c + 26 * (m+1) // 10) % 7

def is_leap_year(y):
    # 判断闰年 
    return  1 if (y % 100 != 0 and y % 4 == 0) or (y % 400 == 0) else 0 
    
def total_days(m, isleap):
    # 判断天数
    return 31 if m in [1, 3, 5, 7, 8, 10, 12] else (
        isleap + 28 if m == 2 else 30
    )


def get_cal(first_day, total_days): 
    # 创建cal列表
    cal = ['日', '一', '二', '三', '四', '五', '六']
    
    # 获得日历第一排的空格数
    for i in range(first_day):
        cal.append('  ')

    # 获得剩余的日期
    for i in range(1, total_days + 1):
        cal.append(f'{i: <2}')

    return cal


def draw_cal(cal):
    # 创建计数变量t
    t = 0

    for i in cal:
        # t是7的倍数时换行,其他时候空格
        print(f'\n{i}', end='') if t % 7 == 0 else print(f' {i}', end='')
        t += 1

    print('\n')


def cal_main(m, y):
    f_day = first_day(m, y)
    isleap = is_leap_year(y)
    t_days = total_days(m, isleap)
    cal = get_cal(f_day, t_days)
    print(f'{y: >7}{m:0>2}月日历')
    draw_cal(cal)
    

if __name__ == '__main__':
    m = input('请输入月份: ')
    y = input('请输入年份: ')
    now_date = datetime.datetime.now()
    
    # 如果m、y都空着就按当前月算, 如果只有m空着就按1-12月算
    m_list = [now_date.month] if m + y == '' else(
        range(1, 13) if m == '' else [int(m)]
    )   
    
    # 如果y空着就按今年算
    y = now_date.year if y == '' else int(y)

    for m in m_list:
        cal_main(m, y)

ESC
shift + :wq

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Sprite.Nym

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

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

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

打赏作者

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

抵扣说明:

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

余额充值