# 包和模块
## 1. 包
包是为了解决模块重名问题,python引入了以目录方式组织模块,称之为包(package),一个包中可以包含模块、包。python的包中必须包含一个特殊文件,被命名为__ init__.py,这文件告诉解释器这是一个包,而目录则不要求一定要有,这是目录和包的区别
## 2.模块
在python中,模块是代码组织的一种方式,把功能相近的函数放到一个文件中,一个文件(.py)就是一个模块(module),模块名就是文件名去掉后缀py。这样做的好处是:
- 提高代码的可复用、可维护性。一个模块编写完毕后,可以很方便的在其他项目中导入
- 解决了命名冲突,不同模块中相同的命名不会冲突
我们之前已经在使用模块了,包括:math,random,collections, functools
### 2.1 模块搜索路径
当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的built-in模块中查找,找不到则按sys.path给定的路径找对应的模块文件(模块名.py)
```
import sys
#sys.path是一个列表
print(sys.path)
#可以使用列表的方法,增加搜索路径
sys.path.append(r'c:\wh1803')
```
### 2.2 导入模块
可以使用import语句导入模块,格式:
~~~
#1基本语法
import 包名.模块名1
import 包名.模块名2
....
import 包名.模块名n
#或者一行导入多个,不建议这么些,可读性不好
import 模块1,模块2,....模块n
#2 使用from...import导入指定标识符,语法:
from module import name1 [,name2 [,name3...[,namen]]]
from module imort * #导入模块中所有标识符,不建议使用
#3.可是使用as给模块起一个别名
import 模块名 as 别名
~~~
import语句的模块顺序,推荐在文件开头导入模块,建议按照如下顺序:
- python标准库
- 第三方库
- 自定义库
这三类库中间添加一个空行,模块第一次被导入的时候会被执行。如果在导入模块不想执行模块中代码,可以使用`__ name__`属性进行判断,如果该模块是当前模块,不是导入模块,`__name __` 的值是`__main__`。所以可以这样检测:
~~~
#hello.py
def test()
print('test')
if __name__ == '__main__' #执行的是当前模块,则为真;导入的模块则为假
test()
~~~
## 3 日期时间模块
datetime:日期
time :时间
calendar:日历
时间间隔是以秒为单位的
每个时间戳都以自从1970.1.1经历了多长时间计算的
时间戳:当前时间距离1970.1.1的秒数
### 3.1 time时间模块
> UTC:格林威治天文时间,世界标准时间,在中国UTC+8
>
> DST:夏令时
>
> 时间的表示形式:
>
> a.以整数或者浮点数表示一个以秒为单位的时间间隔,这个时间的基础值1970.1.1的零时零分零秒
>
> b.采用Python中的数据结构表示,采用元组,元组中可以有9个不同的元素,表示不同的含义
>
> c.格式化的时间字符串
>
> ```python
> import time
>
> #1.获取当前时间的时间戳
> c = time.time() #*********
> print(c) #时间的第一种表示形式,时间戳:1522635821.4109497
>
>
> #2.将上述时间戳转换为时间元组
> g = time.gmtime(c)
> print(g)
> #time.struct_time(tm_year=2018, tm_mon=4, tm_mday=2, tm_hour=2, tm_min=25, tm_sec=33, tm_wday=0, tm_yday=92, tm_isdst=0)
>
>
> #3.将时间戳生成时间元组(本地时间)
> l = time.localtime(c) #*********
> print(l)
> #time.struct_time(tm_year=2018, tm_mon=4, tm_mday=2, tm_hour=10, tm_min=27, tm_sec=13, tm_wday=0, tm_yday=92, tm_isdst=0)
>
> #4.将时间元组转换为时间戳
> c2 = time.mktime(l)
> print(c2)
>
> c3 = time.mktime((2018,4,2,10,29,23,3,320,0))
> print(c3)
>
> #5.将时间戳转换为字符串
> c4 = time.ctime(c3)
> print(c4) #Mon Apr 2 10:29:23 2018
>
>
> #6.将时间元组转换为格式化字符串
> #注意:必须严格按照格式化的形式书写字符串【严格区分大小写】
> s = time.strftime("%Y-%m-%d %H:%M:%S",l) #*********
> print(s) #2018-04-02 10:35:45
>
> #7.将指定格式的时间字符串转换为时间元组
> #参数1:指定的时间 参数2:指定的时间格式
> p = time.strptime("2018-04-02 10:35:45","%Y-%m-%d %H:%M:%S")
> print(p)
> #time.struct_time(tm_year=2018, tm_mon=4, tm_mday=2, tm_hour=10, tm_min=35, tm_sec=45, tm_wday=0, tm_yday=92, tm_isdst=-1)
>
>
> #8.休眠【暂停】
> #使用情景:多线程中
> print("~~~~~~~~")
>
> #参数的单位为秒
> #time.sleep(5) #*********
> print("~~~~~~~~")
>
> #9.用来衡量不同程序的耗时
> print(time.clock()) #*********
>
> #time\localtime\strftime\sleep\clock
>
>
> #练习:假如我有一个时间字符串,然后向得到这个字符串所对应时间3天之后的时间
> #2017.5.7
>
> time1 = "2017-5-7"
>
> #将时间转换为元组
> p1 = time.strptime(time1,"%Y-%m-%d")
> print(p1)
>
> #将元组转换成时间戳
> t1 = time.mktime(p1)
> t3 = t1 + 3 * 24 * 3600
>
> #最终转换为格式化形式
> f = time.strftime("%Y.%m.%d",time.localtime(t3))
> print(f) #2017-05-10
> ```
### 3.2 datetime日期模块
> datetime比time更加高级。是对time进行了封装
>
> ```python
> import datetime
>
>
> #1.获取当前时间
> d1 = datetime.datetime.now()
> print(d1) #2018-04-02 10:58:32.061897
>
>
> #2.获取指定时间
> d2 = datetime.datetime(2018,4,2,10,56,32,3623)
> print(d2) #2018-04-02 10:56:32.003623
>
> #3.将指定时间转换为字符串
> d4 = d1.strftime("%Y-%m-%d")
> print(d4) #2018-04-02
> print(type(d4))
>
> d5 = datetime.datetime.strptime(d4,"%Y-%m-%d")
> print(d5) #2018-04-02 00:00:00
>
>
> #4两个时间相减,可以得到时间间隔
> d6 = datetime.datetime(2018,4,2,10,56,00,3623)
> d7 = datetime.datetime(2018,4,5,10,56,32,3623)
> d8 = d7 - d6
> print(d8) #3 days, 0:00:00
> print(d8.days) #3
>
> #整数天之外的秒数
> print(d8.seconds)
> ```
### 3.3 calendar日历模块
> 主要用于获取日历的相信信息
>
> ```python
> import calendar
>
> #1.直接返回指定年和月的万年历表示形式
> print(calendar.month(2018,4)) #********
>
>
> #2.返回万年历的二维列表表示形式
> print(calendar.monthcalendar(2018,4))
>
> #3.直接返回指定年份的万年历表示形式
> print(calendar.calendar(2018)) #********
>
> #4.判断某年是否为闰年
> print(calendar.isleap(2010)) #********
> print(calendar.leapdays(2000,2020)) #********
>
> #5.返回指定月的weekday的第一天和这个月的所有的天数
> print(calendar.monthrange(2018,4)) #(6, 30)---》(当月开始的第一天为星期几,mon为0,第二个元素表示当月的总天数)
>
> print(calendar.monthcalendar(2018,4))
>
> #当前日期表示的星期数
> print(calendar.weekday(2018,4,2)) #********
> ```
## 4 第三方模块
> 步骤:
>
> 1.在终端中输入命令:pip -V 【检查版本,这个步骤在安装Python环境的时候如果勾选了Add path选项,则已自动安装】
>
> 2.安装第三方模块:pip install pillow 【pillow为一个图形处理的第三方模块,需要联网下载】
>
> 如果此步出错,则执行命令 python -m pip install --upgrade
>
> 3,.如果不使用第三方模块,则可以执行命令:pip uninstall pillow ,卸载第三方模块
>