这个就比较多了,会花点时间慢慢整理,持续更新
- OS, 2. SYS, 3. time, 4. datetime, 5. math, 6. re, 7. pandas, 8. openpyxl, 9. threading, 10. … 太多了
首先还是先从datetime 模块写起吧,感觉这个模块是任何程序员工作中都必然会碰到的,而且也容易忘记的一个模块
一、datetime
首先看看datetime 源码
__all__ = ("date", "datetime", "time", "timedelta", "timezone", "tzinfo",
"MINYEAR", "MAXYEAR")
datetime 模块提供用于处理日期和时间的类。
其常用的 类对象有 timedelta
, date
, datetime
, time
1.1 timedelta 类对象
提供 从微秒到星期级别的时间计算(±*/)
class datetime.timedelta(
days=0, seconds=0, microseconds=0,
milliseconds=0, minutes=0, hours=0, weeks=0)
所有参数都是可选的并且默认为 0。 这些参数可以是整数或者浮点数,也可以是正数或者负数。
只有 days, seconds 和 microseconds 会存储在内部。
class:timedelta 用法示例
一个标准化的附加示例:
>>> # Components of another_year add up to exactly 365 days
>>> from datetime import timedelta
>>> year = timedelta(days=365)
>>> another_year = timedelta(weeks=40, days=84, hours=23,
... minutes=50, seconds=600)
>>> year == another_year
True
>>> year.total_seconds()
31536000.0
timedelta 算术运算的示例:
>>> from datetime import timedelta
>>> year = timedelta(days=365)
>>> ten_years = 10 * year
>>> ten_years
datetime.timedelta(days=3650)
>>> ten_years.days // 365
10
>>> nine_years = ten_years - year
>>> nine_years
datetime.timedelta(days=3285)
>>> three_years = nine_years // 3
>>> three_years, three_years.days // 365
(datetime.timedelta(days=1095), 3)
1.2 date 对象
date 对象代表一个理想化历法中的日期(年、月和日),即当今的格列高利历向前后两个方向无限延伸。
公元 1 年 1 月 1日是第 1 日,公元 1 年 1 月 2 日是第 2 日,依此类推。
class datetime.date(year, month, day)
所有参数都是必要的。 参数必须是在下面范围内的整数:
· MINYEAR <= year <= MAXYEAR
· 1 <= month <= 12
· 1 <= 日期 <= 给定年月对应的天数
如果参数不在这些范围内,则抛出 ValueError 异常
使用举例
>>> import time
>>> from datetime import date
>>> today = date.today()
>>> today
datetime.date(2007, 12, 5)
>>> today == date.fromtimestamp(time.time())
True
>>> my_birthday = date(today.year, 6, 24)
>>> if my_birthday < today:
... my_birthday = my_birthday.replace(year=today.year + 1)
>>> my_birthday
datetime.date(2008, 6, 24)
>>> time_to_birthday = abs(my_birthday - today)
>>> time_to_birthday.days
202
更多例子
>>> from datetime import date
>>> d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
>>> d
datetime.date(2002, 3, 11)
>>> # Methods related to formatting string output
>>> d.isoformat()
'2002-03-11'
>>> d.strftime("%d/%m/%y")
'11/03/02'
>>> d.strftime("%A %d. %B %Y")
'Monday 11. March 2002'
>>> d.ctime()
'Mon Mar 11 00:00:00 2002'
>>> 'The {1} is {0:%d}, the {2} is {0:%B}.'.format(d, "day", "month")
'The day is 11, the month is March.'
>>> # Methods for to extracting 'components' under different calendars
>>> t = d.timetuple()
>>> for i in t:
... print(i)
2002 # year
3 # month
11 # day
0
0
0
0 # weekday (0 = Monday)
70 # 70th day in the year
-1
>>> ic = d.isocalendar()
>>> for i in ic:
... print(i)
2002 # ISO year
11 # ISO week number
1 # ISO day number ( 1 = Monday )
>>> # A date object is immutable; all operations produce a new object
>>> d.replace(year=2005)
datetime.date(2005, 3, 11)
其它构造器,所有的类方法:
classmethod date.today()
返回当前的本地日期。
这等价于 date.fromtimestamp(time.time())。
classmethod date.fromtimestamp(timestamp)
返回对应于 POSIX 时间戳的当地时间,例如 time.time() 返回的就是时间戳。
这可能引发 OverflowError,如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,并且会在 localtime() 出错时引发 OSError。 通常该数值会被限制在 1970 年至 2038 年之间。 请注意在时间戳概念包含闰秒的非 POSIX 系统上,闰秒会被 fromtimestamp() 所忽略。
在 3.3 版更改: 引发 OverflowError 而不是 ValueError,如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,并会在 localtime() 出错时引发 OSError 而不是 ValueError。
classmethod date.fromordinal(ordinal)
返回对应于预期格列高利历序号的日期,其中公元 1 年 1 月 1 晶的序号为 1。
除非 1 <= ordinal <= date.max.toordinal() 否则会引发 ValueError。对于任意日期 d,date.fromordinal(d.toordinal()) == d。
classmethod date.fromisoformat(date_string)
返回一个对应于以 YYYY-MM-DD 格式给出的 date_string 的 date 对象:
>>> from datetime import date
>>> date.fromisoformat('2019-12-04')
datetime.date(2019, 12, 4)
这是 date.isoformat() 的逆操作。 它只支持 YYYY-MM-DD 格式。
3.8 新版功能.
类属性:
date.min
最小的日期 date(MINYEAR, 1, 1) 。
date.max
最大的日期 ,date(MAXYEAR, 12, 31)。
date.resolution
两个日期对象的最小间隔,timedelta(days=1)。
实例属性(只读):
date.year
在 MINYEAR 和 MAXYEAR 之间,包含边界。
date.month
1 至 12(含)
date.day
返回1到指定年月的天数间的数字。
date.strftime(format)
返回一个由显式格式字符串所指明的代表日期的字符串。 表示时、分或秒的格式代码值将为 0。 要获取格式指令的完整列表请参阅 strftime() 和 strptime() 的行为。
1.3 datetime 对象
datetime 对象是包含来自 date 对象和 time 对象的所有信息的单一对象。
与 date 对象一样,datetime 假定当前的格列高利历向前后两个方向无限延伸;与 time 对象一样,datetime 假定每一天恰好有 3600*24 秒。
构造器 :
class datetime.datetime(
year, month, day,
hour=0, minute=0, second=0,
microsecond=0, tzinfo=None, *, fold=0)
year, month 和 day 参数是必须的。 tzinfo 可以是 None 或者是一个 tzinfo 子类的实例。 其余的参数必须是在下面范围内的整数:
MINYEAR <= year <= MAXYEAR,
1 <= month <= 12,
1 <= day <= 指定年月的天数,
0 <= hour < 24,
0 <= minute < 60,
0 <= second < 60,
0 <= microsecond < 1000000,
fold in [0, 1].
如果参数不在这些范围内,则抛出 ValueError 异常。
3.6 新版功能: 增加了 fold 参数。
其它构造器,所有的类方法:
classmethod datetime.today()
返回表示当前地方时的 datetime 对象,其中 tzinfo 为 None。
等价于:
datetime.fromtimestamp(time.time())
cookies:
__all__
:
针对__all__的一种补充:
- 它是模块公开接口的一种约定,当在其他文件 使用 from xxx import * 的方式导入该文件时,只会导入__all__列出的成员,其他成员都被排除在外
- 控制from xxx import * 的行为,避免弄脏当前的命名空间,如果__all__ 定义有误,还会明确地抛出异常,方便检查错误
- 为lint 等代码检错工具提供辅助
编写库时,经常会在 init.py 中暴露整个包的 API,而这些 API 的实现可能是在包的其他模块中。如果仅仅这样写:from xxx import a, b,一些代码检查工具,如 pyflakes 会报错,认为变量 a和 b import 了但没被使用。一个可行的方法是把这个警告压掉:from xxx import a, b # noqa (No Q/A,即无质量保证),但更好的方法是显式定义 all,这样代码检查工具就会理解,从而不再报 unused variables 的警告- 定义all 需要注意的地方
4.1:__all__
的形式只能是list 类型,如写其他类型,代码审查工具可能无法识别
4.2 不能动态生成__all__
4.3 按照PEP8 建议的风格,__all__
应该写在所有 import 语句下面,函数,常量等成员定义的上面
4.4 如果一个模块需要暴露的接口改动频繁,__all__
可以定义为 :
__all__ = [
"date",
"datetime",
"time",
"timedelta",
"timezone",
"tzinfo",
"MINYEAR",
"MAXYEAR",
]
太多了, 慢慢更新吧…