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

先上定义:

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

  主要有以下作用:

  代码重用:

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

  避免变量名冲突:

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

import 语句

  import 语句就是这样, 也可以在一行内导入多个模块:

    import module1[, module[...moduleN]]

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

  import 工作方式:

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

    import 解释  ;

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

   import as 语句

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

  from-import 语句

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

    使用:

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

      from module import name1,[name2..[name3...]]

  from *

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

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

    导入只发生一次

      一个模块只被加载一次,无论它被导入多少次。

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

  import 和 from 是赋值语句

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

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

    from 将一个或多个变量名赋值给另外一个模块中同名的对象,所以 from 容易污染命名空间。

为什么不建议使用 “from * import ”

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

  何时使用 from module import:

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

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

python中:from * import 与 import 详解的更多相关文章

  1. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

  2. **Python中的深拷贝和浅拷贝详解

    Python中的深拷贝和浅拷贝详解   这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容.   要说清楚Python中的深浅拷贝,需要 ...

  3. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  4. python中的subprocess.Popen()使用详解---以及注意的问题(死锁)

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

  5. Python中random模块生成随机数详解

    Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...

  6. Python中的变量和作用域详解

    Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...

  7. Python中%r和%s的详解及区别_python_脚本之家

    Python中%r和%s的详解及区别_python_脚本之家 https://www.jb51.net/article/108589.htm

  8. 第7.15节 Python中classmethod定义的类方法详解

    第7.15节  Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一.    类方法的定义 在类中定 ...

  9. 三十一、python中urllib和requests包详解

    A.urllibimport urllibimport urllib.requestimport json '''1.loads,dumpsjson.loads():将字符串转化成python的基础数 ...

  10. python中os.walk的用法详解

    python中os.walk是一个简单易用的文件.目录遍历器,可以帮助我们高效的处理文件.目录方面的事情. 1.载入要使用os.walk,首先要载入该函数 可以使用以下两种方法 import os f ...

随机推荐

  1. Android学习15

    Date&Time DatePicker(日期选择器),TimePicker(时间选择器),CalendarView(日期视图): 1.TextClock TextClock可以以字符串格式显 ...

  2. cgroup的学习笔记

    1.cgroup是什么? cgroup是一个linux内核提供的机制.目的是为了做资源隔离,资源限制,资源记录. 2.cgroup怎么安装? yum install cgroup service cg ...

  3. go基础_切片

    切片创建方式 1.通过数组创建 2.通过内置函数make创建 切片允许的操作 1.追加元素 2.通过内置函数make创建 package main import "fmt" fun ...

  4. libcurl库的简介(二)

    下面是使用libcurl库实现文件上传的一个实例: void CDataProcess::sendFileToServer(void) { string netIp = strNetUrl + &qu ...

  5. Spring JdbcTemplate类常用的方法

    execute(String  sql) 可执行任何sql语句,但返回值是void,所以一般用于数据库的新建.修改.删除和数据表记录的增删改. int  update(String sql) int  ...

  6. Python格式化字符串知多少

    字符串格式化相当于字符串模板.也就是说,如果一个字符串有一部分是固定的,而另一部分是动态变化的,那么就可以将固定的部分做成模板,然后那些动态变化的部分使用字符串格式化操作符(%) 替换.如一句问候语: ...

  7. JAVA 中集合ConcurrentMap

    ConcurrentMap ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合 在原有java.util.map接口基础上又新提供了4种方法,进一步扩展了 ...

  8. ScheduledThreadPoolExecutor与Timer

    首先来看一下Timer类 例子如下: package cn.concurrent.executor; import java.util.Timer; import java.util.TimerTas ...

  9. 1010 Radix

    1010 Radix 注意点 如111 1 1 10类似情况下,若n为个位数,如果本身比另一个数小,则多少的进制都是没有用的(可能会造成空循环而超时),不过好像没有这么一个测试用例 进制应该比最少数据 ...

  10. 【C语言】输入一个年份和月份,输出该月的天数

    分析: 三种类型, A.2月比较特殊,平年的2月只有28天,而闰年的2月有 29 天: B.4.6.9.11月: C.其他1.3.5.7.8.10.12月. 代码: /*输入一个年份和月份,输出该月的 ...