zoukankan      html  css  js  c++  java
  • 模块,import,from xxx import xxx

    一,模块

      模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀,总体来说,import加载的模块一共分成四个通用的类别:

      1,使用python编写的py文件

      2,已被变异为共享或者DLL或者C++的扩展

      3,包好一组模块的包

      4,使用c编写并连接到python解释器的内置模块

      为什么要使用模块?为了我们写的代码可以重用不至于把所有的代码都写在一个文件内,当项目规模比较小的时候,完全可以使用一个py搞定整个项目的开发,但是如果是一个非常大的项目,此时就必须要把相关的功能进行分离,方便我们日常维护,以及新项目的开发,导入模块有两种方式:

      1,import 模块

      2,from xxx import xxx

    二,import

      首先建一个tang.py文件。 

    name='糖糖'
    def xihuan():
        print('%s喜欢看小说'%name)
        print('她喜欢画画')
        print('她喜欢喝冰红茶')
        print('她喜欢吃胡豆')
    xihuan()

      接下来,再建一个py文件,在这个文件中导入tang模块。

    import tang   #此时运行新建的py文件时,会默认执行tang模块中的代码
    import tang #不管后面调用几次,都是没有效果的,模块是不能够重复导入的
    import tang
    print(tang.name)
    tang.xihuan() #在引入模块后,就可以调用tang模块中的属性和方法

      导入模块的时候都做了些什么?首先,在导入模块的一瞬间,python解释器会先通过sys.mudules来判断该模块是否已经导入过了,如果导入过了就不在导入,如果该模块还没导入过,则系统会做三件事:

      1,为导入的模块创立新的名称空间

      2,在新创建的名称空间中运行该模块中的代码

      3,创建模块的名字,并使用该名称作为该模块在当前模块中引用的名字

      注意:由于模块在导入的时候会创建自己的名称空间,所以,我们在使用模块中的变量的时候一般是不会产生冲突的。

    import tang
    name='糖儿'
    tang.xihuan()  #结果还是用的是tang中的‘糖糖’

      注意:在模块中使用global,我们之前说global表示把全局的内容引入进到局部,但是,这个全局指的是py文件,换句话说,global指向的是模块内部,并不会改变外部模块的内容

    tang.py
    name='糖糖'
    def xihuan():
      global name
      name='糖糖糖'
      print(name)

    111.py
    import tang
    name='唐儿'
    tang.xihuan() #结果是‘糖糖糖’
    print(name) #结果是‘唐儿’

      特别要注意,如果我们在不同的模块中引入同一个模块,并且在某一个模块中改变了被引入模块中的全局变量,则其他模块看到的值也随之改变,原因是python的模块只会引入一次,大家共享同一个名称空间

    tang.py
    name=''
    
    111.py
    import tang
    tang.name='糖糖'
    #if __name__ == __main__: 此时,只有在111py文件为执行文件时才会改变值
      #tang.name='糖糖’
    112.py import tang import 111 print(tang.name) #结果是‘糖糖’

    113.py
    import tang
    import 111
    #print(tang.name) #而此时,结果就不在是‘糖糖’,而是‘糖’

      我们可以对引入的模块重新命名,还可以一次性引入多个模块

    import tang as t
    print(t.name)  #这样也行的

    import time,random,json,tang #一次引入多个,但引入的顺序是有规定的

      正确的导入模块的顺序:

      1,所有的模块导入都要写在最上面,这是最基本的

      2,先引入内置模块

      3,在引入扩展模块

      4,最后引入自定义的模块

    三,from xxx import xxx

      其实就是选择性的导入

    tang.py
    name='糖糖' def xihuan(): print('%s喜欢看小说'%name) print('她喜欢画画') print('她喜欢喝冰红茶') print('她喜欢吃胡豆') xihuan()

    from tang import xihuan
    xihuan() #直接使用就可以,不用tang.

      但是这有个坑,当我们从一个模块中引入一个变量的时候,如果当前文件中出现了重名的变量时,会覆盖掉模块中引入的那个变量

    tang.py
    name='糖糖' def xihuan(): print('%s喜欢看小说'%name) print('她喜欢画画') print('她喜欢喝冰红茶') print('她喜欢吃胡豆') xihuan()

    from tang import name
    name='静静'
    print(name) #此时结果是‘静静’

     所以,不要重名,切记,不要重名!不仅仅是变量名不要重复,我们创建的py文件的名字不要和系统内置的模块重名,否则,引入的模块都是python内置的模块。

      还有一种特殊的写法,from xxx import *,此时也是把模块中的所有内容导入。注意:如果所导的模块中没有写__all__则默认所有内容导入,但如果写了__all__,此时导入的内容就是__all__列表中列出来的所有名字

    tang.py
    __all__=['name']
    name='糖糖' def xihuan(): print('%s喜欢看小说'%name) print('她喜欢画画') print('她喜欢喝冰红茶') print('她喜欢吃胡豆')
    www.py
    from tang import *
    print(name) #结果是‘糖糖’
    xihuan() #报错

      

  • 相关阅读:
    记一道乘法&加法线段树(模版题)
    2021CCPC网络赛(重赛)题解
    Codeforces Round #747 (Div. 2)题解
    F. Mattress Run 题解
    Codeforces Round #744 (Div. 3) G题题解
    AtCoder Beginner Contest 220部分题(G,H)题解
    Educational Codeforces Round 114 (Rated for Div. 2)题解
    Codeforces Global Round 16题解
    Educational Codeforces Round 113 (Rated for Div. 2)题解
    AtCoder Beginner Contest 182 F
  • 原文地址:https://www.cnblogs.com/12345huangchun/p/9989676.html
Copyright © 2011-2022 走看看