zoukankan      html  css  js  c++  java
  • 模块的概念、模块的导入方式【IMPORT 模块名、FROM 模块 IMOPRT 功能】、模块的搜索路径、链式导入&循环导入

    今日内容

    1. 模块:模块的概念

    2.导入的方式:import  from import

    3. 环境变量:sys.path 

    4. 导入模块的顺序

    5. 循环导入:模块间互相导入

    模块

    常见的四种模块: module

    1. 使用python所编写的 .py文件。

    2. 把一系列模块组织到一起的文件夹(文件夹下有一个__init__.py文件,该文件夹就被称之为包)

    3. 使用C编写并直接链接到python解释器的内置模块

    4. 已被编译为共享库或DLL的或C++扩展

    # 1. 什么是模块:一系列功能的集合体

    # 2. 为什么会出现模块: 很多相似的功能,要统一管理,将这些功能放在一个文件中,该文件就是管理这些功能的集合体,我们命名为模块

    # 3. 怎么使用模块: 在要使用模块功能的文件中导入模块:import 模块名 (模块名: 用来管理一系列功能的文件名)

    # 4. 在那使用模块: 在所有要使用模块中功能的文件中导入并使用模块

    导入模板完成的三件事

    首次导入:

    import 模块名

    # 1. 将,被导入的模块编译形成对应的pyc文件

    # 2. 进入模块,从上至下执行模块中的代码,将产生的所有名字存放在该模块文件的全局名称空间中

    # 3. 在使用模块的文件中,产生一个与模块名(模块文件名)同名的名字,指向模块的全局名称空间

    再次导入:

    # 不再执行导入模块的前两步,会直接走第三步:在当前模块中产生一个名字,指向第一次导入在内存中产生的全局名称空间

    起别名

    import 模块名 as 别名

    # 重点:导入一旦起别名,原模块名变量失效,本质只产生了别名变量指向模块文件的全局名称空间

    模块的分类

    # 环境变量:存放路径的list ,第一默认一定是当前执行文件所在的路径

    import sys

    # sys .path 就是环境变量

    # 如果清空环境变量:所有导入就都将不能使用

    sys. path. clear()

    # 添加指定路径到环境变量

    sys . path . append()  # 添加  

    sys . path . insert()     # 插入

    导入模块的顺序

    内存 > 内置 > sys.path (安装环境变量中路径的先后顺序逐一加载)

    from...import 语句导入

    # 导入完成的三件事

    # 1. 将被导入的模块编译形成对应的pyc文件

    # 2. 进入模块,从上至下执行模块中的代码,将产生的所有名字存放在该模块文件的全局名称空间中

    # 3. 在导入模块的文件中形成(一个或者多个)名字指向模块全局名称空间中的(一个或者多个)具体名字

    from 模块名 import 模块中的名字1,。。。模块中名字n

    from 模块名 import 名字 as 别名

    ## form ... import 导入依赖环境变量,sys. path

    from...import*  语法

    # 模块中默认会添加__all__, 而__all__的功能,就是管理模块中能被*导入的变量们

    # __all__可以自定义,自定义* 能导入的变量,__all__的list 中名字全部可以自定义

    # 系统默认添加的__all__中不会纳入 以_开头的名字,

                    ---所以默认在外界通过from...import *无法导入_开头的名字

                    ---_开头的名字对from...import * 是隐藏的,然而指名道姓依然可以被外界导入使用

    链式导入

    如果定义三个模块:m1,m2,m3, 然后m1模块中导入m2,  m2 模块中导入m3, 然后再创建一个ti文件,在t1 中调用m1,那么他的执行流程会变为:

    在t1文件中执行m1,在执行m1的过程中会遇到导入的m2,会马上进入m2去执行m2,在m2中又会碰到导入的m3,会马上去执行m3,m3执行完毕后会返回m2中导入m3的语句,接着执行m2,m2执行完毕回到m1,依次类推,最后返回t1

    # 然而在整个执行流程中,遇到任何模块的二次导入,都是直接引用内存中的名称空间,不会再次进入模块

    循环导入

    # 循环导入的问题点:名字没有产生就使用名字

    # 解决循环导入:先产生名字,在导入模块

              -----将会产生循环导入的模块,导入语法延后,-延后导入

    # 问题

    # m1,py

    import m2

    print(m2,y)

    x = 666

    # m2.py

    import m1

    print(m2,x)

    y = 888

    此处的print就会报错,因为在全局变量没有产生就开始打印。

    # 解决办法

    # m1,py

    x = 666

    import m2

    print(m2,y)

    # m2,py

    y = 888

    import m1

    print(m2,x)

    此处是把全局变量提到调用模块的前面,所以此处的print能找到对应变量。

  • 相关阅读:
    模块化 —— CommonJS、AMD、UMD、ESM(下)
    模块化 —— CommonJS、AMD、UMD、ESM(上)
    移动端事件(四)—— 函数防抖和函数节流
    移动端事件(三)—— 横竖屏与加速度、移动的方块
    一起来学JavaScript吧(JS兔子领进门)
    【资源】一些常用的前端资源网站(不定期更新)
    redis
    django-高并发解决方案--负载均衡
    输入某年某月某日,判断这一天是这一年的第几天
    一篇英文文档中找出频数最多的10个单词
  • 原文地址:https://www.cnblogs.com/liguodeboke/p/10815646.html
Copyright © 2011-2022 走看看