• 模块


    概要:

    什么是模块
      就是一组功能的集合
      本质上模块就是一个py文件
    
    模块作用
      从文件级别管理组织代码
      目的:提供程序的维护性
    
    模块的分类
      1.自定义的 第三方
      2.内置的
      3.编译为dll 的c 或c++
      4.包
    
    import 模块名称
            导入一个模块发生的三件事情
           1.创建了一个名称空间
           2.执行模块中的代码 将名称和地址的对应关系 存储到名称空间中
           3.在执行文件中产生一个新的名称 指向被导入的模块的名称空间
    导入的语法
      import 模块名称
      import 模块名称 as 别名
      import 模块1,模块2...
      from 模块名 import 模块中包含的名称
      from 模块名 import as 别名
      from 模块名 import 名称1,名称2
      from 模块名 import *
       在模块中可以使用__all__来控制 调用者可以使用哪些名称
    
    import 和from导入时的区别
      import导入时,执行文件中产生的是模块的名称空间
      from导入时,执行文件中会复制被导入模块中的所有名称,使用的时候不需要加前缀就像使用自己的名称一样
    
    两种执行方式
      1.直接作为执行文件运行
      2.作为模块被导入时运行
          两种执行方式都会执行py种所有代码 不同的是 __name__变量
          作为执行文件 __name__ 的值是 __main__
          作为模块导入时 值是模块的名称
    
    模块的搜索路径
        内存已经加载的 -> 内置 -> sys.path
        sys.modules 查看内存中已加载的
        其中只有sys.path 我们可以操作
        通常我们会将模块的路径手动添加到sys.path中

    1.模块是什么

      模块是一组功能的集合

      python中的一个函数就是一个功能,一个py文件就是一个模块

      例如:A.py ,文件名是A.py     模块名是A

    2.模块的分类

      1.自定义模块

        第三方模块也属于自定义,它是别的程序员写的

      2.内置模块

        C语言写的,然后连接到python解释器中

      3.已经编译为DLL,c或c++

        会用即可

      4.包

        包是包含一堆模块的文件夹

    3.如何定义模块

      创建一个py文件,将你的功能写在文件中

    4.如何使用模块

      import 关键字,用于导入模块到当前文件中

      例如:import time

    5.当执行import 做了什么

      1.创建一个模块的名称空间

      2.执行被导入的py中的代码,将里面的名字和地址对应关系存储到命名空间中

      3.在执行文件中,创建一个名字,该名字指向的地址就是第1步创建的名称空间(模块的名称空间)

      执行文件和被导入的模块的名称空间是相互独立的。

       在被导入模块中,所有的名字使用的都是自己空间中的,和调用者无关

    验证代码:

    #涉及名称空间
    #
    模块myModule代码 myage = 17 def func2(): global myage myage = 19 print(myage) #执行文件代码 import myModule      #执行myModule文件,申请名称空间,此时myage=17
    myage = 18
    print(myModule.myage) #17
    print(myage)       #18 myModule.func2()    #19,执行函数,声明全局,myage变为19,名称空间中的myage对应的值变为19 print(myModule.myage) #19
    # from 导入
    from myModule import myage    #会在执行文件的名称空间赋值一份myage的地址
    myage = 100    #重新赋值
    print(myage)        #100
    #* 导入全部
    from myModule import  *    #会将模块文件的名称空间中名称的内存地址复制一份放在执行文件的名称空间中。
    print(myage)    #引用myage不需要通过myModule,因为myage的内存地址已经放在了执行文件的名称空间中

    6.py文件的两种执行方式:

      1.作为执行文件(右键run)

      2.作为模块导入的时候

    7.import的其他写法

        1.import xxx  as xxx
      给模块取别名 用于简化书写
    2.import xxx,xxxx
      一次导入多个模块
    3.from xxx import xxx
         优点:调用时,不用加前缀
    从模块中导入某个名字到当前名称空间
    注意 要避免名称冲突
    如果冲突了 按照就近查找原则
    4.from xxx import xxx,xxx,xx
    从模块中导入多个名称
    5.from xxx import *
    从模块中导入所有名称
    6 from xxx import xx as xx
    取别名
    from 和 import 除了导入的名称 不同 其他特性一致
    当你使用from xx import 导入时,是将被导入的名字和地址的对应关系,复制了一份放在自己的名称空间里了

    8.__name__的用法

      __name__放在模块文件中,可以获取当前模块文件的执行状态:

         如果是__main__说明当前是执行文件,否则说明是作为模块。

    #放在模块文件中
    if
    __name__ == "__main__": print("作为执行文件") else: print("作为模块导入了")

    9.重复导入模块时,模块的代码不会重复执行,仅在第一次导入时执行

    代码验证:

    #验证 重复导入模块时 模块中的代码仅执行一次
    import 一个模块
    import 一个模块
    import 一个模块
    import 一个模块
    from 一个模块 import *
    #导入模块了

    10.模块的搜索顺序

      查找模块顺序:内存中已经加载的-->内置模块-->sys.path(sys.path是列表,第一个值是当前执行文件所在的文件夹。

    多级目录查找模块的两种方式: 

      1.将自己模块的路径加入到sys.path中

      2.从执行文件所在的文件夹下开始逐级查找,如:from car1.car2 import m1  (执行文件和car1是同级目录)

    # 查看内存中已经加载的模块
    import sys
    print(sys.modules)
    for i in sys.modules:
        print(i)
    #builtins
      sys
      _frozen_importlib
      _imp
      _warnings
      _thread
      _weakre.........
    # 查看sys.path (环境变量)
    import sys
    print(sys.path)
    # 手动添加一个路径到环境变量中
    sys.path.append(r"G:PythonHomework17dirs")#time2在该文件夹下,添加环境变量之后可以导入
    import time2
    print(sys.path)
    # [.......'D:\PyCharm 2018.2.4\helpers\pycharm_matplotlib_backend']
    # [....... 'D:\PyCharm 2018.2.4\helpers\pycharm_matplotlib_backend', 'G:\PythonHomework\17\dirs']
    # 验证内存和内置
    import m1 #导入时运行m1文件,载入内存
    import time
    
    time.sleep(10)
    # 删除m1文件
    import m1 #m1直接从内存中加载,不会报错。
    #如果在m1删除后重新run(),会报错
    #验证内置和 sys.path
    import time
    import sys
    print(type(sys.modules))#<class 'dict'>
    print("time" in sys.modules)#False
    print(sys.modules["time"])#<module 'time' (built-in)>,如果有time模块,默认引入内置的time
    #模块
    age = 20
    def func():
        global age
        age = 100
    print("导入模块了")
    
    #执行文件
    from 一个模块 import * #导入模块了
    func()    #覆盖age
    from 一个模块 import *
    print(age)    #100
    #导入模块了(说明模块在导入时执行,且只执行一次)
    #100(经过func()执行,age变为了100,)
  • 相关阅读:
    PKUSC2022 游记
    「ZJOI2022」树
    「ZJOI2022」面条
    NOI2016~2021 Solution Set
    达梦数据库DM8企业版安装教程及问题解析
    Spring Boot 内置工具类 Binge
    ubuntu配置安装MySQL数据库
    Xshell连接腾讯云服务器
    Phoenix整合HBase安装部署、HBase整合Phoenix安装部署
    spring cloud gateway中解决第一次请求失败的问题
  • 原文地址:https://www.cnblogs.com/xuechengeng/p/9774676.html
Copyright © 2020-2023  润新知