十一

# 包和模块

## 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  ,卸载第三方模块

>

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 3,013评论 0 9
  • 一、目录遍历 os 用于获取系统的功能,主要用于操作文件或者文件夹代码演示:import ospath = r...
    hollow_02f9阅读 1,574评论 0 0
  • 5Python集合容器 数据结构数据结构 一般将数据结构分为两大类: 线性数据结构和非线性数据结构。 线性数据结构...
    清清子衿木子水心阅读 1,559评论 0 1
  • 你是我粗心中唯一的细心, 你是我遗忘中唯一的难忘, 你是我最想照顾一生的人啊。 三行情书——你 你是我凉风习习想要...
    猫慕子期阅读 309评论 0 3
  • 不知不觉,6月又过去了,2019年已过大半,突然之间的焦虑和不安惶恐涌上心头。有那么一瞬间,心情down到了谷底,...
    小咸鱼爱分享阅读 468评论 0 0