Skip to content

8.1 模块概念与 import 语句

在 Python 中,模块(Module)就是一个包含 Python 代码的文件,通常以 .py 为扩展名。你可以把模块想象成一个工具箱,里面装着各种函数、类和变量,供你在其他程序中使用。通过 import 语句,我们可以轻松地把别人写好的模块“借”过来用,避免重复造轮子。

比如,Python 自带了一个叫 math 的模块,里面有很多数学相关的函数。我们只需要一行代码就能把它请进门:

python
# 导入 math 模块
import math

# 调用 math 模块中的 sqrt 函数计算平方根
result = math.sqrt(16)
print(result)  # 输出: 4.0

这里要注意的是,import 后面跟的是模块名(不带 .py 后缀),而调用模块里的函数时,需要用 模块名.函数名() 的形式。

除了整个模块导入,你还可以只导入模块中的特定部分,比如:

python
# 只从 math 模块导入 sqrt 函数
from math import sqrt

# 直接使用 sqrt,不需要加 math 前缀
result = sqrt(25)
print(result)  # 输出: 5.0

这种方式可以让你的代码更简洁,但也要小心别把太多东西一股脑儿全导入进来,否则容易造成命名冲突。

这一节讲了什么是模块以及如何用 import 语句导入模块或其中的部分内容,这是组织和复用代码的基础手段。

8.2 标准库模块简单使用

Python 的标准库就像一个百宝箱,里面装满了各种现成的模块,覆盖了文件操作、时间处理、网络通信等方方面面。你不需要额外安装,只要会用就行!

下面是一些常用标准库模块的简单示例:

功能名称实例调用方法具体功能、注意事项、必需参数/可选参数
获取当前时间datetime.datetime.now()返回当前本地时间的 datetime 对象;无需参数
随机数生成random.randint(a, b)返回 [a, b] 范围内的随机整数;a 和 b 必须是整数且 a ≤ b
数学运算math.floor(x)返回不大于 x 的最大整数;x 必须是数值类型

来看一段完整的代码示例:

python
# 导入 datetime 模块用于获取当前时间
import datetime

# 导入 random 模块用于生成随机数
import random

# 导入 math 模块用于数学运算
import math

try:
    # 获取当前时间并打印
    current_time = datetime.datetime.now()
    print("当前时间:", current_time)

    # 生成 1 到 10 之间的随机整数
    random_number = random.randint(1, 10)
    print("随机数:", random_number)

    # 对 3.7 向下取整
    floored_value = math.floor(3.7)
    print("向下取整结果:", floored_value)

except Exception as e:
    # 捕获可能出现的异常
    print("发生错误:", str(e))

这段代码展示了三个常用标准库模块的基本用法,每个操作都加上了异常捕获,确保程序不会因为意外情况崩溃。

这一节介绍了 Python 标准库中几个常用模块的简单使用方法,帮助你快速上手内置功能,减少自己从头编写代码的工作量。

8.3 自定义模块创建

除了使用 Python 自带的标准库模块,你也可以自己动手写模块!其实非常简单——只要你新建一个 .py 文件,里面写点函数或者变量,它就自动成为一个模块了。

举个例子,假设你经常需要计算圆的面积和周长,可以把这些功能封装到一个叫 circle.py 的文件里:

python
# circle.py - 自定义模块示例

# 定义圆周率常量
PI = 3.141592653589793

# 计算圆的面积
def area(radius):
    """
    计算圆的面积
    :param radius: 半径(数值)
    :return: 面积(浮点数)
    """
    return PI * radius ** 2

# 计算圆的周长
def circumference(radius):
    """
    计算圆的周长
    :param radius: 半径(数值)
    :return: 周长(浮点数)
    """
    return 2 * PI * radius

然后在另一个文件里,比如 main.py,就可以这样使用它:

python
# main.py - 使用自定义模块

# 导入当前目录下的 circle 模块
import circle

try:
    # 定义半径
    r = 5

    # 调用 circle 模块中的 area 函数计算面积
    area_result = circle.area(r)
    print(f"半径为 {r} 的圆面积是: {area_result}")

    # 调用 circle 模块中的 circumference 函数计算周长
    circumference_result = circle.circumference(r)
    print(f"半径为 {r} 的圆周长是: {circumference_result}")

except Exception as e:
    # 捕获可能的异常
    print("发生错误:", str(e))

注意:circle.pymain.py 要放在同一个目录下,否则 Python 找不到这个模块。

这一节教你如何创建自己的模块,并在其他程序中导入使用,这是构建大型项目时组织代码的重要方式。

8.4 __name__ == '__main__' 的作用

你可能在一些 Python 文件底部看到过这样的代码:

python
if __name__ == '__main__':
    # 一些测试代码

这可不是装饰用的,而是有实际用途的!它的作用是判断当前文件是被直接运行,还是被当作模块导入到别的文件中。

  • 当你直接运行这个文件时,__name__ 的值是 '__main__',所以里面的代码会被执行。
  • 当你把这个文件作为模块导入到其他文件中时,__name__ 的值是模块名(比如 'mymodule'),所以里面的代码不会被执行。

来看个具体例子:

python
# utils.py - 示例模块

def greet(name):
    """打招呼函数"""
    return f"你好, {name}!"

# 测试代码块
if __name__ == '__main__':
    # 只有直接运行 utils.py 时才会执行这部分
    print("正在测试 greet 函数...")
    result = greet("小明")
    print(result)

如果你直接运行 utils.py,会看到输出:

正在测试 greet 函数...
你好, 小明!

但如果你在另一个文件中导入它:

python
# main.py
import utils

print(utils.greet("小红"))

运行 main.py 时,只会输出:

你好, 小红!

而不会执行 utils.py 中的测试代码。

这种机制非常适合在模块中加入测试代码,既不影响模块的正常使用,又方便单独调试。

这一节解释了 __name__ == '__main__' 的作用,它是区分模块直接运行和被导入的关键技巧,也是良好编程习惯的体现。