模块的简介、 import句式、 from...import...句式、 导入方法的补充 、如何判断文件类型 、循环导入 、模块的查找顺序

今日内容概要

  • 模块的简介
  • import句式
  • from...import...句式
  • 导入方法的补充
  • 如何判断文件类型
  • 循环导入
  • 模块的查找顺序

今日内容详细

模块的简介

1.什么是模块
	模块就是一系列功能的结合体
2.为什么要用模块
	拿来主义,极大地提高了开发效率
3.模块的分类
	1.内置模块:是python解释器自带的,直接拿来使用的
    2.第三方模块:是别人写的,如果想用,先下载再用
    3.自定义模块:自己写的
4.模块的存在形式
	1.我们自己写的py文件(一个py文件就是一个模块)
	2.包:一系列py文件的集合(文件夹) ps:一个包里面会有一个__init__.py文件
	3.已被编译为共享库或DLL的c或C++扩展(了解)
	4.使用C编写并链接到python解释器的内置模块(了解)

ps:以后再写一个复杂项目的功能时候,要先考虑有没有被人已经写好的模块,我们直接拿来使用

导入模块的两种方式

前提简要:在真正编写项目的过程中,所有的py文件名都得是英文,并且py文件被当做模块导入的时候不需要考虑后缀;导入模块有两种方式:import句式、from ...import...句式

import句式

1.语法格式:import 模块名(py文件名)
2.知识补充:
	2.1 执行文件与导入文件
		执行文件:指的是点击鼠标右键运行的当前文件
		导入文件:是import后面的文件名就是导入文件
	2.2 同一个程序反复导入相同的模块,导入语句只会执行一次
   
3.运行步骤
	1.运行执行文件,产生了执行文件的全局名称空间
    2.运行导入文件(md.py)
    3.产生导入文件的全局名称空间,将导入文件中产生的名字保存到导入文件的全局名称空间
    4.在执行文件,产生一个模块名(py文件名)指向导入文件的全局名称空间

import句式解析

image

from...import...句式

1.语法格式:from 模块名(py文件名) import 导入文件中的具体名字
2.运行步骤
	1.运行执行文件,产生了执行文件的全局名称空间
    2.运行导入文件(md.py)
    3.产生导入文件的全局名称空间,将导入文件中产生的名字保存到导入文件的全局名称空间
    4.在执行文件中获取到指定的名字,指向导入文件的名称空间

from...import...句式解析

image

导入文件的扩展用法

1.起别名
 	1.1 import 文件名 as 新的名字;
 	1.2 from 文件名 import 被导入文件名称空间里的名字 as 新的名字
    1.3 使用别名的情况:
		情况1:多个模块文件名相同(一个项目由多个人写)
    	情况2:原有的模块名文件复杂
2.连续导入
	eg:
	import time,sys,os >>>建议多个模块功能相似才一起导入,不相似尽量分开导入
    推荐:
    import time
    import sys
    import sys
    
    from 被导入文件名 import 被导入文件名称空间里的名字1,名字2,名字3,名字4 
    上述导入方式是推荐使用的,因为多个名字出自于同一个模块文件中

3.通用导入
     from 文件名 import *  >>>不推荐使用,因为后续不能够推荐使用句点符点出来
	 ps:执行文件中用 from...import *导入模块,可以在导入文件中使用__all__,来限制执行文件可以用哪些名字
	 __all__ = ['名字1','名字2',....]限制当前文件中哪些名字可以被导入
    

判断文件的类型

1.判断当前文件是执行文件还是导入文件:使用__name__,因为它在不同的文件中,结果是不一样的
	在执行文件中,结果是__main__ >>>类型是字符串
    在导入文件中,结果是:模块名
    
2.
if __name__ == '__main__':   >>>通过键盘输入:main加回车
    pass

循环导入

1.循环导入就是两个文件彼此导入
2.循环导入的现象在实际工作中,坚决不能出现

循环导入举例

image

1.循环导入容易出错的原因:使用彼此的名字可能是在没有准备好的情况下就使用了
2.解决循环导入的方法:彼此在使用彼此名字之前就先准备好
ps:尽可能的避免循环导入,如果真的避免不了,就想办法让所有的名字在使用之前提前准备好

解决方法

image

模块的查找顺序

1.模块的查找顺序
	1.先从内存中查找  >>>代码运行后产生的内存空间
    2.再从内置模块中查找  >>>解释器自带的模块
    3.从环境变量中查找sys.path(程序系统环境变量)

验证:先从内存中查找

导入一个文件,然后再导入过程中删除文件,发现还可以使用

执行文件代码:
    import aa
    import time

    time.sleep(10)
    print(aa.name)
    
导入文件代码(aa.py)
	print('from aa')
    name = 'nana'
    
操作:1.先运行执行文件
	 2.在10秒内,手动删除导入文件(aa.py)
    
结果:from aa
	 nana
    
    
  

验证:再从内置模块中查找

创建一个跟内置模块名相同的文件名

执行文件代码:
    import time
    print(time.name)  # AttributeError: module 'time' has no attribute 'name'
    print(time.index())  # AttributeError: module 'time' has no attribute 'name'
    print(time.time())  # 1678180548.4664996
    from time import index  # ImportError: cannot import name 'index'
导入文件(time.py)代码:
    print('from time')
    name = 'nana'
    def index():
        print('111')

结果:报错 

******一定要注意以后的文件名命名坚决不能跟内置模块名重名

验证:最后从环境变量中查找sys.path

执行文件默认只能在同级别中导入文件,如果想导入不同级别的文件,则需要手动在sys.path中用append()方法添加绝对路径

1.导入模块的时候,一定要知道谁是执行文件,所有的路径都是参照执行文件来的
2.pycharm会自动将项目根目录添加到sys.path中
3.sys.path  打印出来的是一个列表
	import sys
	print(sys.path)  # ['D:\\4期学习\\pythonProject\\day18', 'D:\\4期学习\\pythonProject\\day18', 'D:\\PyCharm 2021\\plugins\\python\\helpers\\pycharm_display',...]
	ps:sys.path中第一个元素的路径永远是当前文件所在的路径
        
4.
	执行文件代码:
	import c3   # ModuleNotFoundError: No module named 'c3'
    
    导入文件代码:
    print(r'from aaaa\c3')
    
    结果:报错  ModuleNotFoundError: No module named 'c3'
    解决方式:
    import sys
    print(sys.path)  # D:\4期学习\pythonProject\day18\aaaa\c3.py,...]
    sys.path.append(r'D:\4期学习\pythonProject\day18\aaaa')
    print(sys.path)  # ['D:\\4期学习\\pythonProject\\day18', 'D:\\4期学习\\pythonProject\\day18', ...,'D:\\4期学习\\pythonProject\\day18\\aaaa']
    import c3   # from aaaa\c3
    
5.导入与执行文件不同层级的模块方法
    5.1 通用方式:sys.path.append(目标文件所在的路径)
    5.2 利用from...import句式
        from aaa.bbb.ccc import 模块名
        from aaa.bbb.ccc.模块名 import 模块名的名称空间的名字

posted @ 2023-03-07 18:19  DRAMA-娜娜  阅读(5)  评论(0)    收藏  举报