Python程序设计第5章-模块和包课件

上传人:des****85 文档编号:302891468 上传时间:2022-06-02 格式:PPT 页数:54 大小:2.23MB
返回 下载 相关 举报
Python程序设计第5章-模块和包课件_第1页
第1页 / 共54页
Python程序设计第5章-模块和包课件_第2页
第2页 / 共54页
Python程序设计第5章-模块和包课件_第3页
第3页 / 共54页
Python程序设计第5章-模块和包课件_第4页
第4页 / 共54页
Python程序设计第5章-模块和包课件_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《Python程序设计第5章-模块和包课件》由会员分享,可在线阅读,更多相关《Python程序设计第5章-模块和包课件(54页珍藏版)》请在金锄头文库上搜索。

1、2022/6/1第第5章章 模块和包模块和包主 讲 人:目录目录2022/6/121.为什么使用模块2.模块的创建与使用3.包导入实例2022/6/1概述概述本章要解决的问题如下:什么是模块为什么使用模块如何使用模块包以及实例2022/6/11.为什么使用模块1.1 为什么使用模块 首先,提高了代码的可维护 其次,提高了代码的可重用性 最后,避免了函数名和变量名冲突2022/6/11.为什么使用模块1.2 模块角色从抽象的视角来看,模块至少有三个角色 代码的重用 系统命名空间的划分 服务和数据的共享目录目录2022/6/121.为什么使用模块2.模块的创建与使用3.包导入实例2022/6/12

2、.模块的创建与使用2.1Python程序架构1Python程序架构实例图2022/6/12.模块的创建与使用假设上图中的文件b.py定义了一个名为spam的函数,如下所示:def spam(text): print(text,spam)现在,假设a .py想要使用spam,为了实现这个目标,a.py中包含如下Python语句:import bb.spam(gumby)2022/6/12.模块的创建与使用2.1Python程序架构2模块程序和模块:Python中,程序是作为一个主体的、顶层的文件来构造的,配合零个或多个支持文件,这些支持文件都可以称作模块。顶层文件:包含了程序的主要的控制流程,即

3、需要运行来启动应用的文件。2022/6/12.模块的创建与使用2.1Python程序架构2模块模块文件:可看作是工具的仓库,这些仓库是用来收集顶层文件(或其他可能的地方)使用的组件。顶层文件与模块文件:顶层文件使用了在模块文件中定义的工具,这些模块文件也使用了其他模块所定义的工具。2022/6/12.模块的创建与使用2.1Python程序架构模块的执行环境:模块包含变量、函数、类以及其他的模块(如果导入的话),而函数也有自己的本地变量。右图右图描述了模块内的情况以及与其他模块的交互。模块构成及工作原理图2022/6/12.模块的创建与使用2.1Python程序架构模块间的关系:模块可以被导入,

4、但模块也会导入和使用其他模块,这些模块可以用Python或其他语言写成。2022/6/12.模块的创建与使用2.1Python程序架构3模块导入定义:一个文件可通过加载一个模块(文件),从而读取这个模块(文件)的内容,即导入。(1)模块导入的三种方式import Xfrom X import *from X import a, b, c2022/6/12.模块的创建与使用2.1Python程序架构3模块导入(2)导入模块时,Python都做了哪些事情?2022/6/12.模块的创建与使用2.1Python程序架构3模块导入(3)导入模块时的路径搜索顺序。 程序的主目录:即程序(顶层)文件所在的

5、目录,而非启动程序所在的目录(当前工作目录。 环境变量(PYTHONPATH)目录。 标准链接库目录。 任何.pth文件的内容(如果存在的话),在安装目录下找到该文件,以行的形式加入所需要的目录即可。2022/6/12.模块的创建与使用2.2模块搜索路径1模块搜索路径2022/6/12.模块的创建与使用2.2模块搜索路径1模块搜索路径sys.path的初始值来自于以下地方。包含脚本的当前路径。PYTHONPATH。默认安装路径。编译过的Python文件(.pyc文件)。built-in模块。2022/6/12.模块的创建与使用2.2模块搜索路径2配置搜索路径方法一:添加环境变量PYTHONPA

6、TH。python会添加此路径下的模块,在.bashrc文件(这个文件主要保存一些个性化设置,如命令别名,路径等)中添加如下类似行。export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.0/site-packages2022/6/12.模块的创建与使用2.2模块搜索路径方法二:在包内添加。在site-packages添加一个路径文件,如mypkpath.pth,必须以.pth为后缀,写上你要加入的模块文件所在的目录名称。 windows c:python3.0site-packages linux(ubuntu) /usr/local/lib

7、/python3.0/dist-packages linux(redhat) /usr/lib/python3.0/site-packages2022/6/12.模块的创建与使用2.2模块搜索路径方法三:函数添加。sys.path.append()函数添加搜索路径,参数值即为要添加的路径。 import sys 查看sys.path 添加sys.path.append(c:)2022/6/12.模块的创建与使用2.3模块导入语句1import语句import导入为绝对导入。import 只能导入模块,不能导入模块中的对象(类、函数、变量等)2022/6/12.模块的创建与使用2.3模块导入语句

8、2嵌套import(1)顺序嵌套例如:本模块导入 A 模块(import A),A 中又 import B,B 模块还可以 import 其他模块。2022/6/12.模块的创建与使用2.3模块导入语句2嵌套import(2)循环嵌套,程序如下:#A.py from B import Dclass C:pass文件 B.py from A import Cclass D:pass为什么执行A的时候不能加载D呢?2022/6/12.模块的创建与使用2.3模块导入语句如果将 A.py 改为:import B就可以了。这是怎么回事呢?这跟Python内部 import 的机制是有关的,具体到 fro

9、m B import D,Python 内部会分成以下几个步骤(具体如右图所示)。2022/6/12.模块的创建与使用2.3模块导入语句这个例子的执行顺序如下(具体如右图所示)。2022/6/12.模块的创建与使用2.3模块导入语句3from语句 因为from会把变量名复制到另外一个作用域,所以它就可以直接在脚本中使用复制后的变量名,而不需要通过模块(例如printer)。 from module1 import printer #复制一个变量 printer(Hello world!) 2022/6/12.模块的创建与使用2.3模块导入语句4from *语句 当使用from *时,会取得模块

10、顶层所有赋了值的变量名。在脚本中就可以直接使用得到的变量名printer,而不需要通过模块名。 from module1 import * #复制所有变量 print(Hello world!) Hello world! 2022/6/12.模块的创建与使用2.3模块导入语句5导入只发生一次 模块会在第一次import或from时载入并执行,并且只在第一次如此。2022/6/12.模块的创建与使用2.3模块导入语句6import和from是赋值语句(1)from将一个或多个变量名赋值给另一个模块中同名的对象,例子如下:x=1y=1,2%python from small import x,y

11、#复制两个变量 x=42 #修改x值 y0=42 #修改共享变量2022/6/12.模块的创建与使用2.3模块导入语句6import和from是赋值语句(2)文件变量名的改变2022/6/12.模块的创建与使用2.3模块导入语句6import和from是赋值语句(3)import和from的对等性像这样的from语句:from module import name1,name2 #复制两个变量与下面这些语句是等效的:import module #获取模块对象name1=module.name1 #赋值name2=module.name2 del module #删除模块名2022/6/12.模

12、块的创建与使用2.3模块导入语句7from语句潜在的陷阱from语句会让变量位置更隐秘和模糊,且从理论上讲,from语句有破坏命名空间的“潜质”。如果使用from导入变量,而那些变量碰巧和作用域中现有变量同名,变量就会被悄悄地覆盖掉。另一方面,和reload调用同时使用时,from语句有比较严重的问题,因为导入的变量名可能引用之前版本的对象。2022/6/12.模块的创建与使用2.4模块命名空间 模块最好理解为变量名的封装,也就是定义想让系统其余部分看见变量名的场所。简而言之,模块就是命名空间(变量名建立所在的场所),而存在于模块之内的变量名就是模块对象的属性。2022/6/12.模块的创建与

13、使用2.4模块命名空间1文件生成命名空间模块语句会在首次导入时执行顶层的赋值语句会创建模块属性模块的命名空间能通过属性_dict_或dir(M)获取2022/6/12.模块的创建与使用2.4模块命名空间LEGB(用来规定命名空间查找顺序的规则)含义解释如下。L-Local(function):函数内的名字空间。E-Enclosing function locals:外部嵌套函数的名字空间(例如closure)。G-Global(module):函数定义所在模块(文件)的名字空间。B-Builtin(Python):Python内置模块的名字空间。2022/6/12.模块的创建与使用2.4模块命

14、名空间假设往文本编辑器中建立如下的模块文件,并将其命名为module2.py。print(starting to load.)import sysname=42def func():pass #定义一个空函数,pass是占位符class klass:pass #定义一个空类,pass是占位符print(done loading.)执行结果 import module2starting to load.done loading.2022/6/12.模块的创建与使用2.4模块命名空间但是,一旦模块加载后,它的作用域就变成模块对象(由import取得)的属性的命名空间,然后可以结合其模块名,通过它来

15、获取命名空间内的属性。 module2.sys module2.name42 module2.func module2.klass2022/6/12.模块的创建与使用2.4模块命名空间2属性名的点号运算 点号运算其实就是表达式,传回和对象相配的属性名的值,LEGB规则只适用于无点号运算的纯变量名。其规则如下:简单变量点号运算通用性。2022/6/12.模块的创建与使用2.4模块命名空间3导入和作用域 无论程序中的导入结构或函数调用的结构是什么情况,变量的含义一定是由源代码中的赋值语句的位置决定的,而属性总是伴随着对对象的请求。换句话说,导入操作不会赋予被导入文件中的代码对上层代码的可见度。被导

16、入文件无法看见进行导入的文件内的变量名。2022/6/12.模块的创建与使用2.4模块命名空间4命名空间的嵌套 虽然模块导入不会使命名空间发生向上的嵌套,但会发生向下的嵌套。利用属性的点号运算路径,有可能深入到任意嵌套的模块中并读取其属性。2022/6/12.模块的创建与使用2.5reload 在python中,每一个以.py结尾的Python文件都是一个模块,其他的文件可以通过导入一个模块来读取该模块的内容。默认情况下,模块在第一次被导入之后,其他的导入都不再有效。那么想要使得Python在同一次会话中再次运行文件,就需要调用imp标准库模块中的reload函数。2022/6/12.模块的创建与使用2.5reloadreload与import和from的不同之处如下。reload是Python *的内置函数,而不是语句。传给reload的是已经存在的模块对象,而不是变量名。reload在Python 3.0中位于模块之中,并且必须导入自己。2022/6/12.模块的创建与使用2.5reload此外,import语句和reload调用的语法并不相同,reload需要小括号,但impor

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号