8.1 模块概念与 import 语句
在 Python 中,模块(Module)就是一个包含 Python 代码的文件,通常以 .py 为扩展名。你可以把模块想象成一个工具箱,里面装着各种函数、类和变量,供你在其他程序中使用。通过 import 语句,我们可以轻松地把别人写好的模块“借”过来用,避免重复造轮子。
比如,Python 自带了一个叫 math 的模块,里面有很多数学相关的函数。我们只需要一行代码就能把它请进门:
# 导入 math 模块
import math
# 调用 math 模块中的 sqrt 函数计算平方根
result = math.sqrt(16)
print(result) # 输出: 4.0这里要注意的是,import 后面跟的是模块名(不带 .py 后缀),而调用模块里的函数时,需要用 模块名.函数名() 的形式。
除了整个模块导入,你还可以只导入模块中的特定部分,比如:
# 只从 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 必须是数值类型 |
来看一段完整的代码示例:
# 导入 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 的文件里:
# 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,就可以这样使用它:
# 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.py 和 main.py 要放在同一个目录下,否则 Python 找不到这个模块。
这一节教你如何创建自己的模块,并在其他程序中导入使用,这是构建大型项目时组织代码的重要方式。
8.4 __name__ == '__main__' 的作用
你可能在一些 Python 文件底部看到过这样的代码:
if __name__ == '__main__':
# 一些测试代码这可不是装饰用的,而是有实际用途的!它的作用是判断当前文件是被直接运行,还是被当作模块导入到别的文件中。
- 当你直接运行这个文件时,
__name__的值是'__main__',所以里面的代码会被执行。 - 当你把这个文件作为模块导入到其他文件中时,
__name__的值是模块名(比如'mymodule'),所以里面的代码不会被执行。
来看个具体例子:
# utils.py - 示例模块
def greet(name):
"""打招呼函数"""
return f"你好, {name}!"
# 测试代码块
if __name__ == '__main__':
# 只有直接运行 utils.py 时才会执行这部分
print("正在测试 greet 函数...")
result = greet("小明")
print(result)如果你直接运行 utils.py,会看到输出:
正在测试 greet 函数...
你好, 小明!但如果你在另一个文件中导入它:
# main.py
import utils
print(utils.greet("小红"))运行 main.py 时,只会输出:
你好, 小红!而不会执行 utils.py 中的测试代码。
这种机制非常适合在模块中加入测试代码,既不影响模块的正常使用,又方便单独调试。
这一节解释了 __name__ == '__main__' 的作用,它是区分模块直接运行和被导入的关键技巧,也是良好编程习惯的体现。