• 模块和包


    定义

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

       使用方法: 

    #spam.py
    print('from the spam.py')

    money=1000

    def read1():
        print('spam->read1->money',money)

    def read2():
        print('spam->read2 calling read')
        read1()

    def change():
        global money
        money=0

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

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

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

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

    按 Ctrl+C 复制代码

    3为模块名起别名,相当于m1=1;m2=m1 

    1 import spam as sm
    2 print(sm.money)

    from ... import...

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

    而from 语句相当于import,也会创建新的名称空间,但是将spam中的名字直接导入到当前的名称空间中,在当前名称空间中,直接使用名字就可以了、

     1 from spam import read1,read2

    2.也支持as

    3.如果当前有重名read1或者read2,那么会有覆盖效果。

    #测试三:导入的函数read1,被当前位置定义的read1覆盖掉了
    #test.py
    from spam import read1
    def read1():
        print('==========')
    read1()
    '''
    执行结果:
    from the spam.py
    ==========
    '''

    4.也支持导入多行

    1 from spam import (read1,
    2                   read2,
    3                   money)

    特殊

    from spam import * 把spam中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。

    from spam import * #将模块spam中所有的名字都导入到当前名称空间
    print(money)
    print(read1)
    print(read2)
    print(change)

    '''
    执行结果:
    from the spam.py
    1000
    <function read1 at 0x1012e8158>
    <function read2 at 0x1012e81e0>
    <function change at 0x1012e8268>
    '''

    可以使用__all__来控制*(用来发布新版本)

    在spam.py中新增一行

    __all__=['money','read1'] #这样在另外一个文件中用from spam import *就这能导入列表中规定的两个名字

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

    在初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。

    1 >>> import sys
    2 >>> sys.path.append('/a/b/c/d')
    3 >>> sys.path.insert(0,'/x/y/z') #排在前的目录,优先被搜索

    注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找,

  • 相关阅读:
    Vue 左右翻页,点赞动画
    gitbook 使用
    css3 序列帧动画抖动
    ios添加-webkit-overflow-scrolling依然卡顿
    css 多行省略号兼容移动端
    Vue粒子特效(vue-particles插件)
    css3 渐变色兼容移动端
    前端性能优化:客户端从输入到展示讲解
    前端通信:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布
    前端通信:ajax设计方案(五)--- 集成promise规范,更优雅的书写代码(改迭代已作废,移步迭代10)
  • 原文地址:https://www.cnblogs.com/hanxiaofeicf/p/7092051.html
Copyright © 2020-2023  润新知