1. 什么是模块

1)模块的英文为:Modules
2) 模块是一个扩展名为“.py”的文件
3) 模块的作用:
(1) 规范代码,易于阅读
(2) 提高开发效率:方便其他程序使用已经编写好的代码
(3) 避免函数名和变量名冲突

2. 自定义模块

2.1 创建模块

1)创建模块实际上就是创建一个.py文件
2)创建的模块名不要与python自带的标准模块名相同
3) 模块中可以包含变量、函数、类

Python 定义cell python 定义模块_包名

2.2 导入模块

1)导入模块有两种方式:
(1)import语句导入模块
(2) from…import… 语句导入模块
2)在导入模块时,会将所有没有缩进的代码都执行一遍

2.2.1 import 语句导入

(1)使用import语句方式导入,导入模块中所有工具
(2)当模块名较为复杂,可以使用 as 关键字给模块起别名
(3)调用模块中的变量、函数、类时需要在前面加上模块名:模块名.工具
(4) 导入多个模块时,推荐每个导入模块占据一行
语法格式:

import 模块名 [as 别名]
actor = '我最喜爱的演员名是cdm'
print(actor)


def income(income1, income2):
    return income1*0.6+income2*0.8


class Action(object):
    def __init__(self, ac_name, tv_name):
        self.ac_name = ac_name
        self.tv_name = tv_name

    def eval(self, score):
        print('%s  主演的电视剧  [%s],观众评分:  %.1f' % (self.ac_name, self.tv_name, score))

Python 定义cell python 定义模块_python_02


这里也可以看出,虽然掉导入模块时,没有调用actor函数,但是因为导入一个模块时自动执行所有没有缩进的代码,所以,actor函数依然执行了。

2.2.2 使用from … import 语句导入模块

(1) 这种方法导入模块中的部分工具
(2)不需要通过模块名.作为前缀,可以直接使用模块提供的函数、变量和类

Python 定义cell python 定义模块_python_03

这里也可以看出,虽然掉导入模块时,没有调用actor函数,但是因为导入一个模块时自动执行所有没有缩进的代码,所以,actor函数依然执行了。

2.2.3 以主程序形式执行

要想解决上面没有调用actor函数,确执行的情况,可以使用python的内置函数__name__.
在实际开发中,开发人员通常会创建模块后增加一些测试代码,比如actor函数的print(actor),再比如在模块中创建对象测试,但是这些代码在导入模块时是不需要被执行的。

actor = '我最喜爱的演员名是cdm'
print(actor)


def income(income1, income2):
    return income1*0.6+income2*0.8


class Action(object):
    def __init__(self, ac_name, tv_name):
        self.ac_name = ac_name
        self.tv_name = tv_name

    def eval(self, score):
        print('%s  主演的电视剧  [%s],观众评分:  %.1f' % (self.ac_name, self.tv_name, score))


# 作为模块导入时,不需要执行的测试代码
dww = Action('大胃王', 18)
dww.eval(9.2)
print('输出的', __name__)

Python 定义cell python 定义模块_包名_04


在调用模块中执行结果:

Python 定义cell python 定义模块_包名_05


可以看到,在输入__name__的主程序中执行,输出结果为:main;当作为模块导入其他模块时,输出结果为被导入模块的模块名。

因此,可以通过添加__name__ == 'main’来判断是否在主程序执行,在主程序执行,就输出测试代码,查看代码能够正常运行;而作为模块导入时,不执行测试代码。

actor = '我最喜爱的演员名是cdm'
if __name__ =="__main__":
    print(actor)


def income(income1, income2):
    return income1*0.6+income2*0.8


class Action(object):
    def __init__(self, ac_name, tv_name):
        self.ac_name = ac_name
        self.tv_name = tv_name

    def eval(self, score):
        print('%s  主演的电视剧  [%s],观众评分:  %.1f' % (self.ac_name, self.tv_name, score))

if __name__ =="__main__":
    # 作为模块导入时,不需要执行的测试代码
    dww = Action('大胃王', 18)
    dww.eval(9.2)
    print('输出的', __name__)

Python 定义cell python 定义模块_缩进_06


导入其他模块时,执行效果:

Python 定义cell python 定义模块_包名_07


Python 定义cell python 定义模块_python_08


可以看到并没有输出ac_income中的测试代码。

3. 包

1)包是一个分层次的目录结构,他将一组功能相近的模块组织在一个目录下
2)包具有以下作用:
(1)避免模块名重名引发的冲突
(2) 规范代码
3)包与文件夹的区别
(1) 包简单理解是文件夹,不过,在该文件夹中必须存在一个名为:init.py的文件
4)包的命名方式与变量名一样,命名不符合规范会导致导入包时出现问题

3.1 创建包

Python 定义cell python 定义模块_Python 定义cell_09


在创建python包时,会自动创建__init__.py文件文件

(1)init.py 文件在导入包时会默认加载,自动执行;

(2) 可以将一些初始化的函数、变量、类放在__init__.py文件中

3.2 导入包

导入包与导入模块一样,有两种方法:
1)使用import语句导入包
2)使用from…import…语句导入包

3.2.1 使用import语句导入包

Python 定义cell python 定义模块_python_10


可以看到,当导入包时,还不能使用包中的模块,解决办法:

1)在__init__.py文件中使用

from . import 模块名

导入模块

Python 定义cell python 定义模块_包名_11


之后,可以看到,已经可以使用包里面的income模块

Python 定义cell python 定义模块_开发语言_12


Python 定义cell python 定义模块_Python 定义cell_13


2) 使包名.模块名的方式导入

Python 定义cell python 定义模块_开发语言_14

3.2.2 使用from… import 语句导入包

1) 方式一:使用这种方式,调用模块中工具时,需要使用模块名.

from 包名 import 模块名

Python 定义cell python 定义模块_Python 定义cell_15


2) 方式二: 可以直接使用工具名(变量、函数、类名)

from 包名.模块名  import 工具名

Python 定义cell python 定义模块_python_16


3) 方式三: 若要导入包中所有内容,可以使用 *星

from 包名 import *

Python 定义cell python 定义模块_Python 定义cell_17


可以看到,直接使用*导入包中所有内容时,包下的模块无法正常使用,此时需要在

init.py文件中通过__all__函数定义可以通过 * 星 访问的模块名

Python 定义cell python 定义模块_python_18


Python 定义cell python 定义模块_开发语言_19


可以看到,在__init__.py文件中,通过__all__ 定义了可以通过 * 星 访问的模块income,在使用时income模块可以正常使用,但未通过__all__暴漏的actor模块不能正常使用。

4)方式四:加载模块下的全部定义(工具)

from 包名.模块名 import *

Python 定义cell python 定义模块_缩进_20

4. 第三方模块的下载与安装

pip install md  安装md模块
pip uninstall md 卸载md模块
pip list 查看已安装的第三方模块
help('modules') 查看已有的标准模块和第三方模块