模块1

内容概要

  • 互相导入模块
  • 一个python文件有几种用途
  • 模块功能
  • 模块搜索路径的优先级

内容详细

  • 互相导入模块

    m1.py

    # print('正在导入m1')
    # x = 'm1'
    # from m2 import y
    # 三件事,造一个m2的名称空间
         #        开始运行m2
         #        产生y这个名字去指向m2中的y的内存地址
    
    # x = 'm1'
    
    # 方式二:
    import sys
    
    print('正在导入m1')
    def f1():
        from m2 import y
        print(y)
    x = 'm1'
    
    
    

    m2.py

    # 方式一:
    # print('正在导入m2')
    # y = 'm2'
    # from m1 import x
    #      # 三件事,造一个m1的名称空间
    #      #        开始运行m1
    #      #        产生x这个名字去指向m1中的x的内存地址
    # # y = 'm2' # 将这里的y='m2'往上提到from m1 import x之上才有用,不然再这个位置报错
    
    
    
    # 方式二:
    print('正在导入m2')
    def f2():
        from m1 import x
        print(x)
    y = 'm2'
    
    

    run.py

    import m1
    
    # 第二种方式
    m1.f1()
    # 运行结果:
    # 正在导入m1
    # 正在导入m2
    # m2
    
  • 一个python文件有几种用途

    # 一个python文件有两种用途
    # 1.被当作程序运行
    # 2.被当作模块导入
    
  • 模块功能

    '''
    一、模块的介绍
    模块就是一系列功能的集合体,分为三大类
        1.内置的模块
        2.第三方的模块
        3.自定义的模块
            一个python文件本身就是一个模块,文件名 m.py ,模块名 m
                ps:模块分为四种模式
                    1.使用python编写的.py文件
                    2.把一系列模块组织到一起的文件夹(注:文件夹下有一个_init_.py文件,该文件夹称之为包)
                    3.已编译为共享库或DLL的C或C++扩展
                    4.使用C编写并链接到python解释器的内置模块
    
    二、为何要用模块
        1.内置与第三方的模块拿来就用,无需定义,这种拿来主义,可以极大的提升自己的开发效率
        2.自定义的模块
            可以将程序的部分功能提取出来放到一个模块中为大家共享使用
            好处是介绍了代码冗余,程序组织结构更加清晰
    
    三、如何用模块
    '''
    '''
    foo.py文件的内容:
    x=1
    def get():
        print(x)
    def change():
        global x
        x=0
    '''
    
    
    # 一、如何用模块
    # import ...
    # 1.首次模块导入会做三件事:
    #   1、执行源文件代码
    #   2、产生一个新的名称空间用于存放源文件执行过程中产生的名字
    #   3、在当前执行文件所在的名称空间中得到一个名字foo,该名字指向新创建的模块名称空间,
    #    若要引用模块名称空间中的名字,需要加上该前缀
    
    # 需要强调一点是,第一次导入模块已经将其加载到内存空间了,之后的重复导入会直接引用内存中已存在的模块,
    # 不会重复执行文件,通过import sys,打印sys.modules的值可以看到内存中已经加载的模块名。
    # import sys
    # print(sys.modules)
    # # 'foo': <module 'foo' from 'D:\\Users\\ycc\\PycharmProjects\\pythonProject\\day 13\\foo.py'>}
    
    
    # 2.引用
    # 强调一:
    # 加上foo.作为前缀就相当于指名道姓地说明要引用foo名称空间中的名字,
    # 所以肯定不会与当前执行文件所在名称空间中的名字相冲突,并且若当前执行文件的名称空间中存在x,
    # 执行foo.get()或foo.change()
    
    # 强调二:无论是查看还是修改都是以原模块为基准的,与调用位置无关
    # 例:
    # x = 100
    # import foo
    # foo.x  # 这里虽然定义了变量x,但是foo.x 输出结果仍为 1
    # foo.get()
    # foo.change()
    
    # 二:导入模块的模式与规范
    # 模式
        # 1.可以improt语句导入多个模块(推荐使用)
        # import a
        # import b
        # ...
    
        # 2.在一行导入,用逗号分隔开不同的模块(不推荐)
        # import a,b,c,...
    # 规范(按以下顺序导入模块,虽然不按顺序也不会报错,但是算是自发的规定)
        # 1.内置模块
        # 2.第三方模块
        # 3.自定义模块
    
    # 其他导入语法
    # import foo as f  # 注:这里as f后不要加冒号
    # # 这里相当于把foo换个名字,因为可能会遇到名字特别长的模块名,为了调用时方便,可这样操作
    # f.x  # 等价与foo.x
    # f.get()
    # f.change()
    
    # 模块是第一类对象
    
    # 自定义模块的命名应该采用纯小写+下划线的风格(python3中)
    # python2中是驼峰体的风格
    
    # from 模块 import 模块内的功能
    
    from foo import x,get,change #将模块foo中的x和get导入到当前名称空间
    
    a=x #直接使用模块foo中的x赋值给a
    get() #直接执行foo中的get函数
    change() #即便是当前有重名的x,修改的仍然是源文件中的x
    '''
    无需加前缀的好处是使得我们的代码更加简洁,
    坏处则是容易与当前名称空间中的名字冲突,
    如果当前名称空间存在相同的名字,则后定义的名字会覆盖之前定义的名字。
    
    '''
    
    
    
    
    
    
  • 模块搜索路径的优先级

    # 无论是import还是from...import...在导入模块时都涉及到查找问题
    # 优先级:
    # 1.内存(内置空间)
    # 2.硬盘:按照sys.path中存放的文件的顺序依次查找要导入的模块
    
    import sys
    print(sys.path)
    # 值为一个列表,存放了一系列的文件夹
    # 其中第一个文件夹是当前执行文件所在的文件夹
    
    # import foo  # 内存中已经有foo了
    # foo.say()
    #
    # import time     # 在这10秒时间内,将foo.py删掉
    # time.sleep(10)
    #
    # import foo      # 10秒后,仍能调用,说明是从内存中找的
    # foo.say()
    
上一篇:在 M1 下搭建 DolphinScheduler 开发调试环境


下一篇:Spring Boot 2.6.0-M1 已发布