赞
踩
目录
前面的所有文章中,我们都是用python 解释器来编程,也就是说,我们关闭编辑器,再次进入,什么都没有,包括变量,和许多方法。这时,你就想,该如何保存这些变量和方法呢?
所以,今天我们来学习,解决上面问题的方法,使用模块。
当谈到Python的模块和包时,许多人可能会感到头疼。模块(Module)是Python中组织代码的基本方式。它允许你将代码分割成可重用的单元。一个模块可以包含函数、类和变量的定义,以及可执行的代码。模块使得代码更具可读性和维护性,同时也方便了代码的重用。这一点和函数很像,但是确包含了函数。下面认真来看看:
要创建 Python 模块,只需要以下三步:
例如,创建一个名为 my_module.py 的模块,并包含以下代码:
- def say_hello():
- print("Hello, world!")
'运行
保存文件后,使用 import 语句导入模块:
- import my_module
-
- my_module.say_hello()
输出:
Hello, world!
前面简单学习了模块的创建,现在,要使用模块中的函数和变量,你需要先将模块导入到你的代码中。在Python中,有几种导入模块的方式:
import
语句导入整个模块:import 模块名
这样你就可以使用模块中的函数和变量:
- import math
- print(math.sqrt(16)) # 输出 4.0
'运行
2. 使用 from ... import
语句导入模块中的特定函数、类或变量:
from 模块名 import 函数名, 类名, 变量名
直接使用导入的函数、类或变量,而不需要通过模块名来访问:
- from math import sqrt
- print(sqrt(16)) # 输出 4.0
'运行
3. 使用 as
关键字给模块或导入的内容起一个别名:
- import 模块名 as 别名
- from 模块名 import 函数名 as 别名, 类名 as 别名
简化模块名或导入内容的使用:
- import math as m
- print(m.sqrt(16)) # 输出 4.0
-
- from math import sqrt as square_root
- print(square_root(16)) # 输出 4.0
'运行
导入模块后,就可以使用其中定义的函数和变量了。如果是导入整个模块,可以通过 模块名.函数名
或 模块名.变量名
的方式使用。如果是使用 from ... import
导入的特定内容,直接使用函数、类或变量名即可。
常见的,我们导入了 math
模块后:
- import math
-
- # 使用模块中的函数
- print(math.sqrt(16)) # 输出 4.0
-
- # 使用模块中的常量
- print(math.pi) # 输出 3.141592653589793
'运行
如果使用了 from ... import
导入:
- from math import sqrt, pi
-
- # 直接使用导入的函数和变量
- print(sqrt(16)) # 输出 4.0
- print(pi) # 输出 3.141592653589793
'运行
这样,你就可以利用模块的功能,避免重复编写代码,相信我,这样你一定能提高代码的可维护性和可读性。
包(Package)是一种用于组织 Python 模块的层级结构。允许你将相关的模块组织在一起,以便更好地管理和维护代码。包的本质上是一个包含了一个或多个模块的文件夹,其中还包含一个特殊的文件 __init__.py
(双下划线开头和结尾)。
假设你想创建一个名为 my_package
的包,你的文件系统目录结构可能如下:
- my_package/
- __init__.py
- module1.py
- module2.py
- subpackage/
- __init__.py
- submodule1.py
- submodule2.py
其中:
my_package
是包的根文件夹。__init__.py
是一个空文件,它告诉 Python 解释器这是一个包。module1.py
、module2.py
等是包中的模块文件。subpackage
是一个子包,也是一个包含 __init__.py
的文件夹。submodule1.py
、submodule2.py
等是 subpackage
中的模块文件。使用点号(.
)来表示包的层级关系。如果你想导入包中的模块:
- import my_package.module1
- import my_package.subpackage.submodule1
导入的模块起个别名,也可以用as:
- import my_package.module1 as m1
- import my_package.subpackage.submodule1 as sm1
使用 from ... import
来导入模块中的函数、类或变量:
- from my_package.module1 import some_function
- from my_package.subpackage.submodule1 import MyClass
相对导入是相对于当前模块的路径来导入其他模块。它使用点号 .
来表示相对路径。
假设你有一个包 my_package
,包含以下文件结构:
- my_package/
- __init__.py
- module1.py
- module2.py
- subpackage/
- __init__.py
- submodule1.py
如果在 subpackage/submodule1.py
中想导入 module1.py
,可以使用相对导入:
from . import module1
这告诉 Python 从当前模块所在的位置开始查找 module1.py
。
绝对导入是从包的最顶层开始指定完整路径导入模块。你需要明确指定完整的包路径。
如果你在 subpackage/submodule1.py
中想导入 module1.py
,可以使用绝对导入:
from my_package import module1
如果你导入了包或者包中的模块,就可以使用这些模块中的函数、类和变量了。使用方法与导入普通模块一样。
- # 在 module1.py 中定义了一个函数 hello()
- # module1.py
- def hello():
- print("Hello from module1")
'运行
保存module1.py,然后在另一个文件中导入并调用这个函数:
- import my_package.module1
-
- my_package.module1.hello() # 输出:Hello from module1
或者使用 from ... import
语句:
- from my_package.module1 import hello
-
- hello() # 输出:Hello from module1
是不是很简单就使用包,同时还使用了模块!
前面有提到:__init__.py。在 Python 中,__init__.py
文件在包的结构中具有特殊的作用。当 Python 导入一个包时,它会自动执行包中的 __init__.py
文件。这个文件可以包含包的初始化代码,以及定义包的公开接口(可供外部使用的模块、函数、类等)。
包的初始化:__init__.py
可以用于在包被导入时执行一些初始化工作。这可能包括设置包级别的变量、加载子模块或子包,或执行其他初始化操作。比如说,在导入包时加载一些资源或配置信息。
定义包的公开接口:另一个常见的用法是通过 __init__.py
定义包的公开接口,即定义哪些模块、函数、类是包的外部接口,可以被其他模块导入和使用。
在 __init__.py
中,你可以使用特殊的变量 __all__
来明确指定包的公开接口。这个变量是一个包含字符串的列表,指定了哪些模块应该在使用 from package import *
时被导入。
下面简单演示:
假设你的包 my_package
的结构如下:
- my_package/
- __init__.py
- module1.py
- module2.py
在 __init__.py
中定义 __all__
变量可以限制导入的模块。假设你只想导出 module1
,可以这样做:
- # my_package/__init__.py
- __all__ = ['module1']
'运行
现在,当你在其他地方使用 from my_package import *
时,只有 module1
会被导入:
- from my_package import *
-
- module1.some_function() # 可以调用
- module2.some_function() # 会引发 AttributeError
这种方式可以让你更精确地控制包的公开接口,避免不必要的模块被导入。
在 Python 中,有几个常见的第三方包管理工具,让你可以更方便地管理和安装 Python 包。
pip
是 Python 的包管理工具,它允许你从 PyPI(Python Package Index)安装和管理包。
一些常用的 pip
命令包括:
pip install package_name
pip install --upgrade package_name
pip uninstall package_name
pip list
virtualenv
和 Python 3.3+ 中内置的 venv
是用于创建和管理独立 Python 环境的工具。它们允许你在同一台计算机上拥有多个独立的 Python 环境,每个环境可以有自己的包和依赖。
一些常用的 venv
命令包括:
python3 -m venv myenv
source myenv/bin/activate
myenv\Scripts\activate
Python 生态系统中有许多优秀的第三方包,用于各种不同的用途。以下是一些常见的 Python 包:
如果你编写了自己的 Python 包,并希望与其他人分享,你可以将它发布到 PyPI(Python Package Index)。以下是发布自己的包的基本步骤:
setup.py
文件:setup.py
是一个描述包元数据的 Python 脚本。它包括包的名称、版本、作者、依赖项等信息。setup.py
文件示例:- from setuptools import setup, find_packages
-
- setup(
- name='your_package_name',
- version='0.1',
- packages=find_packages(),
- install_requires=[
- 'dependency1',
- 'dependency2',
- ],
- author='Your Name',
- author_email='you@example.com',
- description='A short description of your package',
- url='https://github.com/you/your_package',
- )
构建包:在包含 setup.py
文件的目录下运行命令:
python setup.py sdist bdist_wheel
注册 PyPI 账户:在 PyPI 上注册一个账户(https://pypi.org/account/register/)。
上传包:使用 twine
工具上传包到 PyPI。确保已安装 twine
:
pip install twine
然后运行命令:
twine upload dist/*
输入 PyPI 账户信息后,twine
将会上传你的包到 PyPI。
现在,其他人就可以通过 pip install your_package_name
来安装你的包了。当然,请确保在发布前仔细测试和验证你的包,做一个合格的coder。
虽然我们简单的讲了Python的模块和包,然后我们还简单交大家发布一个自己的包,但是,掌握这些内容,值得我们花时间去深入理解和应用。
我们下一篇文章将开始Python高阶特性的讲解,继续学习、记录python的下一个知识点。
如果感觉阅读对您还有些作用,可以评论留言,关注我。谢谢您的阅读!
往期学习:
VSCode安装教程(版本:1.87.0)Windows10
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。