教程地址:http://www.showmeai.tech/tutorials/56
本文地址:http://www.showmeai.tech/article-detail/84
声明:版权所有,转载请联系平台与作者并注明出处
在程序开发过程中,文件代码越来越长,维护越来越不容易。我们把很多不同的功能编写成函数,放到不同的文件里,方便管理和调用。在Python中,一个.py文件就称之为一个模块(Module)。
使用模块可以大大提高了代码的可维护性,而且当一个模块编写完毕,就可以被其他地方引用。我们在使用python完成很多复杂工作时,也经常引用其他第3方模块,受益于强大的python社区,几乎我们完成任何一项任务,都可以有对应的方便快捷可引用的库和模块来协助。
模块是一个包含所有你定义的函数和变量的文件,以.py后缀结尾。模块可以被别的程序引入和使用其中的函数功能。
下面是一个使用 python 标准库中模块的例子。
import sys
print('命令行参数如下:')
for i in sys.argv:
print(i)
print('\n\nPython 路径为:', sys.path, '\n')
执行结果如下所示:
$ python using_sys.py 参数1 参数2
命令行参数如下:
using_sys.py
参数1
参数2
Python 路径为: ['/root', '/usr/lib/python3.10', '/usr/lib/python3.10/plat-x86_64-linux-gnu', '/usr/lib/python3.10/lib-dynload', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
解释如下:
想使用Python模块,只需在另一个源文件里执行import语句,语法如下:
import module1[, module2[,... moduleN]
当解释器遇到 import 语句,如果在当前的搜索路径中能搜索到模块,就会直接导入。
搜索路径是一个解释器会先进行搜索的所有目录的列表。如想要导入模块 showmeai,需要把命令放在脚本的顶端:
showmeai.py 文件代码
def print_welcome( par ):
print ("Welcome : ", par)
return
test.py 文件代码
# 导入模块
import showmeai
# 现在可以调用模块里包含的函数了
showmeai.print_welcome("ShowMeAI")
以上代码输出结果:
$ python3 test.py
Welcome : ShowMeAI
当我们使用import语句的时候,Python解释器会在搜索路径中寻找对应模块,搜索路径是由一系列目录名组成的,它是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量,做一个简单的实验,在交互式解释器中,输入以下代码:
>>> import sys
>>> sys.path
['', '/usr/lib/python3.10', '/usr/lib/python3.10/plat-x86_64-linux-gnu', '/usr/lib/python3.10/lib-dynload', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
>>>
sys.path 输出是一个路径列表,其中第一项是空串'',执行python解释器的当前目录。
我们创建一个代码如下的fibo.py文件,把它放在sys.path中的任何一个目录里面:
def fib(n): # 定义到 n 的斐波那契数列
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print()
def fib_new(n): # 返回到 n 的斐波那契数列
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b
return result
然后进入Python解释器,使用下面的命令导入这个模块:
>>> import fibo
就可以使用模块名称来访问函数:
>>>fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib_new(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'
对于经常使用的函数,可以把它赋给一个本地的名称:
>>> my_fib = fibo.fib
>>> my_fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:
from modname import name1[, name2[, ... nameN]]
例如,要导入模块 fibo 的 fib 函数,使用如下语句:
>>> from fibo import fib, fib_new
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
这个声明不会把整个fibo模块导入到当前的命名空间中,它只会将fibo里的fib函数引入进来。
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from modname import *
例如,要导入模块 fibo 的 所有 函数,使用如下语句:
>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377
Python本身带着一些标准的模块库,有些模块直接被构建在解析器里,能很高效的使用。
比如模块sys,它内置在每一个Python解析器中。变量 sys.ps1 和 sys.ps2 定义了主提示符和副提示符所对应的字符串:
>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('ShowMeAI!')
ShowMeAI!
C>
包是一种管理Python模块命名空间的形式,我们经常会以「包.模块」的形式来导入模块,例如一个模块的名称是C.D, 那么他表示一个包C中的子模块D。使用这种形式不用担心不同库之间的模块重名的情况。
假设你想设计一套统一处理视频文件和数据的模块(或者称之为一个"包")。
现存很多种不同的音频文件格式(基本上都是通过后缀名区分的,例如: .mp4,.wmv,.avi,.mkv),所以你需要有一组不断增加的模块,用来在不同的格式之间转换。
并且针对这些视频数据,还有很多不同的操作,所以你还需要一组庞大的模块来处理这些操作。
这里给出了一种可能的包结构(在分层的文件系统中):
video/ 顶层包
__init__.py 初始化 video 包
formats/ 文件格式转换子包
__init__.py
mp4read.py
mp4write.py
aviread.py
aviwrite.py
mkvread.py
mkvwrite.py
wmvread.py
wmvwrite.py
...
audio/ 声音效果子包
__init__.py
io.py
fx.py
tools.py
...
editor/ filters 子包
__init__.py
period.py
faster.py
slower.py
...
在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。
目录只有包含一个叫做__init__.py 的文件才会被认作是一个包。最简单的处理是放一个空的__init__.py文件。
用户可以每次只导入一个包里面的特定模块,比如:
import video.audio.io
这将会导入子模块:video.audio.io。 他必须使用全名去访问:
video.audio.io.readfile(input)
还有一种导入子模块的方法是:
from video.audio import io
这同样会导入子模块: io,并且他不需要那些冗长的前缀,所以他可以这样使用:
io.readfile(input)
还有一种变化就是直接导入一个函数或者变量:
from video.audio.io import readfile
同样的,这种方法会导入子模块: io,并且可以直接使用他的 readfile() 函数:
readfile(input)
当使用 from package import item 这种形式的时候,对应的 item 既可以是包里面的子模块(子包),或者包里面定义的其他名称,比如函数,类或者变量。
import 语法会首先把 item 当作一个包定义的名称,如果没找到,再试图按照一个模块去导入。如果还没找到,抛出一个 exc:ImportError 异常。
如果我们使用形如 import item.subitem.subsubitem 这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。
请点击到B站查看【双语字幕】版本
本教程系列的代码可以在ShowMeAI对应的github中下载,可本地python环境运行,能访问国外网站的宝宝也可以直接借助google colab一键运行与交互操作学习哦!
本教程系列涉及的Python速查表可以在以下地址下载获取:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。