"""
题目:输入某年某月某日,判断这一天是这一年的第几天?
"""
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()

  

python学习——练习题(4)的更多相关文章

  1. python学习——练习题(10)

    """ 题目:暂停一秒输出,并格式化当前时间. """ import sys import time def answer1(): &quo ...

  2. python学习——练习题(9)

    """ 题目:暂停一秒输出. 程序分析:使用 time 模块的 sleep() 函数. http://www.runoob.com/python/python-date- ...

  3. python学习——练习题(6)

    """ 题目:斐波那契数列. 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21 ...

  4. python学习——练习题(1)

    """ 题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? """ import itertools d ...

  5. python学习——练习题(13)

    """ 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个" ...

  6. python学习——练习题(12)

    """ 题目:判断101-200之间有多少个素数,并输出所有素数. 质数(prime number)又称素数,有无限个. 质数定义为在大于1的自然数中,除了1和它本身以外 ...

  7. python学习——练习题(11)

    """ 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1 1 2 ...

  8. python学习——练习题(8)

    """ 题目:输出 9*9 乘法口诀表. """ def answer1(): """ 自己用最普通的双重循环 ...

  9. python学习——练习题(7)

    """ 题目:将一个列表的数据复制到另一个列表中. """ import copy def validate(a, b): "&q ...

随机推荐

  1. mysql-in关键字,分组查询,分页查询

    1. in关键字,组查询 # 使用or来查询的化,不方便而且参数一多比较傻 select * from users where id=1 or id=2 or id=4; select * from ...

  2. ionic2常见问题——修改应用图标及添加启动画面(官方命令行工具自动生成)

    1.项目根目录->resources 分别存放应用图标及添加启动画面,替换成自己的图案既可. 2.这样在命令行中重新运行ionic resources ,就能看到应用图标和名字已经被替换了: 3 ...

  3. 【51nod-1046】最大子矩阵和

    一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值.   例如:3*3的矩阵:   -1 3 -1 2 -1 3 -3 1 2   和最大的子矩阵是:   3 ...

  4. unity 事件顺序及功能说明

    unity3d中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. Awake 当 ...

  5. MPLS基础一

    多协议标签交换(MPLS) 是一种用于快速数据包交换和路由的体系,具有管理各种不同形式通信流的机制. 内容:RID     /     MTU     /      认证    /     TTL   ...

  6. Ubuntu 中 java 环境 (sunjdk) 的配置 (附详细说明)

    暑假以来为了鼓捣双系统废了很大的劲儿,本来一股脑想装 CentOS,无奈怎么处理分区引导都不能成功地与 Win8 共存,最终用 Ubuntu 一句 "检测到系统上有 Windows Boot ...

  7. flash游戏服务器安全策略

     在网页游戏开发中,绝大多数即时通信游戏采用flash+socket 模式来作为消息数据传递.在开发过程中大多数开发者在开发过程中本地没有问题,但是一旦部署到了网络,就存在连接上socket服务器.究 ...

  8. LeetCode 616. Add Bold Tag in String

    原题链接在这里:https://leetcode.com/problems/add-bold-tag-in-string/description/ 题目: Given a string s and a ...

  9. oscache源码浅析

    oscache作为本地缓存框架,存储模型依然是通用的缓存键值对模型.oscache使用HashTable存放数据,我们看下源码: GeneralCacheAdministrator: /** * Ge ...

  10. the road of test

    1.firefox打印兼容问题: <HTML> <HEAD> <TITLE>JavaScript利用IE内置打印控件IEWebBrowser进行打印/打印页面设置/ ...