• python之模块4


    1 模块与包

    1.1 模块的定义

    什么是模块

    模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

    为什么使用模块

    在退出python解释器然后重新进入,之前定义的函数或者变量都将丢失,因此我们通常将程序写在文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时的test.py被称为脚本。

    我们通常将程分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用。

    1.2 如何使用模块

    1.2.1 import

    模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,他们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句)

    #spam.py
    import spam#只在第一次导入时才执行spam.py内代码,此处的显示效果是只打印一次
    当然其他的顶级代码也都被执行了,只不过没有显示效果
    import spam
    import spam
    import spam
    >>
    from the spam.py
    

    可以从sys.module中找到当前已经加载的模块,sys.module是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。

    每个模块都是一个独立的名称空间,定义在这个模块中的函数,吧这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

    money=1222#全局定义变量money
    from spam import money,read1#调用spam模块
    print(money)
    >>
    from the spam.py
    1000#打印spam模块中变量money
    

    在名称空间中绑定money

    #test.py
    import spam
    def resd1():
        print("---->")
    spam.read1()#调用spam的属性
    >>
    from the spam.py
    spam->read1->money 1000
    

    导入模块可以同时导入多个,用逗号隔开

    import sys,os,re
    

    在名称空间中赋值read1,read1函数则不能够被调用

     

    总结:首次导入模块时会做三件事

    (1)     为源文件创建新的名称空间,用来存放源文件中定义的名字

    (2)     基于创建的名称空间执行模块

    (3)     创建名字(如spam)来引用该名称空间,文件名.名字的操作,都是以创建名字的文件为准

    模块别名使用

    import spam as sm#把spam模块重新起名sm
    print(sm.money)#相当于print(spam.money)
    >>
    from the spam.py
    1000
    

    为已经导入的模块起别名的方式对编写可扩展的代码很有用,假设两个模块都定义了同一个函数,但是采用不同的输入格式。可以编写代码来选择性的挑选读取模块

     if file_format == 'xml':
         import xmlreader as reader
     elif file_format == 'csv':
         import csvreader as reader
     data=reader.read_date(filename)
    

     

    1.2.2 from import

    对比import spam,会将源文件的名称空间带到当前名称空间中,使用时必须是spam.名字的方式

    而from语句相当于import,也会创建新的名称空间,直接使用名字就可以

    from spam import money,read1
    read1()
    >>
    from the spam.py
    spam->read1->money 1000
    

    如果当前有重命名read1,那么就会有覆盖效果

    from spam import money,read1
    def read1():
        print("--->")
    read1()
    >>
    from the spam.py
    --->
    

    from语句中也可以使用别名

    from spam import read1 as read
    

    也可以导入多行

     from spam import (read1,
                     read2,
                     money)
    

    from spam import *

    把spam中所有的不是以下划线开头的名字都导入到当前位置。

    缺点:不知道*导入的什么名字,很可能会覆盖掉之前定义的名字

           可读性极其的

    可以用__all__来控制*

    执行read1时没有问题

    执行read2时报错

    Python不支持重新加载或卸载之前导入的模块

    1.3 把模块当做脚本执行

    调用模块  则不会被使用

    1.4模块的搜索路径

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

    注意:自定义的模块名不应该与系统内置模块重名

     

    1.5编译python文件

    只有导入模块  import   

                  from  import

    才会产生pyc文件  模块被加载时增加速度

  • 相关阅读:
    [ 测试管理 ] 如何描述缺陷报告?
    [ 测试思维 ] 启发式测试策略模型(HTSM)
    Linux tcpdump命令使用方法
    Linux创建SSH信任关系
    [ Shell入门教程 ] 通配符与基础正则表达式、扩展正则表达式
    [ Shell入门教程 ] shell字符串基本操作
    Shell多进程获取未使用IP方法
    [ Shell入门教程 ] 字符串空格和文件空行删除
    [ Shell入门教程 ] Shell编程中数值计算方法实例
    [ Shell入门教程 ] echo和printf使用实例
  • 原文地址:https://www.cnblogs.com/asaka/p/6797590.html
Copyright © 2020-2023  润新知