zoukankan      html  css  js  c++  java
  • 模块导入

    代码格式的发展历程:

    面条版 ---> 函数版 ---> 文件版 ----> 文件夹版 -----> 微服务(多个小项目)

    模块

    1. 模块是什么

    模块(module):一般情况下,是一个以.py为后缀的文件。其他可作为module的文件类型还有”.pyo”、”.pyc”、”.pyd”、”.so”、”.dll”,但Python初学者几乎用不到

    2. 模块的作用:

    1. 模块可以放多个函数,然后把多个函数分成多个文件,隐藏隐藏代码细节
    2. 简化操作,不需要重复开发相同的功能,直接使用即可

    模块的4种形式:

    1. 自定义模板

    2. 第三方库,需要自己下载,如:requests

    3. 内置模块 直接使用。如time

    4. 文件夹版,在python中就叫做包

    导入模块的两种形式

    1. import time

    import time
    # import 模块导入时发生的三件事
    	# 1. 打开time文件
        # 2. 把time文件内容读入python解释器的内存,然后把time文件内容放入特定的模块,然后放入全局名称空间
        # 3. 使用功能时,直接去模块的名称空间内部寻找time的方法
        
        
    '''
    	总结:
    		1. 优点:time里面有的方法,全都有
    		2. 缺点:占用内存
    
    '''
    

    2. from...import...

    from timeinport slepp
    
    # 1. 打开time文件
    # 2. 
    
    '''
    	总结:
    		优点:
    		1. 直接使用sleep(0)就行了
    		缺点:
    		1. 如果当前项目中也存在sleep()方法,会发生冲突。
    
    '''
    

    3. from...import...其他的形式

    from time import *   # 把time模块中的所有函数引入,相当于import time
    
    
    from time import sleep,time	   # 从time模块中引用sleep,time模块
    
    
    from time inport *
    __all__ = [f1,lis]   # 限定当前导入哪些模块
    
    
    import time as t		# 导入time模块,并改名为t
    t.sleep(1)
    

    循环导入问题

    # m.py文件
    
    from n import x
    y = 10
    
    
    # n.py文件
    
    from m import y
    x = 20
    

    以上就会导致循环导入

    解决方法

    1. 在导入变量之前,让变量提前生成。

    # m文件
    y = 10
    print("from m")
    from n import x
    
    print("x的值为%d"%x)
    
    
    # 运行m文件的结果为:
    '''
    from m
    from n
    from m
    x的值为20
    y的值为10
    x的值为20
    
    '''
    
    
    # 总结:
    	步骤一:m文件运行到第3行时,打印“from m”
        步骤二:m文件运行到第4行时,m文件中导入模块n,即执行模块n中的代码。n文件中的第2行代码即找到了x变量,但仍然继续执行n文件,然后n文件的第3行打印“from n”
        步骤三:当n文件执行到第4行时,导入模块m,即执行模块m中的代码,m文件中的第2行代码即找到了y变量,但是也仍然继续执行m文件,然后执行m文件的第3行,打印“from m”
        步骤四:当m文件运行到第4行时,x变量已经导入了,此时就跳过第4行代码,然后执行m文件的第6行代码,即打印“x的值为20”
        步骤五:返回到步骤3,此时才算是把n文件中的m模块执行完,此时运行n文件第6行代码,即打印“y的值为10”
        步骤六:返回到步骤2,此时才算是把n模块中的代码执行完,于是继续运行m文件的第6行,即打印“x的值为20”。
    
    # n文件
    x = 20
    print("from n")
    from m import y
    
    print("y的值为%d"%y)
    

    此时方案存在另外一个问题。即我运行m文件,只想打印两行内容(from m和x的值),但是现在却打印了6行。那如何才能避免这样的情况。不用着急,python给我们提供了一个方法_name_

    # m文件
    y = 10
    
    from n import x
    
    if __name__ == "__main__"
    	print("from m")
    	print("x的值为%d"%x)
        
    
    # 运行m文件的结果为:
    '''
    from m
    x的值为20
    '''
    
    # n文件
    x = 20
    
    from m import y
    
    if __name__ == "__main__"
    	print("from n")
    	print("y的值为%d"%y)
    

    上述的现象的原理为:当程序在本文件中执行时,本文件中__name__变量的值为

    _main_,如果程序不是在本文件中执行,而是通过模块引入,那么name的名称则不为main。
    有句经典的概括了这段代码的意义:“Make a script both importable and executable”

    意思就是说让你写的脚本模块既可以导入到别的模块中用,另外该模块自己也可执行

    2. 将需要导入的模块封装到函数里面

    print('from m1.py')
    
    def func1():
        from m2 import x
        print(x)
    
    y = 'm1'
    
    # m2.py
    print('from m2.py')
    
    def func1():
        from m1 import y
        print(y)
    
    x = 'm2'
    

    模块的搜索路径:

    1. 去内存中找

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

    2. 去内置模块中找

    # time.py
    print('from time')
    
    # test.py
    import time  # 无任何打印
    

    执行test.py文件,无任何打印,所以他先去内置模块中找了

    3. 环境变量中找

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

    python文件的两种用途

    1. 模块文件,被当做模块给导入,有多个

    2. 运行文件,被当做执行文件执行,只能有一个

  • 相关阅读:
    auto-sklearn案例解析二
    auto-sklearn案例解析二
    auto-sklearn案例解析一
    auto-sklearn案例解析一
    auto-sklearn简介
    auto-sklearn简介
    auto-sklearn手册
    auto-sklearn手册
    观念
    JDBC总结
  • 原文地址:https://www.cnblogs.com/plf-Jack/p/10980501.html
Copyright © 2011-2022 走看看