python-python基础5
一、模块介绍
定义:本质上就是.py结尾的python文件。模块,用一砣代码实现了某个功能的代码集合。
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
导入模块:
import 本质就是把python文件解释一遍。例如 import test,就是把test里的所有代码赋值给test这个变量,所以在其它地方调用test就需要test.xxx来调用。
而from test import *这种方式,是直接执行test里面的所有代码,调用可以直接xxx.
from...import...与import语句基本一致,唯一不同的是:使用import foo导入模块后,引用模块中的名字都需要加上foo.作为前缀,而使用from foo import x,get,change,Foo则可以在当前执行文件中直接引用模块foo中的名字,如下
from foo import x,get,change #将模块foo中的x和get导入到当前名称空间 a=x #直接使用模块foo中的x赋值给a get() #直接执行foo中的get函数 change() #即便是当前有重名的x,修改的仍然是源文件中的x
无需加前缀的好处是使得我们的代码更加简洁,坏处则是容易与当前名称空间中的名字冲突,如果当前名称空间存在相同的名字,则后定义的名字会覆盖之前定义的名字。
查看导入模块的搜索路径:sys.path,如果不是python自带的模块,一般只会找同级目录下的模块,如果需要导入其它目录下的模块,要把那个模块所在的上级目录给追加进sys.path里。例:
p=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(p)
如果导入的是包,那么就是执行包下面的__init__文件。
如果想要导入某个包里的一个模块,可以在那个包中的__init__.py文件中写from . import xxx,导入xxx模块
我们还可以在当前位置为导入的模块起一个别名
import foo as f #为导入的模块foo在当前位置起别名f,以后再使用时就用这个别名f f.x f.get()
还可以为导入的一个名字起别名
from foo import get as get_x get_x()
通常在被导入的名字过长时采用起别名的方式来精简代码,另外为被导入的名字起别名可以很好地避免与当前名字发生冲突,还有很重要的一点就是:可以保持调用方式的一致性,例如我们有两个模块json和pickle同时实现了load方法,作用是从一个打开的文件中解析出结构化的数据,但解析的格式不同,可以用下述代码有选择性地加载不同的模块
if data_format == ‘json‘: import json as serialize #如果数据格式是json,那么导入json模块并命名为serialize elif data_format == ‘pickle‘: import pickle as serialize #如果数据格式是pickle,那么导入pickle模块并命名为serialize data=serialize.load(fn) #最终调用的方式是一致的
模块的分类
模块分为三种:
- 自定义模块
- 内置标准模块(又称标准库)
- 开源模块
二、time & datetime模块
time模块
在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(struct_time)共九个元素。由于Python的time模块实现主要调用C库,所以各个平台可能有所不同。
1.以元组方式返回本地当前时间 >>> time.localtime() time.struct_time(tm_year=2017, tm_mon=5, tm_mday=8, tm_hour=16, tm_min=13, tm_sec=34, tm_wday=0, tm_yday=128, tm_isdst=0) 2.以元组方式返回格林威治时间 >>> time.gmtime() time.struct_time(tm_year=2017, tm_mon=5, tm_mday=8, tm_hour=8, tm_min=13, tm_sec=38, tm_wday=0, tm_yday=128, tm_isdst=0) 3.将元组时间转换为时间戳 >>> x = time.localtime() >>> time.mktime(x) 1494232890.0 4.将元组时间转换为字符串格式时间 >>> x = time.localtime() >>> time.strftime(‘%Y-%m-%d %H:%M:%S‘,x) ‘2017-05-08 16:57:38‘ 5.将字符串格式时间转换为元组格式时间 >>> time.strptime(‘2017-05-08 17:03:12‘,‘%Y-%m-%d %H:%M:%S‘) time.struct_time(tm_year=2017, tm_mon=5, tm_mday=8, tm_hour=17, tm_min=3, tm_sec=12, tm_wday=0, tm_yday=128, tm_isdst=-1) 6.元组格式时间转换为字符串格式时间 >>> time.asctime() ‘Tue May 9 15:23:21 2017‘ >>> x = time.localtime() >>> time.asctime(x) ‘Tue May 9 15:23:39 2017‘ 7.时间戳转换成字符串格式时间 >>> time.ctime() ‘Tue May 9 16:07:24 2017‘ >>> time.ctime(987867475) ‘Sat Apr 21 23:37:55 2001‘
格式参照:
字符串 | 功能 |
---|---|
%a | 本地(locale)简化星期名称 |
%A | 本地完整星期名称 |
%b | 本地简化月份名称 |
%B | 本地完整月份名称 |
%c | 本地相应的日期和时间表示 |
%d | 一个月中的第几天(01 - 31) |
%H | 一天中的第几个小时(24小时制,00 - 23) |
%I | 第几个小时(12小时制,01 - 12) |
%j | 一年中的第几天(001 - 366) |
%m | 月份(01 - 12) |
%M | 分钟数(00 - 59) |
%p | 本地am或者pm的相应符 |
%S | 秒(01 - 61) |
%w | 一个星期中的第几天(0 - 6,0是星期天) |
%W | 和%U基本相同,不同的是%W以星期一为一个星期的开始。 |
%x | 本地相应日期 |
%X | 本地相应时间 |
%y | 去掉世纪的年份(00 - 99) |
%Y | 完整的年份 |
%Z | 时区的名字(如果不存在为空字符) |
%% | %’字符 |
%U | 一年中的周数。(00 - 53,周日是一个周的开始。)第一个星期天之前的所有天数都放在第0周 |
datetime模块
import datetime 1.返回当前时间 >>> datetime.datetime.now() datetime.datetime(2017, 5, 9, 17, 7, 0, 514481) 2.时间戳转换成日期 >>> datetime.date.fromtimestamp(1178766678) datetime.date(2007, 5, 10) 3.当前时间+3天 >>> datetime.datetime.now() + datetime.timedelta(+3) datetime.datetime(2017, 5, 12, 17, 12, 42, 124379) 4.当前时间-3天 >>> datetime.datetime.now() + datetime.timedelta(-3) datetime.datetime(2017, 5, 6, 17, 13, 18, 474406) 5.当前时间+3小时 >>> datetime.datetime.now() + datetime.timedelta(hours=3) datetime.datetime(2017, 5, 9, 20, 13, 55, 678310) 6.当前时间+30分钟 >>> datetime.datetime.now() + datetime.timedelta(minutes=30) datetime.datetime(2017, 5, 9, 17, 44, 40, 392370)