zoukankan      html  css  js  c++  java
  • 模块基础小结

    模块基础小结

    一、为什么要有模块

    面条版代码–》函数版代码–》文件版代码(模块)–》文件夹版(包)

    代码会变得更加简洁,清晰,模块化

    一个模块里会有多个函数,相当于一个大功能细分成多个小功能

    1. 自定义模块
    2. 第三方模块,如requests
    3. 内置模块,如time
    4. 包(文件夹)

    二、import 与 from…import…

    markdown_add_index.py
    
    import time
    
    1. 打开time文件
    2. 使用Python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间
    3. test.py中会有一个time变量指向time模块的名称空间,如果导入方式为` import time as t`, 则就是t变量指向time模块的名称空间
    
    from time import sleep
    
    1. 打开time文件
    2. 使用Python解释器运行time文件,然后把解释文件得到的名字放入time模块的名称空间
    3. test.py中会有一个sleep变量指向time模块名称空间中的sleep, 如果导入方式为`from time import sleep, localtime`, 则是由一个sleep变量和一个localtime变量指向time模块名称空间中的sleep和localtime
    

    三、循环导入问题

    # m1.py
    from m2 import y
    x = 10
    
    # m2.py
    from m1 import x
    y = 20
    

    为什么会有循环导入问题:

    1. m1文件需要导入m2文件的y
    2. m2文件需要导入m1文件的x
    3. 代码自上而下运行, m1需要m2的y, 然后会去m2的名称空间找到y, 但是找y前, 需要运行m2的代码, m2的代码第一句是去找m1的x, 然后又回去运行m1的代码, m1的第一行代码又是去寻找m2的y
    4. 就是说m1只能运行第一行, m2也只能运行第一行, 所以出现了循环导入问题

    3.1 解决方案一

    # m1.py
    x = 10
    from m2 import y
    
    
    # m2.py
    y = 20
    from m1 import x
    
    • 但是这样做, 对所有的变量都需要这样做, 才能解决问题, 所以治标不治本的

    3.2 解决方案二

    # m1.py
    
    
    def f1():
        from m2 import y
    
    
    x = 10
    
    f1()
    
    
    # m2.py
    def f2():
        from m1 import x
    
    
    y = 20
    
    f2()
    

    名字的执行顺序: 内置(python解释器启动的时候) -->全局(文件执行的时候) -->局部(函数调用的时候)

    四、模块的搜索路径

    去内存中找

    # test.py
    import m1  # 从m1.py文件中导入的,然后会生成m1模块的名称空间
    import time
    
    # 删除m1.py文件,m1模块的名称空间仍然存在
    
    time.sleep(10)
    
    import m1  # 不报错,一定不是从文件中获取了m1模块,而是从内存中获取的
    
    

    去内置模块中找

    # time.py
    print('from time')
    
    # test.py
    import time  # 无任何打印,所以他先去内置模块中找了
    
    

    环境变量中找

    import sys
    
    print(sys.path)
    # b/a/m1.py
    
    # b/test.py
    import m1  # 报错
    
    sys.path.append('b/a')
    import m1
    
    

    五、Python文件的两种用途

    模块文件, 被当做模块给导入, 有多个
    2.
    运行文件, 被当做执行文件执行, 只能有一个

    • 搜索路径以执行文件为基准
    
    
    # m1.py
    def f1():
        print('from f1')
    
    
    f1()
    
    # test.py
    import m1
    
    m1.f1()  # 运行两次
    
    • _ * name * _
    
    
    # m1.py
    def f1():
        print('from f1')
    
    
    if __name__ == '__main__':  # __name__在m1.py被当做模块导入时是模块名,作为执行文件时是'__main__'
        f1()
    
    markdown_add_index.py
    import m1
    
    m1.f1()  # 运行两次
    

    六、包

    • 模块太大了,合理的分配模块的函数
    # m1.py
    f1
    f2
    f3
    f4
    
    # m2.py
    f1
    f2
    
    # m3.py
    f3
    f4
    
    • 所以得用文件夹管理,文件夹命名为m1,导入m1就是导入m1中的__init__
    我把月亮戳到天上 天就是我的 我把脚踩入地里 地就是我的 我亲吻你 你就是我的
  • 相关阅读:
    archlinux .bash_history
    Ubuntu环境下挂载新硬盘
    软碟通 UltraISO U启替代品 Win32DiskImager 无设备 无盘符 无u盘 无优盘 解决方案 之diskpart
    delphi Integer overflow
    MSBuild Tools offline
    delphi synedit免费的拼写检查器dll
    git 自定义命令行
    lua编译
    gcc ar
    Windows Subsystem for Linux (WSL)挂载移动硬盘U盘 卸载 c d 盘
  • 原文地址:https://www.cnblogs.com/zhulipeng-1998/p/12863718.html
Copyright © 2011-2022 走看看