- 随着代码量的增加,我们需要更有逻辑的组织代码,以及代码文件之间的关系
- 让代码更容易被定为、归类和引用
- 让我们可以重复使用自己和他人的代码,可以多人协作更大型的项目
模块
概念
Python模块(Module),是一个Python文件,以.py结尾,包含了Python对象定义和Python语句。
对于Python中包、模块、函数或者类的理解,可以参照下表:
概念 | 状态 |
---|---|
包 | 文件夹 |
模块 | 文件 |
函数/类 | 文件中的类容 |
模块的导入
模块导入相当于把别人的代码拿到自己的文件中使用。
语法:import 模块名
导入系统内置模块
math是python语言中内置的模块,提供了很多数学中的常量与操作。常量math.pi表示圆周率π;math.pow(2,3)表示2的3次方。
要引用math,就可以在文件的最开始的地方用import math来引入:
import math
print(math.pi) # 3.141592653589793
print(type(math)) # <class 'module'>
pycharm中,在模块名上按住“Ctrl+鼠标左键”,可以打开并跳转到引入的模块源文件中。
导入自定义模块
定义一个模块,名为myModule1.py,其中代码为:
def add(a, b):
print("mymodule1:add....")
return f"{a}+{b}={a+b}"
def divid(a,b):
print("mymodule1:divid....")
return f"{a}/{b}={a/b}"
def multiply(a, b):
print("mymodule1:multiply....")
return f"{a}*{b}={a*b}"
引用自定义的myModule1模块,并调用其中的函数。
调用模块中的函数语法:
模块名:函数名([实际参数])
import myModule1
print(myModule1.add(3, 2))
print(myModule1.divid(3, 2))
返回结果如下:
mymodule1:add....
3+2=5
mymodule1:divid....
3/2=1.5
模块的运行方式
定义一个模块,名为myModule2.py,代码为:
print("mymodule2...")
m = 10
print("mymodule2:m={m}")
定义模块test2.py,导入自定义模块myModule2时,被导入模块的“可执行语句”会立即执行。
import myModule2
# 返回如下
mymodule2...
mymodule2:m={m}
执行多次import,一个模块只会被导入一次。
不提倡上面这种直接在模块中编写功能性语句的做法,因为模块被外界引入时,这些代码会默认执行,会对调用当前模块的外部程序造成影响。
如果想不影响外部代码且保持本模块内相关功能代码的运行,可以通过模块中的默认属性__name__来判断。
Python中对于模块的调用有两种模式:
- 脚本模式:自身模块开发时,作为独立程序由解释器直接运行,__name__的内容为字符串:main
- 模块模式:被其他模块导入,为其他模块提供资源(变量、函数、类的定义),__name__的内容为字符串:模块的名字
模块搜索路径
- 内置模块
- 当前模块所在目录
- 环境变量PYTHONPATH(默认包含python的安装路径)
- Python安装路径下的lib文件夹
- lib文件夹下的site-packages文件夹(第三方模块)
- sys.path.append()追加的目录
其他方式导入模块
从模块中引入指定的函数
from myModule1 import add,divid # 引入模块中多个函数,用逗号分隔
print(add(3, 2)) # 直接使用函数名() 进行调用
print(divid(3, 2))
print(myModule1.add(3, 2)) # 没有被引入的函数,不能被调用,NameError: name 'myModule1' is not defined
一次性引入模块中全部函数
from myModule1 import * # 引入模块中全部函数
print(add(3, 2))
print(divid(3, 2))
print(multiply(3, 2))
import和from ... import ...的区别
- import:需要使用模块名来调用函数
- from ... import ...:可以直接调用函数,默认优先调用自身定义的函数
别名
通过给函数或者模块起别名,可以直接使用别名进行调用
from ... import ... as 别名
import ... as 别名