模块
大家好!这个章节我们要讨论的是 Python 中的“模块”概念。模块是组织和封装代码的一个方式,能够帮助我们将程序拆分成小块,这样不仅可以提高代码的可读性,还能方便复用。你可以把模块想象成一个工具箱,里面装着很多有用的工具(函数、类等),你可以根据需要随时拿出来用。接下来,我们就一起了解一下模块的基本使用。
简介
Python 的模块是用于组织、封装和重用代码的文件,一个 Python 文件就是一个模块。
一个模块中可以包含变量、函数、类和其他 Python 语句,它允许将代码逻辑划分为独立的单元,并提供了一种组织代码的方式,使代码更加模块化和易于维护。
Python 的模块可以分为三类,非别是 内建模块、第三方模块 和 自定义模块。
Python 的模块是一个代码组织单元,每个 Python 文件都是一个模块。你可以把它看作是一个封装好的“包”,其中可以包含函数、变量、类和其他代码。当你在一个程序中多次使用某些功能时,模块帮助你把这些功能抽象出来,避免重复编写。Python 的模块有三种类型:内建模块、第三方模块和自定义模块。
模块的导入
Python 可通过模块导入引用其它模块中的数据,提供了 import 和 from - import 两种导入方式。
在 Python 中,如果你想使用某个模块的功能,可以通过导入它。导入模块的方式有好几种,最常见的是使用 import 和 from import。接下来我们分别来看看这两种导入方式。
import导入:Python 中使用import关键字来导入模块,导入模块后,在当前文件中做为一个对象使用,可以通过.来引用模块中定义的函数、变量或类等。
# 导入内建模块 math
import math
#可以使用其中的 sqrt()来计算平方根
result = math.sqrt(25)
print(result)
使用 import 导入模块是最常见的方式。通过 import 导入的模块在当前文件中就变成了一个对象,可以通过点(.)操作来访问模块里的内容。举个例子,如果我们想使用 math 模块中的平方根函数 sqrt(),就可以这样写。这里我们导入了 math 模块,并用 math.sqrt() 来计算 25 的平方根,输出结果是 5.0。
import - as导入:如果被导入的模块名比较长,在使用时会不太方便,也可以使用as为模块指定一个别名,一旦指定了别名,原模块名就不能使用了。
# 导入内建模块 math
import math as m
#可以使用其中的 sqrt()来计算平方根
result = m.sqrt(25)
print(result)
如果你导入的模块名很长,可能会觉得在代码中反复写这个模块名很麻烦。这时可以使用 as 给模块起个别名。这样我们就可以用别名来代替模块名,代码看起来更简洁。在这个例子中,我们给 math 模块起了个别名 m,然后通过 m.sqrt() 来计算平方根,效果与之前是一样的。
from - impport导入:还可以使用from module_name import object_name语法,从模块中导入特定的对象,这样可以直接使用对象名,无需使用模块名前缀。
from math import sqrt
result = sqrt(25)
print(result)
除了使用 import 导入整个模块,你还可以只导入模块中的某个特定函数或对象。这样你就可以直接使用它,而不需要模块名前缀。这个例子中导入了 math 模块中的 sqrt 函数,现在你可以直接使用 sqrt() 来计算平方根,不需要加上 math. 前缀。
入口函数
入口函数是 Python 程序的执行起点,用于区分模块作为独立脚本运行还是被导入运行。通过 if __name__ == "__main__":,Python 能够明确哪些代码应该在脚本直接运行时执行,而不是在模块被导入时运行。
既然说到了模块的导入,这里就需要给大家介绍另外一个概念,那就是入口函数。在 Python 中,入口函数用于区分一个模块是直接运行还是被导入使用。通过 if name == "main": 语句,Python 能够确定哪些代码应该在模块作为独立脚本运行时执行,而不是在模块被导入时执行。
原理解析
- Python 在运行脚本时,会自动为每个模块定义一个特殊变量
__name__。 - 直接运行脚本时:
__name__的值是"__main__"。 - 模块被导入时:
__name__的值是模块的名字。
if __name__ == "__main__":
# 当且仅当脚本直接运行时执行此代码块
pass
每个 Python 模块都有一个内置变量 name,当你直接运行一个 Python 文件时,name 的值会是 "main"。而当这个文件作为模块被导入时,name 的值则是模块的名称。通过这种方式,我们可以保证某些代码只有在模块直接执行时才会被运行,避免在被导入时不必要的执行。
入口函数的作用
- 避免不必要的执行:当模块被导入时,只有定义的函数、类和变量会加载,而不会执行入口函数中的代码。
- 便于模块化编程:使脚本既可以独立运行,又可以作为模块被复用。
- 程序结构清晰:通过入口函数组织主逻辑,增强代码的可读性和维护性。
入口函数的作用主要有三个。第一,避免不必要的执行,当模块被导入时,只有函数、类、变量等会被加载,而入口函数中的代码不会执行。第二,便于模块化编程,使脚本既可以独立运行,又可以作为模块被其他程序复用。第三,程序结构清晰,通过入口函数组织主逻辑,使代码更具可读性和可维护性。
模块复用与入口函数
# module.py
def add(a, b):
return a + b
if __name__ == "__main__":
print("测试函数 add: 3 + 5 =", add(3, 5))
# main.py
import module
result = module.add(10, 20)
print("模块函数调用结果:", result)
假设我们有一个模块 module.py,其中有一个加法函数 add()。如果我们希望在直接运行 module.py 时做一些测试,但在其他地方导入时不执行测试代码,我们可以这么做。在 main.py 中,如果我们导入这个模块并调用 add(),就不会执行入口函数中的测试代码了。
运行结果
# 运行 module.py
测试函数 add: 3 + 5 = 8
# 运行 main.py
模块函数调用结果: 30
直接运行 module.py 会执行入口函数中的测试代码,而通过导入 module.py 时,测试代码不会执行。
内建模块
Python 标准库中包含了大量的内建模块,这些模块提供了各种功能,如数学计算、字符串处理、日期时间操作、文件操作等。通过导入相应的内建模块,可以使用这些功能,避免重复编写代码。
Python 提供了大量的内建模块,方便我们完成各种常见任务,比如生成随机数、处理日期时间、操作文件等。你只需导入相应的模块,就能立即使用这些功能。
import random
# 生成1到100之间的随机整数
random_number = random.randint(1, 100)
print(random_number)
import datetime
# 获取当前日期和时间
current_datetime = datetime.datetime.now()
# 格式化日期输出
formatted_date = current_datetime.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_date)
比如通过 random.randint() 函数,我们可以轻松生成一个 1 到 100 之间的随机整数。datetime 模块提供了处理日期和时间的功能,strftime() 方法可以用来格式化输出日期。
dir() 函数
dir() 是 Python 内置函数,用于获取指定对象的所有属性和方法的列表。
格式: dir(obj)
import math
print(dir(math))
再比如,dir() 是 Python 内置的一个函数,用来列出对象的所有属性和方法。你可以使用 dir() 来查看某个模块、类或对象支持哪些操作。这个例子中,我们调用 dir(math),它会返回 math 模块中的所有函数和变量,帮助我们了解模块的内容。
自定义模块
由开发者编写,用于封装代码、组织功能,以便在其他 Python 程序中复用。自定义模块是一个 Python 文件,可以包含函数、类、变量等。
# 创建一个my_module.py文件
def greet(name):
return f"Hello, {name}!"
def add(a, b):
return a + b
除了使用内建模块,我们也可以自己写模块,以便在多个程序中复用。自定义模块是一个 Python 文件,你可以在其中定义函数、类和变量等。
在其他文件中使用:
# 导入
import my_module
print(my_module.greet("Alice"))
print(my_module.add(5, 3))
然后,在其他文件中使用这个模块。这样,my_module 就成了一个可以在多个 Python 程序中复用的模块。
第三方模块
第三方模块和库通过包管理工具 pip 安装。如:PyMySQL, pytest, Flask, SQLAchemy 等等。
除了 Python 自带的内建模块,我们还可以通过包管理工具 pip 安装第三方模块。第三方模块和库可以为我们提供更多的功能,比如数据库操作、网络请求等。常见的第三方模块有 PyMySQL、Flask、pytest 等。具体的使用我们会在后面再单独介绍。
总结
- 模块的导入
- 内建模块
dir()函数- 自定义模块
- 第三方模块
最后我们来总结一下。这个章节我们学习了 Python 的模块概念,包括如何导入模块、内建模块、自定义模块、第三方模块的使用方法。我们还了解了 if name == "main": 的作用,它帮助我们在脚本直接运行时执行代码,在作为模块导入时避免执行不必要的代码。希望大家能更好地理解和使用模块,让代码更加模块化和易于维护。