在python中导入模块绝对是我们最最常用的功能,基本每个py文件中都会有import或者是from import语句。可是,这两种导入方法有什么不同,又该怎么用呢?今天就好好来分析一下。

先上他俩的定义:


模块导入允许我们将一个个独立的程序功能分别实现然后组合成一个复杂的系统。

主要有如下作用:

代码重用:我们知道当一段代码需要用到两次的时候,我们就需要写一个函数了这是一个道理。

避免变量名的冲突:每个模块都将变量名封装进了自己包含的软件包,这可以避免变量名的冲突。除非使用精确导入。


import语句

import语句就像这样


也可以在一行内导入多个模块:

但是这样的代码可读性不如多行的导入语句。 而且在性能上和生成 Python 字节代码时这两种做法没有什么不同。 所以一般情况下, 我们使用第一种格式。

Import工作方式:


其中,导入程序搜索的目录如下:


import解释:

解释器执行到import语句, 如果在搜索路径中找到了指定的模块, 就会加载它。该过程遵循LEGB作用域原则, 如果在一个模块的顶层导入, 那么它的作用域就是全局的; 如果在函数中导入, 那么它的作用域是局部的。 如果模块是被第一次导入, 它将被加载并执行

例子:


Import as语句

有时候你导入的模块或是模块属性名称已经在你的程序中使用了, 或者你不想使用导入的名字。可能是它太长不便输入什么的, 总之你不喜欢它。 这已经成为 Python 程序员的一个普遍需求: 使用自己想要的名字替换模块的原始名称。一个普遍的解决方案是把模块赋值给一个变量:


这样便于自己使用from-import 语句

你可以在你的模块里导入指定的模块属性。 也就是把指定名称导入到当前作用域。 使用

from-import 语句可以实现我们的目的, 它的语法是: From *

当我们使用from * 的时候,会取得模块顶层左右赋值的变量名的拷贝。


注意:当我们使用这种方法导入的时候,就会出现变量名的重复问题,因为我们把另外一个模块中所有的变量名都导入了进来,在命名的时候会出现命名冲突的情况。

导入只发生一次

个模块只被加载一次, 无论它被导入多少次。 这可以阻止多重导入时代码被多次执行。 例

如你的模块导入了 sys 模块, 而你要导入的其他 5 个模块也导入了它, 那么每次都加载 sys (或是其他模块)不是明智之举! 所以, 加载只在第一次导入时发生。


Import 和from是赋值语句

像def一样,import和from是可执行的语句,他们可以出现在if中,可以出现在函数中,执行到这些语句的时候才会进行解析,也就是说,被导入的模块和变量名只有在对应的import或from语句执行后才可以使用。

Import将整个模块对象赋值给一个变量名。

From将一个或多个变量名赋值给另外一个模块中同名的对象。所以from容易污染命名空间。为什么不建议用 'from module import *'

在实践中, 'from module import *' 不是良好的编程风格,如果使用from导入变量,且那些变量碰巧和作用域中现有变量同名,那么变量名就会被悄悄覆盖掉。使用import语句的时候就不会发生这种问题,因为我们是通过模块名才获取的变量名,像module.attr不会和现有作用域的attr冲突。


何时使用from import:

我们只在两种场合下建议使用这样的方法, 一个场合是:目标模块中的属性非常多, 反复键入模块名很不方便 , 例如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模块 , 可能还有 socket 模块。

另一个场合是在交互解释器下, 因为这样可以减少输入次数。