Python模块是一个包含Python定义和语句的文件。
- 模块可以定义函数、类和变量。 模块也可以包含可执行的代码。
- 一个模块就是一个包含Python代码的文件,文件后缀是.py。
- 模块可以被其他程序引入(import),以使用该模块中的函数等功能。这也是使用Python标准库的方法。
一、Python模块的作用
1、代码重用:
模块的主要目的是提供代码重用。将一组相关的函数和类组织到一个模块中,在需要的地方导入并使用这个模块。
2. 组织代码:
通过模块化,将复杂的程序分解为多个更小、更易于管理的部分。有助于提高代码的可读性和可维护性。
3. 扩展Python功能:
Python的强大功能部分归功于其丰富的标准库和大量的第三方库。这些库都是以模块的形式提供的,它们可以扩展Python的基本功能,使其能够处理各种复杂的任务。
二、导入模块的方式
使用import语句来导入一个模块,使得模块中的函数、类和变量可以在你的代码中使用。
1 导入整个模块
import math # 使用模块中的函数
print(math.sqrt(16)) # 输出:4.0
2 导入模块并为其指定别名
若模块名较长或者可能与你的代码中的其他部分发生冲突,可为模块指定一个别名。
import math as m # 使用别名来访问模块中的函数
print(m.sqrt(16)) # 输出:4.0
3 从模块中导入特定的函数或变量
from math import sqrt # 直接使用函数
print(sqrt(16)) # 输出:4.0
4 从模块中导入多个特定的函数或变量
from math import sqrt, pow # 直接使用这些函数
print(sqrt(16)) # 输出:4.0
print(pow(2, 3)) # 输出:8.0
5 导入模块中的所有内容(不推荐)
使用from module import *可以导入模块中的所有内容,但这通常不是一个好的做法,因为它可能导致命名冲突,使得代码难以理解和维护。
from math import * # 可以直接使用模块中的所有函数和变量,但不建议这样做
print(sqrt(16)) # 输出:4.0
print(pi) # 输出:3.141592653589793
6 导入自定义模块
如果你有一个自定义的Python模块(即一个.py文件),你可以像导入标准库模块一样导入它。只需确保自定义模块的文件名(不包括.py后缀)是有效的Python标识符,并且该文件位于Python可以搜索的路径中。通常,这意味着它应该在你的脚本所在的同一目录下,或者在Python的site-packages目录中。
例如,如果你有一个名为sum1.py的文件,并且它位于你的脚本所在的同一目录中,你可以这样导入它:
#sum1.py模块def sum1(var1,var2):total = var1+var2print("输出两数之和:",total)return total
在同一目录的另外一个function1.py里进行导入使用:
import sum1
sum1.sum1(2,3) # 输出两数之和: 5
一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
注意:
Python解释器会按照特定的搜索路径来查找模块。如果你遇到“ModuleNotFoundError”,那么可能是因为模块不在搜索路径中。你可以通过修改sys.path或者将模块移动到合适的位置来解决这个问题。
三、命名空间和作用域
变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。
一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。
每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。
(1)Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。
(2)如果要给函数内的全局变量赋值,必须使用 global 语句。global Var 的表达式会告诉 Python, Var 是一个全局变量,这样 Python 就不会在局部命名空间里寻找这个变量了。
示例:
number = 100
def num():# 想改正代码就取消以下注释:#global numbernumber = number + 1print(number)
num()
print(number)
运行结果:
UnboundLocalError: cannot access local variable 'number' where it is not associated with a value
全局命名空间定一个了一个全局变量number ,在函数内给number 赋值,python会认为number 是一个局部变量。但我们并没有声明一个局部变量number ,所以会报错:UnboundLocalError。此时只需要在函数内声明:global number。表示number第一个全局变量。
打开 函数内的global number,运行结果:
100
101
四、模块中的函数使用
1、dir()函数
dir() 函数一个排好序的字符串列表,内容是一个模块里定义过的名字。
返回的列表容纳了在一个模块里定义的所有模块,变量和函数。
# 导入内置math模块
import math
content = dir(math)
print(content)
运行结果:
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh',
'asin', 'asinh', 'atan', 'atan2', 'atanh', 'cbrt', 'ceil', 'comb', 'copysign',
'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'exp2', 'expm1','fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot','inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter','perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh','sqrt', 'sumprod', 'tan', 'tanh', 'tau', 'trunc', 'ulp']
2、globals() 和 locals() 函数
globals() 和 locals() 是 Python 中的内置函数,它们分别用于返回当前全局和局部符号表的字典。全局符号表包含了所有的全局变量,而局部符号表包含了当前作用域中的局部变量。
globals()示例
print("-----全局变量------")
# 定义一些全局变量
global_var1 = "Hello"
global_var2 = 42def show_globals():# 打印全局变量for name, value in globals().items():if name.startswith('global_var'): # 只显示以 'global_var' 开头的全局变量print(f"{name} = {value}")# 调用函数以查看全局变量
show_globals()# 修改全局变量
global_var1 = "大山很山"
global_var2 = 18# 再次调用函数以查看修改后的全局变量
show_globals()
运行结果:
-----全局变量------
global_var1 = Hello
global_var2 = 42
global_var1 = 大山很山
global_var2 = 18
locals()示例
print("-----局部变量------")
def show_locals(x, y):# 定义一个局部变量local_var = "I'm a local variable"# 在函数内部调用 locals()print("Locals inside the function:")for name, value in locals().items():print(f"{name} = {value}")# 访问函数参数print(f"Function parameters: x = {x}, y = {y}")# 调用函数
show_locals(10, 20)
运行结果:
-----局部变量------
Locals inside the function:
x = 10
y = 20
local_var = I'm a local variable
Function parameters: x = 10, y = 20
五、Python中的包
在Python中,包(package)是一个包含多个模块的目录,即一个分层次的文件目录结构。它允许你组织代码,将相关的模块分组在一起,并且提供了一个命名空间来避免命名冲突。包还可以包含子包,这样你可以创建复杂的代码组织结构。
简单来说,包就是文件夹,但该文件夹下必须存在 init.py 文件, 该文件的内容可以为空。init.py 用于标识当前文件夹是一个包。
1、创建包
- 创建一个目录,该目录的名称将成为包的名称。
- 在该目录中,创建一个__init__.py文件(这个文件可以是空的,但它告诉Python这个目录应该被视为一个包)。
- 在该目录中,添加你的模块文件(即.py文件)。
示例;
要求:
创建一个名为mypackage的包,其中包含两个模块:module1.py和module2.py。目录结构如下:
mypackage/ __init__.py module1.py module2.py
2、使用包
要使用包中的模块,你需要导入它们。这可以通过使用import语句,并指定包的名称和模块名称来完成。
import mypackage.module1 # 使用mypackage.module1中的函数或变量
mypackage.module1.some_function()
如果你想从包中导入特定的函数或变量,可以使用from … import …语句:
from mypackage.module1 import some_function # 直接使用函数,不需要前缀
some_function()
3、init.py 文件的作用
init.py 文件对于包来说非常重要,即使它是空的。
它告诉Python这个目录是一个包,而不是一个普通的目录。
此外,init.py 文件还可以用来初始化包的状态,或者定义__all__变量来指定当使用from package import *时应该导入哪些模块或变量。
例如,在__init__.py文件中,你可以这样定义__all__:
# __init__.py __all__ = ['module1', 'module2']
然后,当其他代码使用from mypackage import *时,只会导入module1和module2。
4、嵌套包
包也可以包含子包。子包就是包内部的另一个包。例如:
mypackage/ __init__.py submodule/ __init__.py submodule1.py submodule2.py module1.py module2.py
在这个例子中,submodule是mypackage的一个子包,它包含自己的模块。
你可以通过import语句访问这些子模块,如import mypackage.submodule.submodule1。
注意事项
- 包应该有一个清晰、描述性的名称,以避免与其他包冲突。
- 避免循环导入,即包或模块之间相互导入对方,这会导致难以追踪的错误
- 使用相对导入时要小心,确保你的导入语句与你的包结构相匹配。
包是Python中组织大型项目代码的关键工具,它们帮助你将代码分解为可管理的部分,并提供了一种方式来避免命名冲突和重复代码。