python基础:第四章:模块

模块

什么是模块

  • 在前面我们经常脚是用 python 解释器来编程(理解:>>>的形式,最原始的形式,从cmd处打开),如果你从 Python 解释器退出再进入,那么你定义的所有的方法和变量就都消失了。

    为此 Python 提供了一个办法,把这些定义存放在文件中,为一些脚本或者交互式的解释器实例使用,这个文件被称为模块。

  • 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。

  • 模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。

  • 下面是一个使用 python 标准库中模块的例子。

import sys

print('命令行参数如下:')
for i in sys.argv:
   print(i)
 
print('\n\nPython 路径为:', sys.path, '\n')
  1. import sys 引入 python 标准库中的 sys.py 模块;这是引入某一模块的方法。
  2. sys.argv 是一个包含命令行参数的列表。
  3. sys.path 包含了一个 Python 解释器自动查找所需模块的路径的列表。
  • import 和 from … import 和 from … import * 三者的区别【举例:假设三者都 import fibo】

    功能举例
    import …导入整个模块。调用函数时需用【模块名.函数名】fibo.fibo2(9)
    from … import只会导入某个模块中的某些函数等。调用时可直接【函数名】fibo2(9)
    from … import *导入某个模块中的所有函数等。调用时可直接【函数名】fibo2(9)

import

  • 一个模块只会被导入一次,不管你执行了多少次import。
    在这里插入图片描述

  • 当我们使用import语句的时候,Python解释器是怎样找到对应的文件的?
    在这里插入图片描述

  • 现在,在解释器的当前目录或者 sys.path 中的一个目录里面来创建一个fibo.py的文件,代码如下:
    在这里插入图片描述

from … import

在这里插入图片描述

from … import *

在这里插入图片描述

深入模块

在这里插入图片描述

__name__属性

  • 问题:

    我们现在知道,程序的运行可能需要调动多个模块,也就是多个 .py 文件。

    假设我们运行 A.py ,其中 A.py 需调用 B.py 那么当 B模块A模块 第一次引入时,B.py 的主程序将运行。

    如果我们不想让 B.py 里的所有代码都执行,即:B模块,作为被调用方时,有选择地执行代码。该如何呢?

    我们可以利用 模块的 __name__属性 来解决这一问题。

  • 解决方案:

    每个模块 都有一个__name__属性 ,当其值是 _main_ 时,表明该模块自身在运行,否则是被引入。

    说明:_name__main_ 底下是双下划线, _ _ 是这样去掉中间的那个空格。

在这里插入图片描述

dir( ) 函数

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
在这里插入图片描述
如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称:
在这里插入图片描述

标准模块

在这里插入图片描述

  • 包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。

    比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。

    就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。

  • 举例

    这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。

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

    现存很多种不同的音频文件格式(基本上都是通过后缀名区分的,例如: .wav,:file:.aiff,:file:.au,),所以你需要有一组不断增加的模块,用来在不同的格式之间转换。

    并且针对这些音频数据,还有很多不同的操作(比如混音,添加回声,增加均衡器功能,创建人造立体声效果),所以你还需要一组怎么也写不完的模块来处理这些操作。

  • 这里给出了一种可能的包结构(在分层的文件系统中):

在这里插入图片描述
在这里插入图片描述

从一个包中导入*

  • 设想一下,如果我们使用 from sound.effects import *会发生什么?

    Python 会进入文件系统,找到这个包里面所有的子模块,一个一个的把它们都导入进来。

    但是很不幸,这个方法在 Windows平台上工作的就不是非常好,因为Windows是一个大小写不区分的系统。

    在这类平台上,没有人敢担保一个叫做 ECHO.py 的文件导入为模块 echo 还是 Echo 甚至 ECHO。

    (例如,Windows 95就很讨厌的把每一个文件的首字母大写显示)而且 DOS 的 8+3 命名规则对长模块名称的处理会把问题搞得更纠结。

  • 为了解决这个问题,只能烦劳包作者提供一个精确的包的索引了。

    导入语句遵循如下规则:如果包定义文件 init.py 存在一个叫做 all 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入。

  • 作为包的作者,可别忘了在更新包之后保证 all 也更新了啊。你说我就不这么做,我就不使用导入*这种用法,好吧,没问题,谁让你是老板呢。

  • 这里有一个例子,在:file:sounds/effects/init.py中包含如下代码:
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值