Python青少年简明教程:模块
Python模块是一种组织代码的方式,用于将相关的函数、类和变量分组在一起,从而提高代码的可重用性和可维护性。一个模块通常是一个包含Python代码的文件,文件名以.py作为扩展名。使用模块,可以在不同的Python脚本之间共享代码,而不需要重复编写相同的代码。
概述
Python模块可以分为以下几类:
内置模块
Python标准库中自带的模块,如math、os、sys、tkinter等。这些模块在安装Python时已经包含在内,可以直接导入使用。
【math:提供了数学函数,如三角函数、指数函数、对数函数等。
os:提供了与操作系统交互的功能,如文件和目录操作、进程管理等。
sys:提供了与Python解释器交互的功能,如访问解释器参数、获取版本信息等。
tkinter是Python的一个内置模块,提供了GUI(图形用户界面)编程的功能。它允许你创建窗口、按钮、文本框等用户界面元素,并进行交互。】
第三方模块
由第三方开发者创建的模块,提供了丰富的功能和扩展,使得Python开发更加高效。第三方模块在首次使用前必须安装之,通过包管理工具(如pip)进行安装。例如,requests、numpy、pandas等。
【Requests:提供了用于HTTP请求的库,用于进行网络通信和数据获取。
NumPy 用于科学计算的库,提供支持大型、多维数组和矩阵的功能。
Pandas 用于数据分析和数据处理的库,支持数据结构和数据操作。】
自定义模块
用户自己创建的模块,通常是为了解决特定问题或实现某些特定功能。Python自定义模块可以包含函数、类和变量等,这些都可以被其他Python文件通过import语句引入。自定义模块是代码复用和组织代码结构的有效方式。
模块可以通过import语句在其他Python脚本中导入使用。
Python还支持包(package)的概念,即包含多个模块的目录。Python多文件编程的的基础是模块。在Python中,模块就是文件,文件就是模块。通过模块,可以将代码组织成逻辑单元,并通过导入和使用其他模块来实现功能的复用和组合。
包是包含多个模块的目录,可以进一步组织大型项目。包中可以包含一个 __init__.py 文件(在Python 3.3+中引入了命名空间包(Namespace Packages)的概念,不需要包含__init__.py)。
Python中的模块(Module)、包(package)和库(library):
阅读Python资料时,你可能会看到这些说法,什么意思呢?
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。或者说是 Python 代码的一种组织单位。模块包含可重用的函数、类或变量。
包(Package)是一种组织相关模块的方式,本质上是一个包含多个模块的目录。多个模块放在一个文件夹,就是一个包(package)。在早一点的 Python 版本(Python 3.3 之前)中,如果一个文件夹下有一个 __init__.py 文件,那我们就称之为包。在后来的 Python 版本(Python 3.3 开始)中,就没有这个要求了,只要是文件夹就可以当作包(package),简单地说,包由相关目录里的模块构成。包可以包含子包,形成层次结构——每一层都可以包含模块文件和子包目录。
包(Package)的作用:
a.组织相关的模块。
b.避免命名冲突。
c.提供一种层次结构来组织代码。
python中的库(Library)是参考其它编程语言的说法,是一个更宽泛的术语,通常指一组相关的包或模块的集合。既可以是一个模块也可以是一个包,是对模块或包的通俗的说法。例如:Python标准库是Python内置的一大组模块和包;第三方的NumPy、SciPy 通常被称为科学计算库。
Python 提供了几种导入模块的方式,每种方式都有其特定的用途和语法。以下是主要的导入方式:
☆基本导入:
import module_name
使用时需要加模块名前缀:module_name.function_name()
☆从模块中导入特定项:
from module_name import function_name, class_name
可以直接使用导入的函数或类,无需模块名前缀
☆导入所有内容(通常不推荐):
from module_name import *
可以使用模块中的所有内容,但可能导致命名冲突
☆使用别名:
import module_name as alias
from module_name import function_name as fn
使用别名可以简化长模块名或避免命名冲突
☆相对导入(在包内使用):
from . import module_name
from ..subpackage import module_name
用于包内部模块之间的导入
☆导入子模块:
import package.submodule
导入包中的特定子模块
包(Package)
包(Package)是一种组织相关模块的方式,本质上是一个包含多个模块的目录。
包可以包含子包,形成层次结构,也即是,每一层都可以包含模块文件和子包目录。例如:有一个名为 'myproject' 的包,它可能有如下结构:
myproject/
├── __init__.py
├── module1.py
├── module2.py
└── subpackage1/
├── __init__.py
├── module3.py
└── subpackage2/
├── __init__.py
└── module4.py
每个包和子包目录中通常都有一个__init__.py文件,这个文件可以为空,也可以包含初始化代码,它标识该目录是一个Python包。
这种层次结构使得大型项目更加组织有序,便于管理和维护。它允许开发者将相关功能分组,同时保持清晰的结构和命名空间。
导入方式
可以使用点号来访问子包和模块。例如:
from myproject.subpackage1.subpackage2 import module4
在包的结构中,可以使用相对导入来引用同级或上级包中的模块。例如,在 module3.py 中:
from . import module4 # 导入同级的 module4
from .. import module1 # 导入上一级的 module1
Python模块(包、库)的查看、安装、验证和卸载
下面介绍是在Windows操作系统环境中的cmd中进行。cmd的打开:按下win键+R键(即先按下 键,再按下R键)或 右击“开始”->单击“运行”,弹出“运行”窗口,参见下图:
查看已安装的模块,在cmd窗口中,输入如下命令后,按下回车(标有Enter)键:
pip list
这会显示所有已安装的包及其版本。
安装模块(在cmd窗口中):
pip install package_name
例如:pip install numpy
验证安装(在cmd窗口中):
pip show package_name
卸载模块(在cmd窗口中):
pip uninstall package_name
假设电脑中安装多个python版本,如何查看、安装、验证、卸载模块(包、库),请在pip前面加入
py -X.Y -m
其中X.Y代表Python版本,多余的部分舍弃如3.10.5,取3.10,即只取第二个点前的部分。
如:查看特定Python 3.10版本的已安装模块(在cmd窗口中):
py -3.10 -m pip list
自定义模块
模块实际是一个包含Python代码的文件,其文件名以 .py 结尾。要创建一个模块,只需创建一个Python文件,并在其中定义函数、类或变量。例如,创建一个名为 mymodule.py 的自定义模块(创建一个Python代码文件):
# mymodule.py
"""这是一个示例模块(module)"""
def greet(name):
return f"Hello, {name}!"
class Person:
def __init__(self, name):
self.name = name
def say_hello(self):
return f"Hi, I'm {self.name}."
提示:
1)模块名应使用小写字母,可以包含下划线。
2)避免使用与内置模块相同的名称。
3)在模块顶部可以添加文档字符串,描述模块的功能。
要使用模块中的内容,需要先导入该模块。可以使用 import 语句来导入模块:
import mymodule
print(mymodule.greet("Alice")) # 输出: Hello, Alice!
person = mymodule.Person("Bob")
print(person.say_hello()) # 输出: Hi, I'm Bob.
注意,Python创建和使用自定义模块时,文件路径是一个重要的方面,确保你的模块文件位于Python解释器能够找到的路径。通常来说,将模块文件放在与你的主程序文件同一目录下是最简单的方式。Python 的模块导入机制要求模块(即 Python 文件)在同一目录下或在 Python 的搜索路径中才能被找到。
创建复杂的程序时,可以将其拆分为多个模块,以便更好地管理。例如创建一个简单的图书管理系统,该系统可以添加、删除和查询图书。我们可以将这个程序拆分为几个模块:
book.py:负责图书的定义和相关操作。
library.py:负责图书馆的管理,包括添加、删除和查询图书。
main.py:主程序,用户界面与交互。
假设你目录结构
book/
│
├── book.py
├── library.py
└── main.py
book.py定义了两个函数:create_book用于创建一个字典表示的图书,book_to_string用于将图书信息转换为字符串格式。源码如下:
# book.py
def create_book(title, author):
return {"title": title, "author": author}
def book_to_string(book):
return f"{book['title']} by {book['author']}"
library.py提供了三个函数:add_book用于向库中添加图书,remove_book用于从库中删除指定标题的图书,list_books用于列出所有图书。源码如下:
# library.py
import json
from book import create_book, book_to_string
def load_library(filename):
try:
with open(filename, 'r') as f:
return json.load(f)
except FileNotFoundError:
return []
def save_library(library, filename):
with open(filename, 'w') as f:
json.dump(library, f)
def add_book(library, title, author):
new_book = create_book(title, author)
library.append(new_book)
def remove_book(library, title):
library[:] = [book for book in library if book['title'] != title]
def list_books(library):
return [book_to_string(book) for book in library]
main.py作为程序入口,通过用户输入调用这些函数来进行操作。在这个简单示例中,当你运行 main.py 时,程序会尝试加载名为 library.json 的文件。如果该文件不存在,程序将创建一个新的空列表来表示图书馆。当你添加或删除图书并选择退出时,程序会将当前的图书数据保存到 library.json 文件中。library.json会被创建并存储在与 main.py 文件相同的目录中。每本图书包含标题和作者的信息。源码如下:
# main.py
from library import add_book, remove_book, list_books, load_library, save_library
def main():
filename = 'library.json'
library = load_library(filename)
while True:
print("\n1. Add Book")
print("2. Remove Book")
print("3. List Books")
print("4. Exit")
choice = input("Choose an option: ")
if choice == '1':
title = input("Enter the book title: ")
author = input("Enter the author's name: ")
add_book(library, title, author)
print(f"Added '{title}' by {author}.")
elif choice == '2':
title = input("Enter the book title to remove: ")
remove_book(library, title)
print(f"Removed '{title}' from the library.")
elif choice == '3':
books = list_books(library)
if books:
print("\nBooks in the Library:")
for book in books:
print(book)
else:
print("No books in the library.")
elif choice == '4':
save_library(library, filename) # Save data before exiting
break
else:
print("Invalid option! Please try again.")
if __name__ == "__main__":
main()
如果你将这些文件放在不同的目录中,这涉及到更复杂的项目结构,你需要确保使用合适的包结构和导入语句,或者将所需的模块添加到 Python 的搜索路径中。
通过使用模块,Python实现了代码的模块化和可重用性,这是构建大型、复杂应用程序的基础。
模块系统使得代码组织更加清晰,协作开发更加容易,同时也提高了代码的可维护性,提高代码的可扩展性和重用。
1. 代码组织更加清晰
通过将代码分割成多个模块,每个模块负责特定的功能或逻辑,整个项目的结构变得更加清晰。例如,一个大型项目可以有独立的模块来处理数据库操作、用户认证、API请求等。使得开发者可以快速找到和理解某个特定功能代码所在的位置。
2. 协作开发更加容易
在一个团队中,不同的开发者可以同时工作在不同的模块上,而不会相互干扰。例如,一个开发者可以专注于用户认证模块,另一个开发者则可以处理数据库操作。这种分工不仅提高了效率,还减少了合并冲突的可能性。
3. 提高代码的可维护性
每个模块封装了特定的功能,实现了隔离,使得修改和调试变得更加容易。如果某个功能需要修改,只需更新对应的模块,而不必担心影响到其他部分。这种隔离还减少了引入错误的风险。
4. 提高代码的可扩展性和重用
通过定义良好的接口(函数、类等),新功能可以轻松地添加到现有系统中,而无需大规模重构。例如,可以为现有项目添加新的API端点或新的数据库查询方法,只需创建新的模块或在现有模块中添加新函数即可。
在 Windows 上运行 .py 文件最常用的几种方式:
前提是 Python 安装正确
1.使用 IDLE(Python 的集成开发环境):
a. 右键点击 .py 文件
b. 选择"Edit with IDLE"
c. 在 IDLE 中打开文件后,按 F5 键或选择 Run > Run Module
2.使用命令提示符(CMD):
a. 打开命令提示符(可以在开始菜单中搜索"cmd")
b. 使用 cd 命令导航到包含 .py 文件的目录
c. 输入以下命令并按回车:
python your_script.py
3.直接双击 .py 文件:
在Windows系统中,当您双击一个 .py 文件来运行它时,通常会打开一个命令行窗口并执行该Python脚本。
如果脚本执行非常迅速,窗口会在执行完毕后立即关闭,这样您可能无法看到任何输出信息。要解决这个问题,可以采取以下几种方法:
a.在脚本末尾添加 input():
在脚本最后添加一行代码,例如:
input("Press Enter to exit...")
b.创建一个批处理文件:
创建一个 .bat 文件来运行 Python 脚本,内容如下:
@echo off
python your_script.py
pause
将这个批处理文件和your_script.py放在同一目录中。当双击运行此批处理文件时,它会在脚本执行完后显示“Press any key to continue...”的提示,直到您按下任意键。
进一步学习了解可见:
Python第三方模块(库、包)安装、卸载与查看及常见问题解决 https://blog.csdn.net/cnds123/article/details/104393385
python之import语句的用法 https://blog.csdn.net/cnds123/article/details/118437585
python中的自定义模块及其使用 https://blog.csdn.net/cnds123/article/details/107087019
python复杂程序的组织讲座 https://blog.csdn.net/cnds123/article/details/108614392