Python模块(module)通常对应一个 .py 文件,里面可以放函数、类和常量。用 import 把模块载入当前文件后,就能通过限定名调用其中的定义,从而把大程序拆成多个职责更清晰的文件。

先 import 一个模块

标准库里的 math 是现成例子。导入后,用 模块名.名字 访问其中的函数或常量:

import math

print(math.sqrt(16))    # 4.0
print(math.pi)
print(math.ceil(2.1))   # 3

几种 import 写法

import 模块 引入整个模块。from 模块 import 名字 把指定名字直接绑到当前命名空间,调用时不必再写模块前缀。import 模块 as 别名 用于缩短前缀。星号导入会一次拉进大量名字,容易和自己的函数撞名,一般项目里不建议用:

import math
from math import sqrt, pi
import math as m

print(sqrt(16))
print(m.sqrt(16))

标准库里常见的几个

随机数、日期、路径、JSON 文本,在标准库里都有对应模块,导入即可用,不必自己从零实现:

import random
import datetime
import os
import json

print(random.randint(1, 6))
print(datetime.date.today())
print(os.getcwd())
print(json.dumps({"a": 1}))

自己的模块

任意一个 .py 文件都可以当模块。例如同目录下的 mytools.py

# mytools.py
def greet(name):
    return f"Hello, {name}!"

PI = 3.14159

主程序里这样导入:

import mytools
print(mytools.greet("Tom"))
print(mytools.PI)

只要模块文件位于解释器能搜到的路径上(最常见是与主程序同一目录),就可以直接 import 文件名(不含 .py)。

if __name__ == '__main__'

被 import 时,模块顶层代码会执行一遍。若文件里还写了演示或自测打印,不希望别人一导入就跑出来,就把这些入口代码放进 if __name__ == '__main__': 里。直接运行该文件时条件为真。作为模块导入时为假:

# mytools.py
def greet(name):
    return f"Hello, {name}!"

if __name__ == '__main__':
    print("这是模块的测试:")
    print(greet("Tom"))

包(package)

多个模块可以放进同一个目录,并带上 __init__.py(可为空),这个目录就称为包,适合按功能分子目录:

mypkg/
  __init__.py
  utils.py
  io.py
from mypkg import utils
from mypkg.utils import helper

常见误区

  • 自建文件不要与标准库同名。例如项目里若有 random.pyimport random 可能先命中你的文件,标准库反而进不来。
  • from math import * 会把大量名字倒进当前作用域,覆盖风险高。
  • 模块顶层的演示代码若没有 if __name__ == '__main__' 保护,被导入时也会执行。