模块

一、模块介绍 

'''
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、注意:
    但凡在导入时带点的,点的左边必须是一个包

'''
原文地址:https://www.cnblogs.com/lichunke/p/9412337.html