Python提供了强大的模块支持, 不仅体现在Python标准库中包含了大量的模块, 还可以通过第三方模块来扩展功能.
这里举一个使用标准库模块的例子:
import sys
print('命令行参数如下:')
for i in sys.argv:
print(i)
print('\n\nPython 路径为:', sys.path, '\n')
这个例子中, 我们导入了sys
模块, 然后使用sys.argv
和sys.path
两个变量来获取命令行参数和Python的搜索路径.
模块概述
为了编写可维护的代码, 我们把很多函数分组, 分别放到不同的文件里, 这样每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式. 在Python中, 一个.py
文件就称之为一个模块.
使用模块有什么好处?
最大的好处是大大提高了代码的可维护性.
其次编写代码不必从零开始. 当一个模块编写完毕, 就可以被其他地方引用. 我们在编写程序的时候, 也经常引用其他模块, 包括Python内置的模块和来自第三方的模块.
使用模块还可以避免函数名和变量名冲突. 相同名字的函数和变量完全可以分别存在不同的模块中, 因此我们自己在编写模块时, 不必考虑名字会与其他模块冲突. 但是也要尽量不要与内置函数名字冲突.
自定义模块
自定义模块主要有两个作用:
- 代码重用: 我们可以把一些常用的函数和类封装到模块中, 然后在其他地方引用.
- 组织代码: 我们可以把相关的代码放在一个模块中, 这样代码的可读性和维护性都有很大提高.
创建模块
创建一个模块很简单, 只需要创建一个.py
文件, 然后在文件中定义函数和类, 就可以作为模块使用.
但是设置的模块名不能是Python自带的标准库中的模块名, 否则会导致冲突.
使用import导入模块
导入模块使用import
语句, 语法如下:
import 模块名 [as 别名]
当解释器遇到 import 语句, 如果模块在当前的搜索路径就会被导入.
搜索路径时一个解释器会先进行搜索的所有目录的列表. 如想要导入模块, 需要把命令放在脚本的顶端.
一个模块只会被导入一次, 不管你执行了多少次 import. 这样可以防止导入模块被一遍又一遍地执行.
导入模块后, 可以使用模块名访问模块中的函数和类.
如果模块名太长, 可以使用as
给模块取一个别名, 这样可以简化代码.
在调用模块中的函数或类时, 可以用模块名.函数名
或模块名.类名
的形式来调用.
使用import语句还可以一次性导入多个模块, 语法如下:
import 模块1, 模块2, 模块3...
使用from…import…语句导入模块
在使import
语句导入模块时, 每执行一次都会创建一个新的命名空间, 并且在该命名空间中执行与.py
文件相关的所有语句.
在执行的时候需要再具体的变量, 函数, 类名前加前缀.
如果不想在每次导入模块时都创建一个新的命名空间, 而只是将具体的定义导入到当前的命名空间中, 就可以使用from...import...
语句.
且不需要再加前缀, 直接使用函数或类名即可.
语法如下:
from 模块名 import members
members可以是函数, 类, 变量等, 多个成员用逗号隔开. 如果要导入多个成员, 则可以用星号*
表示全部导入.
from 模块名 import *
这样可以一次性导入模块中的所有成员.
在使用from...import...
语句导入模块时, 需要保证所导入的内容在当前的命名空间中没有重名的定义. 后导入的成员会覆盖前面的成员.
模块搜索目录
当使用import
语句导入模块时, 默认情况下会按照以下顺序进行查找:
- 当前目录(即执行的脚本所在的目录)
- 环境变量
PYTHONPATH
指定的目录 - Python安装目录的
Lib
目录
以上各个目录的具体位置保存在标准模块sys
的path
变量中, 可以通过以下代码查看:
import sys
print(sys.path)
模块的包
使用模块可以避免由于模块名冲突导致的命名空间冲突, 但如果模块太多或者重复, 那么管理起来就比较麻烦.
为了解决这个问题, Python提供了包(package)的概念. 包是一个目录, 里面包含多个模块和子包.
创建和使用包
创建包实际上就是创建一个文件夹, 然后在文件夹中创建一个__init__.py
文件, 这个文件可以为空, 也可以包含模块的导入和初始化代码.
创建完包后, 就可以在包中创建模块, 也可以在包中创建子包.
从包中加载模块通常有以下三种方式:
1.通过”import+完整包名.模块名”的形式导入指定模块:
import mypackage.mymodule
这个时候调用变量或者函数时, 需要再加上包名作为前缀, 即mypackage.mymodule.变量名
或mypackage.mymodule.函数名()
.
2.通过”from+完整包名+import+模块名”的形式导入指定模块:
from mypackage import mymodule
这个时候调用变量或者函数时, 直接用模块名作为前缀即可, 即mymodule.变量名
或mymodule.函数名()
.
3.通过”from+完整包名+模块名+import+定义名”的形式导入指定成员:
from mypackage.mymodule import 定义名
这个时候调用变量或者函数时, 直接用定义名作为前缀即可, 即变量名
或函数名()
.
以主程序的形式执行(name属性)
有的时候我们需要让一个模块作为主程序的入口文件, 这样可以让模块中的代码在被导入时不会被执行, 只有在主程序运行时才会被执行.
为了实现这个功能, 我们可以在模块的开头加上以下代码:
if __name__ == '__main__':
# 主程序的代码
这样当模块被直接运行时, 代码块中的代码才会被执行. 当模块被导入时, 代码块中的代码不会被执行.
例如, 我们有一个mymodule.py
文件, 内容如下:
def my_func():
print('This is my module')
if __name__ == '__main__':
my_func()
当我们在命令行中运行python mymodule.py
时, 输出This is my module
, 说明my_func()
函数在主程序运行时被执行.
当我们导入mymodule
模块时, 由于if __name__ == '__main__':
代码块不会被执行, 所以my_func()
函数不会被执行.
注意事项
- 主程序的入口文件必须是
__main__.py
- 主程序的入口文件必须放在包的根目录下
- 主程序的入口文件必须包含
if __name__ == '__main__':
代码块 - 主程序的入口文件可以包含其他代码, 但这些代码必须在
if __name__ == '__main__':
代码块中
在每个模块中, __name__
属性的值永远是模块的名字. 如果模块是被导入的, 那么__name__
的值就是模块的名字. 如果模块是被直接运行的, 那么__name__
的值就是'__main__'
字符串.
因此, 在模块中, 可以通过if __name__ == '__main__':
代码块来判断当前模块是否是主程序的入口文件. 如果是, 则执行模块中的代码. 如果不是, 则不执行模块中的代码.
注意: __name__
这里是双下划线.
引用其他模块
Python除了自定义模块, 还可以引用其他模块, 包括Python标准库中的模块和第三方模块.
导入和使用标准库模块
Python标准库提供了大量的模块, 我们可以直接使用这些模块来解决编程问题.
例如导入math
模块, 就可以使用其中的数学函数:
import math # 导入math模块
print(math.sqrt(9)) # 计算平方根
print(math.pi) # 计算圆周率
Python提供了大量的标准库模块, 常用的标准模块及其描述如下:
- sys: 系统相关功能, 用于退出Python解释器, 访问命令行参数, 环境变量等.
- os: 操作系统相关功能, 用于文件和目录的操作, 进程管理, 网络通信等.
- time: 时间相关功能, 用于获取当前时间, 日期, 时区等.
- calendar: 日历相关功能, 用于处理日期, 星期等.
- urllib: URL处理相关功能, 用于处理URL, 抓取网页, 下载文件等.
- json: JSON数据处理相关功能, 用于处理JSON数据.
- re: 正则表达式相关功能, 用于处理字符串匹配.
- random: 随机数相关功能, 用于生成随机数.
- math: 数学相关功能, 用于计算常用数学函数, 如平方根, 三角函数等.
- decimal: 十进制浮点数相关功能, 用于处理高精度的浮点数.
- shutil: 文件和目录相关功能, 用于复制, 移动, 删除文件和目录.
- logging: 日志记录相关功能, 用于记录程序运行日志.
- tkinter: GUI编程相关功能, 用于创建图形用户界面.
- sqlite3: SQLite数据库相关功能, 用于处理SQLite数据库.
其他的标准库模块可以参考官方文档: https://docs.python.org/3/library/index.html
导入和使用第三方模块
除了使用Python标准库模块, 我们还可以导入第三方模块. 这些模块一般由Python社区提供, 并经过测试和验证, 安全可靠. 可以在PyPI(Python Package Index)(https://pypi.python.org/pypi/)上搜索到.
使用Python第三方模块时, 需要先安装, 然后可以像使用标准库模块一样导入.
安装第三方模块可以使用pip
命令, 语法如下:
pip <command> [modulename]
- command: 安装(install), 卸载(uninstall), 升级(upgrade), 列出(list)等命令.
- modulename: 要安装的模块名.
安装第三方模块时, 可以在命令提示符或终端中运行上述命令, 也可以在Python程序中使用subprocess
模块调用命令行安装命令.
anaconda
Anaconda是一个基于Python的数据处理和科学计算平台, 它已经内置了许多非常有用的第三方库, 我们装上Anaconda, 就相当于把数十个第三方模块自动安装好了, 非常简单易用.
Anaconda安装包有500~600M, 所以需要耐心等待下载. 下载后直接安装, Anaconda会把系统Path中的python指向自己自带的Python, 并且, Anaconda安装的第三方模块会安装在Anaconda自己的路径下, 不影响系统已安装的Python目录.
Anaconda安装后, 我们可以直接使用pip命令安装第三方模块, 例如:
pip install Pillow
这样,Pillow模块就会被安装到Anaconda的路径下,我们就可以直接使用了.
anaconda安装教程:https://blog.csdn.net/qq_44000789/article/details/142214660
Pycharm
Pycharm提供了一些第三方模块的安装功能, 我们可以直接在Pycharm中安装第三方模块.