模块
一、模块介绍
''' 1、什么是模块 模块是一系列功能的集合体 模块分为三大类 自定义模块 内置模块:time os json sys等 第三方模块 模块的四种表现形式 使用Python编写的.py文件 已被编译为共享库或DLL的C或C++扩展 把一系列模块组织到一起的文件夹(注:文件有一个__init__.py文件,该文件称之为包) 使用C编写并链接到Python解释器的内置模块 2、为何要用模块 1、可以拿来内置的、第三方的模块,然后直接使用,极大的提高开发效率 2、将程序中共用的一些功能组织到一个文件中,然后程序各部分可以重用该文件中的功能 减少代码冗余,增强程序的组织结构性与可维护性 3、如何使用模块 一个py文件就是一个模块,文件名如果是spam.py,模块名则为spam 模块的使用必须要搞清楚谁是执行文件,谁是被导入的模块'''
二、使用模块
1、import的使用
''' 模块可以包含可执行的语句和函数的定义,这些语句的目的就是初始化模块,他们在模块名第一次遇到导入import语句时,才会执行 import语句可以在程序中的任意位置使用,且针对同一模块可以import多次,为了防止重复导入 Python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重复执行模块内的语句 ''' import sys import spam import spam import spam ''' 执行结果结果 from import spam # 只有在第一次import时才会执行被导入模块中的代码 ''' # sys.modules可以查看当前已经加载的模块 print(sys.modules) # 执行结果 {'builtins': <module 'builtins' (built-in)>, 'sys': <module 'sys' (built-in)>,......'spam': <module 'spam' from 'D:\\python_study_new\\day6\\spam.py'>
使用模块:
spam.name
第一次导入模块,做了三件事(重复导入会直接引用内存中已加载好的结果)
'''' 1)为被导入的模块文件(spam.py)创建新的名称空间 2)执行模块文件的代码,将产生的名字放到模块对应的名称空间中 3)在当前名称空间中拿到一个模块名,该模块名指向模块的名称空间 '''
''' import导入模块的方式,在引用模块名称空间中该名字时,必须要加上前缀:模块名.名字 优点:指明道姓的访问模块名称空间中的名字,肯定不会与当前名称空间中的名字冲突 缺点:每次引用模块名称空间的名字都需要加上前缀,在模块名过长时,前缀的显得非常臃肿 模块用逗号分隔一次性导入多个模块 import os,sys,json 推荐多行导入 import os import json '''
2、from…..import
'''
from spam import name,info
首次导入,from...import也会做三件事: 1)产生一个模块的名称空间 2)执行模块文件的代码,将产生的名字放到模块名称空间 3)会在当前名称空间直接拿到import后的名字 ''' # 可以直接使用,不用加前缀 print(name) info() ''' 优点:简洁,不用加前缀 缺点:容易与当前名称空间中的名字冲突 强调:来自于模块名称空间中的函数一定是以模块名称空间为准的(函数的作用域关系在定义的时候就已经固定死的,与调用位置无关) ''' from spam import * # 把spam中所有的不是以下划线开头的名字都导入到当前名称空间 # 大部分情况下我们的Python程序不应该使用这种导入方式,因为*你不知道导入了什么名字,很有可能会覆盖掉之前已经定义的名字,而且可读性极差,在交互环境下导入没有问题 ''' 可以使用__all__来控制*(用来发布新版本),在spam.py中新增一行 __all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字 '''
3、解决模块的循环导入问题
1)导入语句放在最后
2)导入语句放在函数中
三、模块的搜索路径
''' 模块的搜索路径优先级 内存———内置模块————sys.path 1)在第一次导入某个模块时,会先检查该模块是否已被加载到内存中,如果有则直接引用 2)如果没有,解释器会查找同名内置模块 3)如果还没有就到sys.path给出的目录列表里依次寻找被导入文件 ''' import sys print(sys.path) ['D:\\python_study_new\\day6', 'D:\\python_study_new', 'D:\\Python36\\python36.zip', 'D:\\Python36\\DLLs', 'D:\\Python36\\lib', 'D:\\Python36', 'D:\\Python36\\lib\\site-packages', 'D:\\PyCharm\\helpers\\pycharm_matplotlib_backend'] sys.path.append('') # 可以把指定路径加入到sys.path中
四、Python文件的两种用途区分
''' 一个Python文件可以有两种用途: 当做脚本执行:一个文件就是整个程序,用来被执行 当做模块调用:文件存放着一堆功能,用来被导入使用 python内置了全局变量__name__, 当文件被当做脚本执行时:__name__ == __main__ 当文件被当做模块导入时:__name__ == '模块名' 作用:用来控制.py文件在不同应用场景下执行不同的逻辑 if __name__ == __main__: '''
五、包
''' 1、什么是包 包本质就是一个包含有__init__.py文件的文件,夹文件夹是用来组织文件 强调,包以及包下所有的文件都是用来被导入使用,没有一个文件是用来被直接运行 因为包其实是模块的一种形式而已 2、import p1 2.1 创建p1的名称空间 2.2 执行p1下的__init__.py文件的代码,将执行过程中产生的名字都丢到名称空间中 2.3 在当前执行文件中拿到一个名字p1,p1指向__init__.py的名称空间 4、包内模块的:绝对导入与相对导入 绝对导入:每次导入都是以最顶级包为起始开始查找的 相对导入:相对于当前所在的文件,.代表当前所在的文件,..代表上一级,... 强调: 相对导入只能在被导入的模块中使用 在执行文件里不能用.或者..的导入方式 5、注意: 但凡在导入时带点的,点的左边必须是一个包 '''
转载请注明出处:http://www.cnblogs.com/lichunke/