图解python | 模块

ShowMeAI研究中心

作者:韩信子@ShowMeAI
教程地址https://www.showmeai.tech/tutorials/56
本文地址https://www.showmeai.tech/article-detail/84
声明:版权所有,转载请联系平台与作者并注明出处


1.Python模块

在程序开发过程中,文件代码越来越长,维护越来越不容易。我们把很多不同的功能编写成函数,放到不同的文件里,方便管理和调用。在Python中,一个.py文件就称之为一个模块(Module)。

使用模块可以大大提高了代码的可维护性,而且当一个模块编写完毕,就可以被其他地方引用。我们在使用python完成很多复杂工作时,也经常引用其他第3方模块,受益于强大的python社区,几乎我们完成任何一项任务,都可以有对应的方便快捷可引用的库和模块来协助。

Python模块(Module)

模块是一个包含所有你定义的函数和变量的文件,以.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'] 

解释如下:

  • import sys 引入 python 标准库中的 sys.py 模块;这是引入某一模块的方法。
  • sys.argv 是一个包含命令行参数的列表。
  • sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表。

2.import语句

想使用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

就可以使用模块名称来访问函数:

3.实例

>>>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

4.from … import 语句

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函数引入进来。

5.from … import * 语句

把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:

from modname import *

例如,要导入模块 fibo 的 所有 函数,使用如下语句:

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

6.标准模块

Python本身带着一些标准的模块库,有些模块直接被构建在解析器里,能很高效的使用。

比如模块sys,它内置在每一个Python解析器中。变量 sys.ps1 和 sys.ps2 定义了主提示符和副提示符所对应的字符串:

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('ShowMeAI!')
ShowMeAI!
C> 

7.包

包是一种管理Python模块命名空间的形式,我们经常会以「包.模块」的形式来导入模块,例如一个模块的名称是C.D, 那么他表示一个包C中的子模块D。使用这种形式不用担心不同库之间的模块重名的情况。

Python包(Package)

假设你想设计一套统一处理视频文件和数据的模块(或者称之为一个"包")。

现存很多种不同的音频文件格式(基本上都是通过后缀名区分的,例如: .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 这种导入形式,除了最后一项,都必须是包,而最后一项则可以是模块或者是包,但是不可以是类,函数或者变量的名字。

8.视频教程

也可以点击 这里 到B站查看有【中英字幕】的版本

【双语字幕+资料下载】Python 3全系列基础教程,全程代码演示&讲解!10小时视频42节,保证你能掌握Python!快来一起跟着视频敲代码~

https://www.bilibili.com/video/BV1yg411c7Nw?p=26&share_source=copy_web


资料与代码下载

本教程系列的代码可以在ShowMeAI对应的github中下载,可本地python环境运行,可以访问google的宝宝也可以直接借助google colab一键运行与交互操作学习哦!

本教程系列涉及的Python速查表可以在以下地址下载获取:

拓展参考资料

ShowMeAI图解Python编程系列推荐(要点速查版)

ShowMeAI系列教程精选推荐

posted @ 2022-02-23 15:24  ShowMeAI  阅读(220)  评论(0编辑  收藏  举报