day 13 (module packet 模块包 )

模块的导入和使用
什么是
    包含有一系列功能的.py文件.
    种类:
        1 使用python编写的py.文件
        2 已经被编译为共享库或者DLL的C或者C++程序
        3 把一系列文件组织到一起的文件夹(包)
        4 使用C编写并连接到python解释器的内置模块

为什么
    从文件级别组织程序更方便管理.
    拿来主义提升开发效率

怎么用
    一
    如何使用模块 ==> import spam
    导入过程:
        1 建立命名空间(1)
        2 执行相应文件.将其产生的名字放入到(1)命名空间中,
            在运行过程中golbal关键字影响的时对应文件的命名空间.
            所使用的变量名也是相应文件命名空间中的名字
        3 在当前文件(执行import的文件)中,拿到一个指向(1)命名空间的名字
    导入原理:
        模块只有在第一次导入时才会执行一次不管是否导入成功.之后再次导入时只从内存中调取而不再重新导入.
        例如:
        模块的相互导入:
        m1.py
            print('m1')
            from m2 import y
            x = m2
        m2.py
            print('m2')
            from m1 import x
            y = m2
        main.py
        import m1
        解释当引入m1 时输出m1,然后引入m2 输出m2 , 又再次导入x 但是第一次加载m1时x并没有被加载出来(第二次导入不会再次加载).
        所以x变量找不到.
ps 注意 : 调用模块的函数时使用的是其本身模块的所在的的命名空间与当前命名空间不产生联系.
    练习一
    #test.py
        import spam  
        money=10
        print(spam.money)

        '''
        执行结果:
        from the spam.py
        1000
        '''

    练习二
    #test.py
        import spam
        def read1():
            print('========')
        spam.read1()

        '''
        执行结果:
        from the spam.py
        spam->read1->money 1000
        '''

测试二:read1与spam.read1不冲突

    练习三
        #test.py
        import spam
        money=1
        spam.change()
        print(money)

        '''
        执行结果:
        from the spam.py
        '''

测试三:执行spam.change()操作的全局变量money仍然是spam中的


起别名用法
1 模块名太长

2 例
     #mysql.py
    def sqlparse():
        print('from mysql sqlparse')
    #oracle.py
    def sqlparse():
        print('from oracle sqlparse')

    #test.py
    db_type=input('>>: ')
    if db_type == 'mysql':
        import mysql as db
    elif db_type == 'oracle':
        import oracle as db

    db.sqlparse()

一行中导入多个模块
    import os,sys,time

6、函数的类型提示

由于Python语言强类型动态语言特性,Python并不会强制你输入对应的类型(比如name输入11),更多的是规范,    
可以采用类型提示的方式:

# def register(name:str,age:int,hobbbies:tuple):
    pass
# # register(1,'aaa',[1,])
# res=register('egon',18,('play','music'))


# 或者:def register(name:str='egon',age:int=18,hobbbies:tuple=(1,2))->int:

def register(name:"必须传入名字傻叉",age:1111111,hobbbies:"必须传入爱好元组")->"返回的是整型":

# res=register('egon',18,('play','music'))
# res=register('egon',19,(1,2,3))

print(register.__annotations__)   # 可以查看提示信息

包的使用
包是什么?
    包是一种特殊的模块,
    包是一种包括了__init__文件的文件夹,其中可以放一系列的子文件.
    ps :在python3 中即使没有__init__文件也不会报错.python2 会报错
为什么要有包?
    程序的结构清晰.管理清楚
package

    1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如import 顶级包.子包.子模块,但都必须遵循这个原则。但对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

    2、包A和包B下有同名模块也不会冲突,如A.a与B.a来自俩个命名空间

    3、import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件

  导入方式:
  绝对导入:以顶级包为起始
  相对导入: .代表当前文件所在的目录,..代表当前目录的上一级目录,依此类推
      ps:针对包内部模块之间的相互导入推荐使用相对导入,需要特别强调:
        1、相对导入只能在包内部使用,用相对导入不同目录下的模块是非法的
        2、无论是import还是from-import,但凡是在导入时带点的,点的左边必须是包,否则语法错误
       

原文地址:https://www.cnblogs.com/lee1225/p/12639178.html