1.python模块
如果你退出 Python 解释器并重新进入,你做的任何定义(变量和方法)都会丢失。因此,如果你想要编写一些更大的程序,为准备解释器输入使用一个文本编辑器会更好,并以那个文件替代作为输入执行。这就是传说中的 脚本。随着你的程序变得越来越长,你可能想要将它分割成几个更易于维护的文件。你也可能想在不同的程序中使用顺手的函数,而不是把代码在它们之间中拷来拷去。
为了满足这些需要,Python 提供了一个方法可以从文件中获取定义,在脚本或者解释器的一个交互式实例中使用。这样的文件被称为 模块;模块中的定义可以 导入 到另一个模块或 主模块 中(在脚本执行时可以调用的变量集位于最高级,并且处于计算器模式)。
模块是包括 Python 定义和声明的文件。文件名就是模块名加上 .py
后缀。模块的模块名(做为一个字符串)可以由全局变量 __name__
得到。例如,你可以用自己惯用的文件编辑器在当前目录下创建一个叫 fibo.py 的文件,录入如下内容:
# Fibonacci numbers module def fib(n): # write Fibonacci series up to n a, b = 0, 1 while b < n: print(b, end=‘ ‘) a, b = b, a+b print() def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result
2.python导入模块
为了加快加载模块的速度,Python 会在 __pycache__
目录下以 module.version.pyc
名字缓存每个模块编译后的版本,这里的版本编制了编译后文件的格式。它通常会包含 Python 的版本号。例如,在 CPython 3.3 版中,spam.py 编译后的版本将缓存为__pycache__/spam.cpython-33.pyc
。这种命名约定允许由不同发布和不同版本的 Python 编译的模块同时存在。
Python 会检查源文件与编译版的修改日期以确定它是否过期并需要重新编译。这是完全自动化的过程。同时,编译后的模块是跨平台的,所以同一个库可以在不同架构的系统之间共享。
Python 不检查在两个不同环境中的缓存。首先,它会永远重新编译而且不会存储直接从命令行加载的模块。其次,如果没有源模块它不会检查缓存。若要支持没有源文件(只有编译版)的发布,编译后的模块必须在源目录下,并且必须没有源文件的模块。
方式1:import fibo
方式2:from shutil import copy
方式3:from shutil import *
这样可以导入所有除了以下划线( _
)开头的命名。
需要注意的是在实践中往往不鼓励从一个模块或包中使用 *
导入所有,因为这样会让代码变得很难读。不过,在交互式会话中这样用很方便省力。
出于性能考虑,每个模块在每个解释器会话中只导入一遍。因此,如果你修改了你的模块,需要重启解释器;或者,如果你就是想交互式的测试这么一个模块,可以用 imp.reload() 重新加载,例如 import imp; imp.reload(modulename)。
部分高级技巧:
- 为了减少一个编译模块的大小,你可以在 Python 命令行中使用 -O 或者 -OO。-O 参数删除了断言语句,-OO 参数删除了断言语句和 __doc__ 字符串。
因为某些程序依赖于这些变量的可用性,你应该只在确定无误的场合使用这一选项。“优化的” 模块有一个 .pyo 后缀而不是 .pyc 后缀。未来的版本可能会改变优化的效果。
- 来自
.pyc
文件或.pyo
文件中的程序不会比来自.py
文件的运行更快;.pyc
或.pyo
文件只是在它们加载的时候更快一些。 - compileall 模块可以为指定目录中的所有模块创建
.pyc
文件(或者使用 -O 参数创建.pyo
文件)
3.使用python模块
这样做不会直接把 fibo
中的函数导入当前的语义表;它只是引入了模块名 fibo
。你可以通过模块名按如下方式访问这个函数:
>>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ ‘fibo‘
如果打算频繁使用一个函数,你可以将它赋予一个本地变量:
>>> fib = fibo.fib >>> fib(500) 1 1 2 3 5 8 13 21 34 55 89 144 233 377
4.python常用模块
Python 带有一个标准模块库,并发布有独立的文档,名为 Python 库参考手册(此后称其为“库参考手册”)。有一些模块内置于解释器之中,这些操作的访问接口不是语言内核的一部分,但是已经内置于解释器了。这既是为了提高效率,也是为了给系统调用等操作系统原生访问提供接口。这类模块集合是一个依赖于底层平台的配置选项。例如,winreg 模块只提供在 Windows 系统上才有。有一个具体的模块值得注意: sys ,这个模块内置于所有的 Python 解释器。变量 sys.ps1
和 sys.ps2
定义了主提示符和辅助提示符字符串:
>>> import sys >>> sys.ps1 ‘>>> ‘ >>> sys.ps2 ‘... ‘ >>> sys.ps1 = ‘C> ‘ C> print(‘Yuck!‘) Yuck! C>
4.1time模块
Python 中提供了对时间日期的多种多样的处理方式,主要是在 time 和 datetime 这两个模块里
在 Python 文档里,time
是归类在Generic Operating System Services
中,换句话说, 它提供的功能是更加接近于操作系统层面的。通读文档可知,time 模块是围绕着 Unix Timestamp 进行的。
该模块主要包括一个类 struct_time
,另外其他几个函数及相关常量。 需要注意的是在该模块中的大多数函数是调用了所在平台C library
的同名函数, 所以要特别注意有些函数是平台相关的,可能会在不同的平台有不同的效果。另外一点是,由于是基于Unix Timestamp,所以其所能表述的日期范围被限定在 1970 - 2038 之间,如果你写的代码需要处理在前面所述范围之外的日期,那可能需要考虑使用datetime
模块更好。文档解释比较费劲,具体看看怎么用:
In [1]: import time In [2]: time.time() Out[2]: 1414332433.345712 In [3]: timestamp = time.time() In [4]: time.gmtime(timestamp) Out[4]: time.struct_time(tm_year=2014, tm_mon=10, tm_mday=26, tm_hour=14, tm_min=7, tm_sec=13, tm_wday=6, tm_yday=299, tm_isdst=0) In [5]: time.localtime(timestamp) Out[5]: time.struct_time(tm_year=2014, tm_mon=10, tm_mday=26, tm_hour=22, tm_min=7, tm_sec=13, tm_wday=6, tm_yday=299, tm_isdst=0) In [6]: struct_time = time.localtime(timestamp) In [7]: time.ctime(timestamp) Out[7]: ‘Sun Oct 26 22:07:13 2014‘ In [8]: time.asctime(struct_time) Out[8]: ‘Sun Oct 26 22:07:13 2014‘ In [9]: time.mktime(struct_time) Out[9]: 1414332433.0 In [10]: time.strftime("%a, %d %b %Y %H:%M:%S +0000", struct_time) Out[10]: ‘Sun, 26 Oct 2014 22:07:13 +0000‘ In [11]: time.strptime("30 Nov 00", "%d %b %y") Out[11]: time.struct_time(tm_year=2000, tm_mon=11, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=335, tm_isdst=-1)
>>> print(time.altzone)#返回与utc时间的时间差,以秒计算
>>> print(time.localtime())#返回本地时间的struct time对象格式
>>> print(time.time())#1970年(UNIX时间诞生日)至今的时间戳(秒)
>>> print(time.gmtime(time.time()))#返回utc时间的struct时间对象格式
>>> print(time.asctime(time.gmtime(time.time())))#返回时间格式"Fri Aug 19 11:14:16 2016",
time.time()获取时间戳
time.gmtime()返回utc时间struct时间对象格式
time.asctime()格式化struct时间对象:"Fri Aug 19 11:14:16 2016"
Python time.ctime()与time.asctime()区别
time.ctime() 函数把一个时间戳(按秒计算的浮点数)转化为time.asctime()的形式。 如果参数未给或者为None的时候,将会默认time.time()为参数。它的作用相当于 asctime(localtime(secs))
>>> print(time.strptime(‘2016-11-11‘,‘%Y-%m-%d‘))#将日期字符串转成struct时间对象格式第一个参数为时间字符串,第二参数为对应的时间格式
>>> print(time.mktime(time.gmtime(time.time())))#将struct时间对象转成时间戳
time.time()获取当前时间戳
time.gmtime()转换utc时间为struct时间对象
time.mktime()将struct时间对象转成时间戳
>>> print(time.strftime(‘%Y-%m-%d‘,time.gmtime()))#将utc struct_time格式转成指定的字符串格式
第一个参数为是时间格式化格式,第二个是struct时间对象
4.1.1 time模块时间字符串与struct时间对象及时间戳转化关系(鸭子图)
4.1.2datetime模块
datetime 比 time 高级了不少,可以理解为 datetime 基于 time 进行了封装,提供了更多实用的函数。在datetime 模块中包含了几个类,具体关系如下:
object timedelta # 主要用于计算时间跨度 tzinfo # 时区相关 time # 只关注时间 date # 只关注日期 datetime # 同时有时间和日期
甚至两个 datetime 对象直接相减就能获得一个 timedelta 对象。如果有需要计算工作日的需求,可以使用 business_calendar这个库,不需要装其他依赖就可使用。
>>> print(datetime.datetime.now())#返回当前时间 2016-11-14 12:47:03.941925
>>> print(datetime.date.fromtimestamp(time.time()))#格式化时间戳直接为日期格式2016-11-14
>>> print(datetime.datetime.now()+datetime.timedelta(3))#当前时间+3天datetime.timedelta对象代表两个时间之间的的时间差,两个date或datetime对象相减时可以返回一个timedelta对象
>>>print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
>>>print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
>>>print(datetime.datetime.now() + datetime.timedelta(minutes=-30)) #当前时间-30分
>>> print(datetime.datetime.now())
2016-11-14 23:56:21.528586
>>> print(datetime.datetime.now().replace(minute=3,hour=2))#时间替换
2016-11-14 02:03:50.296517
Directive | Meaning | Example | Notes |
---|---|---|---|
%a |
Weekday as locale’s abbreviated name. |
Sun, Mon, ..., Sat (en_US); So, Mo, ..., Sa (de_DE) |
(1) |
%A |
Weekday as locale’s full name. |
Sunday, Monday, ..., Saturday (en_US); Sonntag, Montag, ..., Samstag (de_DE) |
(1) |
%w |
Weekday as a decimal number, where 0 is Sunday and 6 is Saturday. | 0, 1, ..., 6 | |
%d |
Day of the month as a zero-padded decimal number. | 01, 02, ..., 31 | |
%b |
Month as locale’s abbreviated name. |
Jan, Feb, ..., Dec (en_US); Jan, Feb, ..., Dez (de_DE) |
(1) |
%B |
Month as locale’s full name. |
January, February, ..., December (en_US); Januar, Februar, ..., Dezember (de_DE) |
(1) |
%m |
Month as a zero-padded decimal number. | 01, 02, ..., 12 | |
%y |
Year without century as a zero-padded decimal number. | 00, 01, ..., 99 | |
%Y |
Year with century as a decimal number. | 1970, 1988, 2001, 2013 | |
%H |
Hour (24-hour clock) as a zero-padded decimal number. | 00, 01, ..., 23 | |
%I |
Hour (12-hour clock) as a zero-padded decimal number. | 01, 02, ..., 12 | |
%p |
Locale’s equivalent of either AM or PM. |
AM, PM (en_US); am, pm (de_DE) |
(1), (2) |
%M |
Minute as a zero-padded decimal number. | 00, 01, ..., 59 | |
%S |
Second as a zero-padded decimal number. | 00, 01, ..., 59 | (3) |
%f |
Microsecond as a decimal number, zero-padded on the left. | 000000, 000001, ..., 999999 | (4) |
%z |
UTC offset in the form +HHMM or -HHMM (empty string if the the object is naive). | (empty), +0000, -0400, +1030 | (5) |
%Z |
Time zone name (empty string if the object is naive). | (empty), UTC, EST, CST | |
%j |
Day of the year as a zero-padded decimal number. | 001, 002, ..., 366 | |
%U |
Week number of the year (Sunday as the first day of the week) as a zero padded decimal number. All days in a new year preceding the first Sunday are considered to be in week 0. | 00, 01, ..., 53 | (6) |
%W |
Week number of the year (Monday as the first day of the week) as a decimal number. All days in a new year preceding the first Monday are considered to be in week 0. | 00, 01, ..., 53 | (6) |
%c |
Locale’s appropriate date and time representation. |
Tue Aug 16 21:30:00 1988 (en_US); Di 16 Aug 21:30:00 1988 (de_DE) |
(1) |
%x |
Locale’s appropriate date representation. |
08/16/88 (None); 08/16/1988 (en_US); 16.08.1988 (de_DE) |
(1) |
%X |
Locale’s appropriate time representation. |
21:30:00 (en_US); 21:30:00 (de_DE) |
(1) |
%% |
A literal ‘%‘ character. |
% |
参考链接:
http://gracece.com/2014/10/the-distinction-between-date-and-datetime-in-python/
http://www.pythondoc.com/pythontutorial3/modules.html
http://www.cnblogs.com/alex3714/articles/5161349.html
http://www.cnblogs.com/wupeiqi/articles/4963027.html