• 随着代码量的增加,我们需要更有逻辑的组织代码,以及代码文件之间的关系
  • 让代码更容易被定为、归类和引用
  • 让我们可以重复使用自己和他人的代码,可以多人协作更大型的项目

模块

概念

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__的内容为字符串:模块的名字

模块搜索路径

  1. 内置模块
  2. 当前模块所在目录
  3. 环境变量PYTHONPATH(默认包含python的安装路径)
  4. Python安装路径下的lib文件夹
  5. lib文件夹下的site-packages文件夹(第三方模块)
  6. 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 别名

星霜荏苒 居诸不息