零基础搭建量化投资系统:以Python为工具
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.6 import语句

Python中可以使用import语句来引入模块、包和库。

import语句的一般语法格式如下:

        import  <模块名|包名|库名>

Python模块就是一个包含了一组定义的变量、函数和类所组成的Python文件。这个文件可以是以.py为后缀的原始文本文件,也可以是.py文件编译过的.pyc文件。

我们编写的程序一般也存储在.py文件中,如果这个文件包含变量、函数或类,就可以提供给其他Python程序使用。假定模块名为stockn.py。

        #文件名:stockn.py
        #数字股票代码转换字符串股票代码
        def stockname(n):
            '''
            数字股票代码转换字符串股票代码
        stockname(n)
            参数: n整型
            返回:字符串
            '''
            s=str(n)
            s=s.strip()
            if(len(s)<6 and len(s)>0):
              s=s.zfill(6)+'.SZ'
            if len(s)==6:
              if s[0:1]=='0':
                  s=s+'.SZ'
              else:
                  s=s+'.SH'
            return s

如果我们想用import语句导入stockn.py模块,就可以使用这个模块中的stockname(n)函数,模块名可以省略.py,如示例2-23所示。

        import  stockn
        mystock=650
        stock=stockn.stockname(mystock)
        stock2=stockn.stockname(600020)
        print('stock= ', stock)
        print('stock2= ', stock2)

程序运行结果:

        stock=  000650.SZ
        stock2=  600020.SH

为了便于管理,我们将不同的模块按功能放置到不同的子目录中。如果在子目录“funa”和子目录“funb”中都包含aaa.py模块,那么在导入时就需要增加子目录名。

“funa/aaa.py”文件内容如下:

        def aaa():
            return 'funa/aaa.py'

“funb/aaa.py”文件内容如下:

        def aaa():
            return 'funb/aaa.py'

下面是演示示例2-24。

        import  funa.aaa
        import  funb.aaa
        aa=funa.aaa.aaa()
        print('\naa=funa.aaa.aaa()')
        print('aa= ', aa)

       aa=funb.aaa.aaa()
        print('\naa=funb.aaa.aaa()')
        print('aa= ', aa)

       from  funa.aaa  import *
        bb=aaa()
        print('\nfrom  funa.aaa  import *')
        print('bb= ', bb)

       from funb.aaa import *
        bb=aaa()
        print('\nfrom  funb.aaa  import *')
        print('bb= ', bb)

程序运行结果:

        aa=funa.aaa.aaa()
        aa=  funa\aaa.py

        aa=funb.aaa.aaa()
        aa=  funb\aaa.py

       from  funa.aaa import *
        bb=  funa\aaa.py

       from  funb.aaa import *
        bb=  funb\aaa.py

包是一个有层次的文件目录结构,它定义了由N个模块或N个子包组成的Python应用程序执行环境。

包所在子目录与模块子目录功能用法基本一样。包所在目录中一般包含特定的__init__.py文件,这个文件和其他诸多.py文件构成一个包。

__init__.py文件可以为空文件,也可以写入一些包执行的初始化代码。

假如func包中的__init__.py文件有包执行的初始化代码,那么我们就可以引用这个包名。

        import  func

假如func的目录有__init__.py和aaa.py两个文件,其中__init__.py文件为空文件,那么此时包和带子目录的模块用法就没什么区别。我们用如下格式导入包中的aaa.py文件。

        import  func.aaa

看示例2-25。

        from func.aaa import *
        bb=aaa()
        print('\nfromfunc.aaa import *')
        print('bb= ', bb)

程序运行结果:

        from func.aaa import *
        bb=  func\aaa.py

库是由众多包和模块组成的,是能够完成某类程序开发所必须具有的基础功能。

Python库分为自带内置库(也称标准库)和第三方库。

例如,math是内置数学库,Tkinter是用于开发Python图形用户界面的内置库。

第三方库一般都用pip软件安装管理。例如,NumPy库是一个具有强大科学计算功能的第三方库,Pandas库是建立在NumPy库上的常用数据处理库。

用户自编模块也可以认为是最小的Python自定义库。

使用import语句引入库有以下几种方法。

(1)直接引用库。

        import  <库名>

此时,程序可以调用库中的所有函数,其格式如下:

      <库名>.<函数名>(<函数参数>)

例如,使用模块bbb.py。

        #模块bbb.py
        var1='var1'
        var2='var2'
        var3=18.55

       def aaa():
            return 'aaa'

       def bbb():
            return 'bbb2'

       def ccc():
            return 'ccc3'

       def ddd(x='ddd4'):
            return x

请看演示示例2-26。

        import bbb
        bb=bbb.aaa()
        print('bb= ', bb)

       bb=bbb.ddd()
    print('bb= ', bb)

   bb=bbb.ccc()
    print('bb= ', bb)

程序运行结果:

    bb=  aaa
    bb=  ddd4
    bb=  ccc3

(2)直接引用库,并增加别名。

import <库名> as <别名>

此时,程序可以调用库中的所有函数,其格式如下:

<别名>.<函数名>(<函数参数>)

请看示例2-27。

    import bbb as aa
    bb=aa.aaa()
    print('bb= ', bb)

   bb=aa.ddd()
    print('bb= ', bb)

   bb=aa.ccc()
    print('bb= ', bb)
    print('var3= ', aa.var3)

程序运行结果:

    bb=  aaa
    bb=  ddd4
    bb=  ccc3
    var3=  18.55

(3)如果只从库中引用函数,就可以使用如下的命令格式。

    from  <库名>  import  <函数名1,函数名2, …,函数名n>

此时,程序可以调用库中的函数,也可以直接省略库名。使用库中函数的格式如下:

        <函数名>(<函数参数>)

请看示例2-28。

        from  bbb import bbb, ddd
        bb=bbb()
        print('bb= ', bb)

       bb=ddd('xxx')      #输入参数’xxx'
        print('bb= ', bb)

       #bb=ccc()          #可删除注释再运行一次

程序运行结果:

        bb=  bbb2
        bb=  xxx

如果使用模块bbb.py中的ccc函数,就会出现错误提示:

“NameError: name 'ccc' is not defined”。

(4)如果不写具体函数名,直接用通配符“*”,则表示引入库中所有函数。在使用中可以省略模块库名,其格式如下:

        from  <库名>  import  *

其中,*是通配符,表示库中所有函数。

此时,在调用该库的函数时不需要使用库名,直接使用如下格式:

        <函数名>(<函数参数>)

请看演示示例2-29。

        from  bbb import  *
        bb=bbb()
        print('bb= ', bb)

       bb=ddd('12345')
        print('bb= ', bb)
        bb=ccc()
        print('bb= ', bb)

程序运行结果:

        bb=  bbb2
        bb=  12345
        bb=  ccc3

(5)库中定义的类和变量的使用方法与库中函数的使用方法相同。

例如:

        <库名>.<类名>
        <别名>.<变量名>

见示例2-30。

        import bbb as aa
        bb=aa.ddd('ABCD')
        print('bb= ', bb)

       bb=aa.ccc()
        print('bb= ', bb)

       print('var3= ', aa.var3)

       v1=aa.var1
        v2=aa.var2
        print('v1= ', v1)
        print('v2= ', v2)

程序运行结果:

        bb=  ABCD
        bb=  ccc3
        var3=  18.55
        v1=  var1
        v2=  var2

(6)在Python中多个模块或程序使用同一个文件,如果不设定库名或别名,就会认为是一次使用的局部变量。程序终止,变量就会释放消失。