算法小题目练习

计算今年还剩余多少天

#!/usr/bin/env python

import sys
import logging
from collections import OrderedDict

__author__ = 'thomas'

logging.basicConfig(level='DEBUG')
logger = logging.getLogger('main')


def get_current_days_of_year(year: int, month: int, day: int):

        assert 0 < month < 13
        assert 0 < day < 32
        assert 1800 <= year <= 9999

        # 闰年
        if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
            spec_dict = {2: 29}
        else:
            spec_dict = {2: 28}

        min_month = {4, 6, 9, 11}
        max_month = [1, 3, 5, 7, 8, 10, 12]

        if (month in min_month and day == 31) or (month == 2 and day > spec_dict.get(month)):
            raise ValueError('月份:"{}"与日期"{}"不匹配')

        min_dict = dict.fromkeys(min_month, 30)
        max_dict = dict.fromkeys(max_month, 31)

        month_days = OrderedDict(
            sorted(min_dict.items() | max_dict.items() | spec_dict.items(),
                   key=lambda item: item[0])
        )
        # 计算月份所得天数和日子之和
        count = 0
        for key, value_ in month_days.items():
            if month <= key:
                break
            count += value_
            logger.info(count)
        count += day
        return count

if __name__ == '__main__':

    if len(sys.argv) < 2:
        logger.error('脚本执行错误,请输入日期参数, 如 "python get_date_days.py 2016/3/30" ')
        exit(1)

    value = sys.argv[1]
    logger.debug(value)
    try:
        date = [int(num) for num in value.split('/')]
    except ValueError:
        raise ValueError('日期 "{}" 输入错误,请输入类似于 2016/3/30 这样以斜杆分割的日期'.format(value))

    if len(date) != 3:
        raise ValueError('日期 "{}" 输入错误,请输入类似于 2016/3/30 这样以斜杆分割的日期'.format(value))

    days = get_current_days_of_year(*date)

    print('这是今年的第{}天,今年还剩余{}天!'.format(days, 365-days))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值