zoukankan      html  css  js  c++  java
  • python学习——练习题(4)

    """
    题目:输入某年某月某日,判断这一天是这一年的第几天?
    """
    import datetime
    import time
    from functools import reduce
    
    
    def calculate1(t):
        """
        直接利用python的datetime模块计算
        :param t:
        :return:
        """
        print("计算一", end=":")
        print(t.strftime("%j"))
    
    
    def calculate2(t):
        """
        自己手动计算一下
        :param t:
        :return:
        """
        print("计算二", end=":")
        days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        daysLeap = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        year = t.year
        if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
            print(sum(daysLeap[:t.month - 1]) + t.day)
        else:
            print(sum(days[:t.month - 1]) + t.day)
    
    
    def calculate3(t):
        """
        高手简化后的calculate2
        :param t:
        :return:
        """
        print("计算三", end=":")
        days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        year = t.year
        if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
            days[1] = 29
        print(sum(days[0: t.month - 1]) + t.day)
    
    
    def calculate4(t):
        """
        利用字典来计算
        :param t:
        :return:
        """
        print("计算四", end=":")
        dayDict = {0: 0, 1: 31, 2: 59, 3: 90, 4: 120, 5: 151, 6: 181, 7: 212, 8: 243, 9: 273, 10: 304, 11: 334, 12: 365}
        year = t.year
        d = dayDict[t.month - 1] + t.day
        if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):
            d += 1
        print(d)
    
    
    def calculate5(t):
        """
        利用time模块来计算,注意和datetime模块进行区分
        :param t:
        :return:
        """
        print("计算五", end=":")
        t = time.strptime(t.strftime("%Y-%m-%d"), "%Y-%m-%d")
        print(t[7])
    
    
    def calculate6(t):
        """
        利用datetime的时间相减来计算
        :param t:
        :return:
        """
        print("计算六", end=":")
        t1 = datetime.date(t.year, 1, 1)
        t2 = t - t1
        print(t2.days + 1)
    
    
    def calculate7(t):
        """
        利用time的时间相减来计算,注意与datetime进行区分,它不能直接减,需要转成时间戳才能减
        以为时间戳是以1970年为基点计算的,所以该方法只能计算1970以后(不包括1970)的时间
        :param t:
        :return:
        """
        print("计算七", end=":")
        t1 = time.strptime(t.strftime("%Y-01-01"), "%Y-%m-%d")
        t1 = time.mktime(t1)
        t = time.strptime(t.strftime("%Y-%m-%d"), "%Y-%m-%d")
        t = time.mktime(t)
        t2 = t - t1
        t2 = t2 // (3600 * 24)
        print(int(t2) + 1)
    
    
    def calculate8(t):
        """
        利用reduce函数来计算,中间有用到三元运算符
        在Python 3里,reduce()函数已经被从全局名字空间里移除了,它现在被放置在fucntools模块里
        用的话要 先引入 from functools import reduce
        :param t:
        :return:
        """
        print("计算八", end=":")
        year = t.year
        days = [0, 31, 28 if year % 4 else 29 if year % 100 else 28 if year % 400 else 29, 31, 30, 31, 30, 31, 31, 30, 31,
                30, 31]
        print(reduce(lambda a, b: a + b, days[0: t.month]) + t.day)
    
    
    def calculate9(t):
        """
        利用位运算来计算闰年:
        分析 year&3 等价于 year%4:因为二进制转十进制是:2**0+2**1+2**2+。。。,可见2**2之后的都可以被4整除
        同理 year&15 等价 year%16
        根据闰年计算规则我们可以知道:不能被4整除的年份肯定不是闰年,而能被4整除又能被25整数但不能再被16整数的也不是闰年,其余全是闰年
        可得 year%4 or year%16 and !year%25  这些都不是闰年,反之!(year%4 or year%16 and !year%25)为闰年
        转为位运算!(year&3 or year&15  and !(year%25))
        :param t:
        :return:
        """
        print("计算九", end=":")
        days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        year = t.year
        if not(year & 3 or year & 15 and not(year % 25)):
            days[1] = 29
        print(sum(days[0: t.month - 1]) + t.day)
    
    
    def answer():
        """
        通过try来判断输入的日期是否正确
        :return:
        """
    
        year = input("输入年:")
        if year == "q":
            return
        month = input("输入月:")
        day = input("输入日:")
        try:
            t = datetime.date(int(year), int(month), int(day))
            calculate1(t)
            calculate2(t)
            calculate3(t)
            calculate4(t)
            calculate5(t)
            calculate6(t)
            calculate7(t)
            calculate8(t)
            calculate9(t)
        except ValueError:
            print("输入的日期错误")
        print("继续,或输入q推出")
        answer()
    
    
    answer()
    

      

  • 相关阅读:
    Web用户控件
    ASP.Net状态管理读书笔记--思维导图
    网站教学 提纲总结到ajax结束后面还有
    ajax文本空输入显示用户信息
    Ajax 下拉列表联动显示
    用Ajax删除的做法
    Findora:引入保密性和可审计的区块链
    角逐云计算的“新黄金十年”,谁将胜出?
    区块链世界的中心应该是什么?
    边缘计算2.0时代存在哪些挑战?
  • 原文地址:https://www.cnblogs.com/longphui/p/8000652.html
Copyright © 2011-2022 走看看