Python入门(二十七):模块与包

点击跳转
《Python入门系列目录》



image

1. 模块

1.1 模块的概念

  • 如果程序中包含多个可以复用的函数或类,则通常把相关的函数和类分组包含在单独的模块(module)中
  • 这些提供计算功能的模块称之为模块(或函数模块)
  • 导入并使用这些模块的程序,称之为客户端程序

1.2 模块化编程

  • 把计算任务分离成不同模块的程序设计方法,称之为模块化编程(modular programming)
  • 模块化程序设计的优越性
    • 可以编写大规模的系统程序
    • 控制程序的复杂度
    • 实现代码重用
    • 增强可维护性

1.3 创建模块

  • 在模块中,除了可以定义变量、函数和类之外,还可以包含一般的语句,称之为主块(全局语句)

  • 当运行该模块,或导入该模块时,主块语句将依次执行

    # 创建模块my_math1.py,定义算术四则运算
    PI = 3.14  # 定义常量
    
    # 定义函数:加
    def add(x, y):
        return x + y
    
    # 定义函数:减
    def sub(x, y):
        return x - y
    
    # 定义函数:乘
    def mul(x, y):
        return x * y
    
    # 定义函数:除
    def div(x, y):
        return x / y
    

1.4 模块的私有函数

  • 实现模块时,有时候需要在模块中定义仅在模块中使用的辅助函数。辅助函数不提供给客户端直接调用,故称之为私有函数

  • 私有函数客户端不应该直接调用

  • Python语言没有强制不允许调用私有函数的机制,程序员应该避免直接调用私有函数

    # 创建模块normal1.py,实现正态分布的概率密度函数PDF
    import math
    
    
    def _phi(x):
        return math.exp(-x * x / 2.0) / math.sqrt(2 * math.pi)
    
    
    def pdf(x, mu=0.0, sigma=1.0):
        return _phi(float((x - mu) / sigma)) / sigma
    
    
    # 测试代码
    if __name__ == '__main__':  # 如果独立运行时,则执行测试代码
        for i in range(0, 101):
            print(i, pdf(i, mu=78, sigma=10))
    

1.5 模块的测试代码

  • 每个模块都有一个名称,通过特殊变量__name__可以获取模块的名称

  • 特别地,当一个模块被用户单独运行时,其_name__的值为’_main

  • 可以把模块源代码文件的测试代码写在相应的测试判断中,以保证只有单独运行时,才会运行测试代码

    # 创建模块my_math1.py,定义算术四则运算
    PI = 3.14  # 定义常量
    
    # 定义函数:加
    def add(x, y):
        return x + y
    
    # 定义函数:减
    def sub(x, y):
        return x - y
    
    # 定义函数:乘
    def mul(x, y):
        return x * y
    
    # 定义函数:除
    def div(x, y):
        return x / y
    
    def main():
        print('123 + 456 =', add(123, 456))
        print('123 - 456 =', sub(123, 456))
        print('123 * 456 =', mul(123, 456))
        print('123 / 456 =', div(123, 456))
    
    # 测试代码
    if __name__ == '__main__':
        main()
    

1.6 模块的导入和使用

  • 使用import语句可以导入模块
    • import 模块名
    • import 模块1, 模块2, …, 模块n
    • import 模块名 as 模块别名
  • 导入模块后,可以使用全限定名称访问模块中定义的成员
    • 模块名.函数名
    • 模块名.变量名
  • from … import … 语句
    • 使用from … import … 语句直接导入模块中的成员
      • from 模块名 import 成员名
      • 调用时:成员名
  • 如果希望同时导入一个模块中的多个成员,可以采用下列形式
    • from 模块名 import 成员名1, 成员名2, …, 成员名n
  • 如果希望同时导入一个模块中的所有成员,可以采用下列形式
    • from 模块名 import *
      • 调用时:成员名

1.7 模块的导入顺序

  • 导入模块时,解释器按下列目录搜索路径和文件搜索顺序查找并导入文件

    • 当前目录
      • 启动交互式Python的目录,或Python主程序位于的目录
    • 操作系统环境变量PYTHONPATH中指定的目录
  • Python标准库目录

  • 一旦确定了所在目录,不能再向上查找目录

    • 比如自己重写的math模块,如果导入后用标准库中的math模块,将报错

1.8 dir()内置函数

  • 模块中定义的成员,包括变量、函数和类,可以通过内置的函数dir()查询,也可以通过help()函数查询其帮助信息
    • dir()
      • 不带参数,列举当前模块的所有成员
    • dir(模块名)
      • 列举指定模块的所有成员
    • dir(类/对象)
      • 列举指定类的所有成员
      • 注意:Python所有的成员都是对象
      • 例如:dir(str)

1.9 名称空间

  • Python中,每一个名称(变量名、函数名或类型名)都有一个作用范围,这个作用范围称为名称空间,也称为命名空间

1.10 名称查找顺序

  • 当代码中使用名称x时,Python解释器把x解释为对象名(对象、函数、变量等),并按如下名称空间顺序查找以x命名的对象
    • 局部名称空间
      • 当前函数或类的方法中定义的局部变量
    • 全局名称空间
      • 当前的模块(.py文件)中定义的变量、函数或类
    • 内置名称空间
      • 对每个模块都是全局的。作为最后的尝试,Python将假设x是内置函数或变量

1.11 顶层模块

  • Python程序通常由多个模块组成,其中一个模块作为包含应用程序的启动代码,这个模块称为顶层模块

  • 其他模块叫库模块

  • 使用Python解释器进行交互式执行Python代码时,Python解释器是顶层模块,其中定义的名称是全局变量,属于全局名称空间

  • Python使用特殊变量__name__来标记一个模块是否是顶层模块

    • 如果模块是作为一个正在运行的顶层模块,则该变量名为字符串_main_
    • 如果模块被另一个模块(不管是顶层模块或其他模块)导入,则该变量名为模块的名称
  • 因此,在模块中编写仅当作为顶层模块运行时才被执行的代码时,可以使用下列语句

    if __name__ == '__main__':
    

2. 包

2.1 包的概念

  • 包是文件夹
  • 通常,只要文件夹中包含一个特殊的文件_init_.py,则Python解释器就将该文件夹作为包,其中的模块文件属于包中的模块
  • 特殊文件_init_.py可以为空,也可以包含属于包的代码,当导入包或该包中的模块时,执行该py文件
  • 包可以包含子包,没有层次限制
  • 使用包可以有效避免名称空间冲突

image

2.2 创建包

  • 在指定目录中创建对应包名的目录
  • 在该目录下创建一个特殊文件:_init_.py文件
  • 最后在该目录下创建模块文件

2.3 包的导入和使用

  • 至少精确到模块名,而不是包名

  • import [包名1.[包名2.[…]]].模块名

    • 调用时:[包名1.[包名2.[…]]].模块名.成员名
  • from [包名1.[包名2.[…]]].模块名 import 成员名

    • 调用时:成员名
  • from [包名1.[包名2.[…]]] import 模块名

    • 调用时:模块名.成员名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值