模块语法

本节主要内容:

1.模块

2.import

3.from xxx import xxx

一.模块

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

模块的分类:

1. 使用python编写的py文件

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

3. 包好一组模块的包.

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

模块的作用:

1.可以把代码进行分类

2.可以实现代码的重用

3. 方便代码的维护,以及新项目的开发

导入模块的方式:

1. import 模块

2. from xxx import xxxx

二. import

在导入模块的时候系统都做了些什么?

首先.在导入模块的一瞬间. python解释器会先通过sys.modules 来判断该模块是否已经导入了该模块.如果已经导入了

则不再导入. 如果该模块还未导入过,则系统会做三件事.

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

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

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

在python中模块是不能重复导入的. 当重复导入模块时. 系统会根据sys.modules来判断该模块是否已经导入了.如果已经导入了.

则不会重复导入

我们可以使用globals来查看模块的名称空间

import random

print(globals())
# 结果:
# {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': 
# <_frozen_importlib_external.SourceFileLoader object at 0x0000015A4073C278>, 
# '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 
# '__file__': 'D:/python课件及作业/常用模块/模块.py', '__cached__': None, 'random': 
# <module 'random' from 'C:\Users\hasee\AppData\Local\Programs\Python\Python36\lib\random.py'>}

注意:

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

2.在模块中使用global.我们之前说global表示把全局的内容引入到局部. 但是,这个局部指的是py文件.换句话说,

global指向的是模块内部.并不会改变外部模块的内容

特别注意: 如果我们在不同的模块中引入了同一个模块.并且在某一个模块中改变了被引入模块中的局部变量. 则

其他模块看到的值也跟着改变.原因是python的模块只会引入一次,大家共享同一个名称空间

上述问题出现的原因: 

1.大家共享同一个模块的名称空间

2.另一个引用该模块的模块改变了变量, 所以再引用同时该模块和改变他变量的模块,也会跟着改变.

那么我们如何不让上面这种情况发生呢?

这里我们需要利用到内置变量--__name__.

在python中, 每个模块都有自己的__name__,但是这个__name__的值是不定的. 当我们把一个模块作为程序的入口时,

此时该模块的__name__是"__main__", 而如果我们把模块导入时, 此时模块内部的__name__就是该模块自身的名字.

我们可以利用这个特性来控制模块内哪些代码是在被加载的时候就运行的, 哪些是在模块被别人导入的时候就要执行的.

也可以拼比掉一些不希望别人导入就运行的代码,尤其是测试代码

对导入的模块进行重命名:

import xxx as xxxx

一次引入多个模块:

import random, time, re, json

正确的导入模块的顺序:

1. 所有的模块导入都要写在最上面.

2.先引入内置模块.

3.再引入扩展模块

4.最后引入自己定义的模块

三. from xxx import xxxx

在使用from的时候. python也会给我们的模块创建名称空间.

但是from xxx import xxxx 的时候, 我们是把这个空间的一些变量引入过来了,只是部分导入.

当一个模块的内容过多的时候,我们可以选择性的导入要使用的内容

from random import randint
n = randint(2,10)

from 语句也支持一行语句导入多个内容.

from random import randint, shuffle, choice, randrange

from xxx import *  导入所有xxx模块的所有内容, 但是该方法最好少用,容易被坑

假如在模块的一开始定义 __all__ 变量,import该模块后,只能找到 __all__中存在的变量或者函数,其他的不能调用

同样也可以使用as重命名

注意: 当我们从一个模块中引入一个变量额时候.如果当前文件中出现了重名的变量时,会覆盖掉模块引入的那个变量.

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

的模块都是python内置的模块.

三. from xxx import xxxx

原文地址:https://www.cnblogs.com/af1y/p/9984313.html