• 模块基础小结


    模块基础小结

    一、为什么要有模块

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

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

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

    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__
    我把月亮戳到天上 天就是我的 我把脚踩入地里 地就是我的 我亲吻你 你就是我的
  • 相关阅读:
    二进制或者其他进制转为十进制
    十进制转为二进制或者其他进制
    0.1 + 0.2 !== 0.3
    [git]删除远程分支
    [git]一个本地仓库,多个远程仓库
    [git]用户名,邮箱
    npm install命令
    常用命令:查看端口
    std::lock_guard 与 std::unique_lock
    std::mutex
  • 原文地址:https://www.cnblogs.com/zhulipeng-1998/p/12863718.html
Copyright © 2020-2023  润新知