• 模块(import语句,from...import语句,_name_属性)


    1, 什么是模块?

      模块就是一系列功能的集合体

      模块分为四个通用的类别:

        1), 使用python编写的.py文件(*****)

        2), 已被编译为共享库或DLL的C或C++扩展

        3), 把一系列模块组织到一起的文件夹(注:文件夹下有一个_init_.py文件,该文件夹称之为包)(*****)

        4), 使用C编程并连接到python解释器的内置模块

      模块有三种来源:

        1), 内置模块

        2), 第三方模块

        3), 自定义模块

    2,如何使用模块?

      1), 使用内置的或者第三方的模块的好处是:  拿来主义,极大提升开发效率

      2), 使用自定义的模块好处是:  将程序各部分组件共用的功能提取取出放到一个模块里,其他组件通过导入的方式使用该模块,该模块即自定义的模块,好处就是减少代码冗余.

    3,首次导入模块会发生三件事

      1), 会产生一个模块的名称空间

      2), 执行spam.py文件的内容,将产生的名字丢到模块的名称空间里

      3), 在当前执行文件中拿到名字read1,该名字指向模块的名称空间中的read1

      

      模块的查找顺序: 内存中已经加载的模块 ==> 内置模块 ==> sys.path路径中包含的模块 

    import语句:

      想要使用python源文件,只需要在另一个源文件中执行import语句

      当解释器遇到import语句时,如果模块在当前的搜索路径中就会被导入

      搜索路径是一个解释器,会先进行搜索的所有目录的列表,如果要倒用模块,需要将命令放在脚本的顶端

    def print_func (par):
        print('hello :',par)
        return
    support.py文件代码
    #test.py引入support模块
    
    import support 
    
    support.print_func('你好')
    
    
    #实例输出结果
    hello : 你好
    test.py文件代码

      一个模块只会被导入一次,不管你执行了多少次import.这样可以防止导入模块被一遍又一遍地执行.

      (python的搜索路径: 搜索路径是由一系列目录名组成的)

      当我们使用import语句的时候,python解释器就一次从这些目录中去寻找所引入的模块,看起来很像是环境变量,事实上,也可以通过定义环境变量的方式来确定搜索路径.

      搜索路径是在python编译或安装的时候确定的,安装新的库应该也会修改.搜索路径被存储在sys模块中的path变量

    >>> import sys
    >>> sys.path
    ['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
    >>> 

      sys.path 输出是一个列表,其中第一项是空串,代表当前目录(若是从一个脚本中打印出来的话,可以更清楚地看出是哪个目录),即是我们执行python解释器的目录(对于脚本的话就是运行的脚本所在的目录)

    # 斐波那契(fibonacci) 数列模块
    
    def fib(n):     #定义到n的斐波那契数列
        a, b = 0,1
        while b < n:
            print(b, end=' ')
            a, b = b, a+b
        print()
    
    def fib2(n):    #返回到n的斐波那契数列
        result = []
        a, b = 0, 1
        while b < n:
            result.append(b)
            a, b = b, a+b
        return result
    斐波那契数列

      进入python解释器,使用import fibo命令导入该模块,

      这样做并没有把直接定义在fibo中的函数名称写入到当前符号表里,只是把模块fibo的名字写到了那里

      可以使用模块名称来访问函数

    >>>fibo.fib(1000)
    1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
    >>> fibo.fib2(100)
    [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
    >>> fibo.__name__
    'fibo'

       如果经常使用一个函数,可以赋给一个本地的名称:

    >>> fib = fibo.fib
    >>> fib(500)
    1 1 2 3 5 8 13 21 34 55 89 144 233 377

     

    from ... import语句

      python的from语句从模块中导入一个指定的部分到当前命名空间中,

    >>> from fibo import fib, fib2
    >>> fib(500)
    1 1 2 3 5 8 13 21 34 55 89 144 233 377

      这种声明不会把整个fibo模块导入到当前的命名空间中,它只会讲fibo里的fib函数引入进来

    from ... import* 语句

      把一个模块的所有内容全部导入到当前命名空间也可以:

            from modnameimport *

      这种方法导入了一个模块中的所有项目,不该过多地使用

    python程序员不使用这种方法,因为引入的其他来源的命名,很有可能覆盖了已有的定义.

      import总结:

        优点:指名道姓地问某一个名称空间要名字,不会与当前执行文件名称空间中的名字冲突

        缺点:引用模块中的名字必须加前缀(模块名),使用不够简洁

      from...import总结:

        优点: 引用模块中的名字不用加前缀(模块名),使用更为简洁

        缺点: 容易与当前执行文件名称空间中的名字冲突

    _name_ 属性  (py文件的两种用处)

      一个模块被另一个程序第一次引入时,其住程序将运行,如果我们想在模块被引入时,模块中的某一程序块不执行,可以用_name_属性来使该程序块仅在该模块自身运行时执行

    if __name__ == '__main__':
       print('程序自身在运行')
    else:
       print('我来自另一模块')
    
    
    #运行如下
    $ python using_name.py
    程序自身在运行
    
    
    $ python
    >>> import using_name
    我来自另一模块

     说明:  

      每个模块都有一个_name_属性,当其值是'_main_'时,表明该模块自身在运行,否则是被引入

      

      当文件被当作执行文件执行时_name_的值为_main_

      当文件被当作模块导入时_name_ 的值为模块名

  • 相关阅读:
    Loadrunder场景设计篇——IP欺骗
    Loadrunner场景设计篇——负载生成器
    Loadrunder场景设计篇——定时器(schedule)
    2-SAT 及 一点习题
    如何A掉未来程序改
    NOI2015 寿司晚宴
    好玩的东西——一个代码片段
    后缀自动机
    Codeforces Round #313 (Div. 2)
    Codeforces Round #312 (Div. 2)
  • 原文地址:https://www.cnblogs.com/kp1995/p/10066885.html
Copyright © 2020-2023  润新知