1.9【Python】第九章 模块

人工智能入门与实战第一季:python基础语法

什么是模块

python程序是由一个个的模块组成的,而每一个模块又包含对应功能的代码:比如函数、变量、类、其他代码段等等。

我们在第一章讲写第一个python程序的时候,曾经通过集成开发环境IDLE创建了一个python的程序文件:lovechina.py,这个文件就是一个模块。尽管它只有两个打印语句,但也是一个模块。

所以python中的模块是以.py为后缀的文件,我们可以通过模块避免变量、函数的命名冲突,以及方便的对代码进行组织、和管理。

模块的分类:
1、系统模块,也叫标准模块
我们在第二章讲到数学函数的时候第一次使用了python标准模块库中的数学模块:math.py

# 导入math库
import math

# 幂运算
print(math.pow(2,3))

标准模块库中还有一个内置模块:builtins.py,我们最早接触的print()、len()、max()等函数便来至于此内置模块,内置模块是系统默认导入到解释器中的,所以我们无需导入这个模块。

所有标准库请到python官网查看:https://docs.python.org/zh-cn/3/

2、第三方模块
由第三方开发人员提供,以下列举部分第三方模块。
数据分析:numpy、scipy、pandas
机器学习:Scikit-learn、Tensorflow
web开发:Django、Flask

第三方模块使用之前需要安装,例如安装numpy,在终端输入命令:

pip install numpy

由于mac系统默认安装了python2.x版本,使用pip则表示使用的是python2.x版本,如果使用python3.x版本安装,应使用pip3

由于安装第三方库,有时候还会有连串的依赖问题,所以安装第三方库更简单的方式是使用Anaconda,我们在讲到python科学计算库的时候会介绍它的安装和使用…

3、自定义模块
我们创建的任意一个后缀为.py的模块,都是自定义模块。

导入模块的几种方式

1、import module1, module2…
最常用的导入模块的方式,将一个或多个模块导入,导入模块一般在写在文件的最上方。
我们前面举的导入数学模块的例子:

import math
# 幂运算
print(math.pow(2,3))

2、from module_name import name1, name2 …
从某个模块导入某个或多个指定内容

from math import pow
# 无需使用模块名称math,可直接使用pow方法
print(pow(2, 3))

# 导入math模块中的所有内容
from math import *

print(pow(2, 3))
print(floor(1.2))

3、import…as…
我们把导入的模块或函数进行重命名

# 导入模块,并重命名
import math as my_math
print(my_math.pow(2, 3))

sys.path 的使用

sys是标准模块之一,sys.path包含解释器查找模块的路径,当你导入一个模块时,解释器将会从这些路径中去查找这个模块,我们可以打印出来看一下它里面的路径:

import sys
print(sys.path)

为了解释sys.path的作用,接下来我们举例:

1、我们先创建一个main文件夹,里面创建一个模块:se1_ch9_module_package.py,然后再创建另外一个test_path1文件夹,里面创建一个模块:se1_ch9_test_path1.py,如下图所示:

2、此时我们会发现se1_ch9_module_package.py模块与se1_ch9_test_path1.py模块不在同一个目录下,接下来我们想在前者模块中导入后者模块,并调用后者模块的test函数:

from test_path1 import se1_ch9_test_path1
se1_ch9_test_path1.test()

我们发现报错了!为什么?我们在上面说了,当我们导入一个模块时解释器会从sys.path中的所有路径中去查找有没有这个模块,很明显../test_path1/ 这个路径并不在sys.path中。

3、解决这个问题很简单,在sys.path中加入这个路径即可,在se1_ch9_module_package模块中做以下操作:

方式1:在sys的path中加入当前模块的上一层路径

sys.path.append("../")

再打印sys.path 我们会发现多了一个路径'../'

print(sys.path)

我们发现此时可以正常导入se1_ch9_test_path1模块

from test_path1 import se1_ch9_test_path1
se1_ch9_test_path1.test()

方式2:在sys的path中加入test_path1路径

sys.path.append("../test_path1")

可以直接导入模块

import se1_ch9_test_path1
se1_ch9_test_path1.test()

包用来管理我们创建的模块,包的出现可以解决如下问题:
1、我们在实际的开发过程中会创建多个模块,这些模块需要分类管理
2、解决命名冲突问题:不同的开发者之间可能会创建相同名称的模块,甚至相同名称的模块下会有相同的函数,如果开发人员在一个项目开发程序、或者你写的程序提供给别人使用的时候,都会产生命名冲突的问题。

创建包
1、在对应的文件夹下右键,New-Python Package

成功创建包之后,会默认生成init.py模块。

2、创建包举例:比如我们给别人写一个播放器,我们创建了一个player_package包,然后创建一个player_manager.py模块,里面写一个play函数;创建一个ui子包,子包中可以继续创建和ui界面相关的模块。

导入包
以上述创建的player_package包为例,在主模块se1_ch9_module_package中导入player_package包:
首先在se1_ch9_module_package中加入如下代码:

#在sys的path中加入当前模块的上一层路径
sys.path.append("../")

以下为几种导入包的方式:
1、第一种导入方式:包名.模块名

import player_package.player_manager
# 调用play方法,使用时需要携带包名
player_package.player_manager.play()

输出结果:
播放...

2、第二种导入方式:from 包名 import 模块名

from player_package import player_manager
player_manager.play()

3、第三种导入方式:from 包名 import *
使用这种导入方式需要在被导入包的init.py文件中 事先定义好要被导入的模块,否则将无法导入。

  • 在player_package包的init.py中加入如下代码:

__all__ = ['player_manager']

好了,这样我们在主模块中使用 from player_package import *,就可以把player_manager模块导入进来了。

from player_package import *
player_manager.play()
  • 同样,如果我们希望把ui包中的player_controller模块导入进来,需要在ui包中的init.py模块中加入如下代码:
__all__ = ['player_controller']

然后在主模块中导入player_controller模块:

from player_package.ui import *
player_controller.show()

输出结果:
展示播放界面

本章总结:

本章应该比其他章节内容少一些,也简单一些,主要了解什么是模块,怎么创建模块,怎么导入模块,然后了解什么是包,怎么创建包和导入包即可。

本章就到这里,我是猪弟爸爸,这里我会持续更新人工智能自学内容,有问题请关注我的公众号zhudipapa,我会统一在公众号下方回复,我们下节见。

你可能感兴趣的:(1.9【Python】第九章 模块)