• 学习python的day16之模块和包


    一、模块

    python模块(Module)是一个python文件,以.py结尾,包含了python对象定义和python语句。

    模块能定义函数,类和变量,模块里也能包含可执行的代码

    1.1导入模块

    1.1.1导入模块的方式

    import  模块名

    from  模块名  import  功能名

    from  模块名  import  *

    import  模块名  as 别名

    from   模块名  import  功能名  as  别名

    1.1.2导入方式详解

    1.1.2.1import

    语法

    #1.导入模块

    import  模块名

    import  模块名1,模块名2...

    #2.调用模块

    模块名.功能名()

    体验

    import math
    print(math.sqrt(9))
    '''
    输出:
    3.0
    '''

    1.1.2.2 form....import....

    语法

    from   模块名  import   功能名1,功能名2.....

    体验

    from math import sqrt
    print(sqrt(9))
    '''
    输出:
    3.0
    '''

    功能调用不需要书写模块名.功能名

    1.1.2.3 from...import  *

    语法

    from  模块名  import  *

    体验

    from math import *
    print(sqrt(9))
    '''
    输出:
    3.0
    '''

    功能调用不需要书写模块名.功能名

    1.1.2.4   as定义别名

    语法:

    #定义模块别名

    import  模块名  as  别名

    体验:

    import math as tt
    print(tt.sqrt(9))
    '''
    输出:
    3.0
    '''

    定义别名之后,就不可以使用math.sqrt()来调用函数

    #功能定义别名

    from 模块名  import  功能名  as  别名

    体验:

    from math  import sqrt as tt
    print(tt(9))
    '''
    输出:
    3.0
    '''

    与定义模块名一样,定义别名后,只能使用别名调用函数

    1.2制作模块

    在python中,每个python文件都可以作为一个模块,模块的名字就是文件的名字 ,也就是说自定义模块名必须符合标识符命名规则.

    1.2.1

    定义模块

    新建一个python文件,命名为my_module1.py,并定义testA函数

    def testA(a,b):
        return a+b

    1.2.2测试模块

    在实际开发中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会在py文件中添加一些测试信息,例如,在my_module1.py文件中添加测试信息.

    def testA(a,b):
        print(a + b)
    
    #测试信息
    if __name__ == '__main__':
        testA(1,3)

    1.2.3调用自定义模块

    import my_module1
    my_module1.testA(1,9)
    
    '''
    输出:
    10
    '''

    1.3 模块定位顺序

    当导入一个模块,python解释器对模块位置的搜索顺序是:

    1.当前顺序

    2.如果不在当前目录,python则搜索shell变量PYTHONPATH下的每个目录

    3.如果都找不到,python会查找默认路径,UNIX,默认路径一般为/usr/local/lib/python/ 

    模块搜索路径存储在system模块的sys.path变量中.变量包含当前目录,PYTHONPATH和由安装过程决定的默认路径 .

    注意:将上面的话总结后则为以下两点

    1.自己的文件名不要和已有模块名重复,否则导致模块功能无法使用

    2.使用 from  模块名  import  功能名 的时候,如果功能名字重复,调用到的是最后定义或导入的功能

    体验:

    自定义一个模块,模块名为random.py,调用

    import random
    num = random.randint(1,5)
    print(num)
    
    '''
    输出:
    Traceback (most recent call last):
      File "C:/Users/as_sc/PycharmProjects/untitled/python/hm-python-day13/03-模块定位顺序.py", line 2, in <module>
        num = random.randint(1,5)
    AttributeError: module 'random' has no attribute 'randint'
    
    进程已结束,退出代码 1
    '''

    定义一个函数名与调用模块的功能名相同的函数

    #例1
    from
    time import sleep def sleep(a): print(a) sleep(2) ''' 输出: 2 '''

    #例2 from time import sleep def sleep(): print('sdsd') sleep(2) ''' 输出: Traceback (most recent call last): File "C:/Users/as_sc/PycharmProjects/untitled/python/hm-python-day13/03-模块定位顺序.py", line 21, in <module> sleep(2) TypeError: sleep() takes 0 positional arguments but 1 was given '''

     拓展:使用 import  模块名  不用担心功能名字重复

    import time
    print(time)
    time = 1
    print(time)
    
    '''
    输出:
    <module 'time' (built-in)>
    1
    
    '''

    与模块同名的变量名能覆盖模块---因为在python中,数据是通过引用来传递的,因为是同名,所以引用是一样的,后面的数据把前面的数据覆盖。

    1.4 __all__

    如果一个模块中有__all__变量,当使用from  xxx import * 导入时,只能导入列表中的元素。

    #my_module2.py
    
    def testA():
        print('testA')
    
    def testB():
        print('testB')
    
    #my_module3.py
    
    __all__ = ['testA']
    
    def testA():
        print('testA')
    
    def testB():
        print('testB')
    
    #04-__all__列表.py
    
    from my_module2 import *
    testA()
    testB()
    '''
    输出:
    testA
    testB
    '''
    
    from my_module3 import *
    testA()
    '''
    输出:
    testA
    '''
    
    from my_module3 import *
    testB()
    '''
    输出:
    Traceback (most recent call last):
      File "C:/Users/as_sc/PycharmProjects/untitled/python/hm-python-day13/04-__all__列表.py", line 11, in <module>
        testB()
    NameError: name 'testB' is not defined
    '''

    二、包

    包将有联系的模块组织起来 ,即放在同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py的文件,那么这个文件夹就称之为包。

    注意:新建包后,包内部会自动创建__init__.py文件,这个文件控制着包的导入行为。

    1.新建包

    my_module1.py

    def info_print1():
        print('my_module1')

    my_module2.py

    def info_print2():
        print('my_module2')

    2.导入包

    方法一

    import  包名.模块名

    包名.模块名.目标

    import mypackage.my_module1
    mypackage.my_module1.info_print1()
    
    '''
    输出:
    my_module1
    '''

    方法二

    必须在__init__.py文件中添加__all__  =  [],控制允许导入的模块列表

    语法

    from  包名  import  *

    模块名.目标

    体验:

    __init__.py

    __all__ = ['my_module1']

    导入包中__init__.py文件内__all__列表中包含的模块

    from mypackage import *
    my_module1.info_print1()
    
    '''
    输出:
    my_module1
    '''

    导入包中__init__.py文件内__all__列表中不包含的模块

    from mypackage import *
    my_module2.info_print2()
    
    '''
    输出:
    Traceback (most recent call last):
      File "C:/Users/as_sc/PycharmProjects/untitled/python/hm-python-day13/05-导入包.py", line 18, in <module>
        my_module2.info_print2()
    NameError: name 'my_module2' is not defined
    '''

    三、总结

    导入模块的方法

      import 模块

      from 模块 import 功能名

      from 模块 import *

    导入包

      import 包名.模块名.功能名

      from 包名 import *

    __all__ = [] : 允许导入的模块或功能列表

  • 相关阅读:
    Microsoft .NET Framework 远程执行代码漏洞
    GE PACSystems RX3i 输入验证漏洞
    Windows10 1809版本Windows自动更新服务无法禁用问题解决方案
    企业网络防范Serv-U的漏洞
    jsp安全问题及其解决建议
    Windows XP系统搜索故障及处理办法点点通
    开启路由器的TCP拦截
    从MyIE2平滑升级到Maxthon的完美方案
    全面解析UNIX缓冲区溢出 深度防御体系
    从异常系统进程检查企业网络安全 (二)
  • 原文地址:https://www.cnblogs.com/scheduled/p/13948626.html
Copyright © 2020-2023  润新知