目录
Python 的强大之处之一就是其模块化编程的支持。模块是代码的组织单元,它允许你将代码划分为可重用的部分,从而提高代码的可维护性和可扩展性。今天我们一起来探讨 Python 模块的概念、创建和使用方法,以及一些常见的 Python 标准库模块。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。
模块是包含 Python 代码的文件,它可以包括变量、函数和类。通过将代码组织成模块,我们可以更好地组织代码、提高可重用性,并支持更好的命名空间管理。使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
此外,Python为了避免模块名冲突,引入了按目录来组织模块的方法,称为包(Package)。如:
其中,first_demo.py,main.py就是一个名字分别叫做first_demo和main的模块。而first_demo存在模块冲突了,于是我们通过first包(Package)来组织,避免冲突。
Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用。如os模块、datetime模块、random模块等。使用内置模块我们只需要使用import导入该模块,然后就有了以模块名称为变量名的变量引用该模块,使用该变量就可以访问模块里的所有功能。
os 模块提供了与操作系统交互的功能,包括文件和目录操作、环境变量等。
import os
if __name__ == '__main__':
""" 返回当前的工作目录 """
""" Return a unicode string representing the current working directory. """
print(os.getcwd())
datetime 模块用于处理日期和时间,提供了丰富的功能,如日期的格式化、时间的计算等。
from datetime import datetime
if __name__ == '__main__':
now_time = datetime.now()
print("当前时间:", now_time)
random 模块用于生成伪随机数,提供了多种随机数生成函数。
import random
if __name__ == '__main__':
for i in range(10): # 打印10次
print(random.randint(1, 100))
除了使用Python标准库中的模块以外,我们还可以按需定义自己的模块。这种方式在团队协作开发模式中非常有用。
创建模块非常简单,只需将相关代码保存在一个文件中,并使用 import 关键字在其他地方引入它。
定义一个my_module.py模块,里面定义了一个接收名称的函数,同时返回hello, xxx。
# 定义了一个sqy_hello函数,用于外部调用
def say_hello(name):
return f"Hello, {name}!"
使用该模块:
# 使用import关键字引入该模块
import my_module
if __name__ == '__main__':
# 调用该模块
print(my_module.say_hello("张三"))
模块创建了一个独立的命名空间,可以使用模块名来访问其中的变量和函数,从而避免命名冲突。如在my_module.py模块中定义一个变量,我们在引用该模块的函数中可以调用该变量,而不与自己模块冲突。如:
COUNTRY = "中国"
# 定义了一个sqy_hello函数,用于外部调用
def say_hello(name):
return f"Hello, {name}!"
调用:
import my_module
COUNTRY = "中国111"
if __name__ == '__main__':
print(my_module.say_hello("张三"), my_module.COUNTRY, "你好")
模块的作用域是指在模块中定义的变量、函数和类的可见性和访问范围。
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。而在Python中,是通过_前缀来实现的。正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等。
类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名。
类似_xxx和__xxx这样的函数或变量就是非公开的(private),表示这个函数是“内部实现细节”或“私有”的,不应该被直接引用或调用。这是一种命名约定,告诉其他程序员,这个函数是模块内部使用的,不属于模块的公共接口。
def _internal_function():
print("This is an internal function.")
def public_function():
print("This is a public function.")
其中_internal_function 被认为是模块内部使用的,而 public_function 是模块的公共接口。
除了Python自带的模块,自己定义的模块以外,通常还会使用别人定义好的第三方依赖。使用这些依赖,由于不在我们的Python库中,因此需要先进行安装。
在Python中,安装第三方模块,是通过包管理工具pip完成的。
pip install package_name
例如安装requests依赖:
pip install requests
通常,在项目中会有一个名为 requirements.txt 的文件,其中列出了项目所需的所有依赖。你可以使用以下命令一次性安装所有依赖:
pip install -r requirements.txt
如果你需要安装特定版本的依赖,可以使用 == 符号:
pip install package_name==1.2.3
# 指定安装最新版本
pip install --upgrade package_name
有时你可能需要从版本库(例如 GitHub)直接安装依赖。可以使用以下命令:
pip install git+https://github.com/username/repo.git
使用import引入模块时,引用模块的变量名默认为模块名。有时候如果模块名太长,我们可以通过as关键字,进行变量名重定义。如:
import my_module as mm # 定义变量名为mm
if __name__ == '__main__':
# 这里通过重定义的变量名mm访问模块功能
print(mm.say_hello("张三"))
from ... import ... 是一种导入模块中特定成员(变量、函数、类等)的语法。这种方式允许你直接从模块中导入你需要的部分,而不是整个模块。如:
"""
这里只导入了math模块中的sqrt函数
如果要导入多个函数,使用英文逗号,隔开即可
如果需要引入全部模块,import后面跟上*号即可,这种方式不是推荐的做法,因为它可能导致命名冲突和代码不易读。
"""
from math import sqrt
result = sqrt(25)
print(result)
Python 模块是模块化编程的基础,能够帮助我们更好地组织和管理代码。通过合理使用模块,我们可以提高代码的可读性、可维护性,并能够更容易地共享和重用代码。掌握模块的基本概念和高级用法,是成为 Python 高效开发者的重要一步。