pyhton面试100题及其扩展思考之3 常用的功能模块

这个就比较多了,会花点时间慢慢整理,持续更新

  1. 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__的一种补充:

  1. 它是模块公开接口的一种约定,当在其他文件 使用 from xxx import * 的方式导入该文件时,只会导入__all__列出的成员,其他成员都被排除在外
  2. 控制from xxx import * 的行为,避免弄脏当前的命名空间,如果__all__ 定义有误,还会明确地抛出异常,方便检查错误
  3. 为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 的警告
  4. 定义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",
]

太多了, 慢慢更新吧…

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值