模块

模块是python中的最高组织单元,在物理层面上,模块以文件存储,模块的文件名就是模块的名字.py,每个模块都有自己的名称空间。

python按照路径搜索来查找模块文件,在PYTHONPATH环境变量中的路径为Python模块的搜索路径,通过sys.path属性可以看到模块搜索路径的列表,python按照这个列表的顺序对模块进行搜索,所以在路径列表前面的路径搜索到模块之后就不会继续搜索。由于该值是一个列表,可以通过sys.path.append方法,或者sys.path.insert方法添加路径到该列表中,或者通过sys.path.pop方法将某些路径排除到搜索路径之外等等。

模块的物理层面是文件,包就是有层次的特殊文件结构,特殊的点在于,每个目录下面都必须有__init__.py文件,如果没有该文件,则只是一个普通的文件目录,并不能作为包导入。这是因为导入包的原理其实就是导入该包的路径下面的__init__.py,其中包含可以导入的各种模块。

模块导入和加载

通过import、from   import语句导入一个模块,或者通过as给模块起别名,模块只有在第一次导入的时候才会被加载,模块加载时,其实就是执行模块中的所有语句,此时,如果模块中除了定义的类和方法之外,在顶级作用域下有代码时,这些代码会被执行,所以在模块编写中需要避免在顶级作用域下直接执行代码。

在模块第一次被导入时,往往会比较慢,这是因为python在导入一个新的模块时,会从模块所在目录检查是否有.pyc文件,如果没有该文件,则会将模块编译成字节码,从而提高下一次导入的效率。

python也可以从一个ZIP文件中导入模块,该ZIP文件会被看成一个包,然而python不会再生成.pyc文件到该ZIP文件中,所以导入效率相对较低一些。

名称空间

名称空间指标示符到对象的映射,python在执行过程中,有两个或者三个活动的名称空间:局部名称空间、全局名称空间、内建名称空间。内建名称空间的所有名字都包含在__builtins__模块中,该模块又包含__buitin__模块,该模块中包含内建函数、异常以及其他属性,每一个python程序执行之前都会先导入__builtins__模块,每个模块都有自己的名称空间,导入一个模块时,会加载执行模块的全局名称空间,这也是为什么在加载一个模块时,所有顶级作用域下的代码会直接执行。

名称空间和作用域的关系:所有局部名称空间的名称都在局部作用范围内,局部名称空间之外的所有名称都在全局作用范围内。局部名称空间和作用域会随着函数的调用而不断变化,但是全局名称空间是不变的。名称空间决定一个变量名字是否存在,而作用域决定一个变量名字是否可以被访问到。通过globals()、locals()内建函数可以判断出某一名字属于哪个名称空间。在访问一个属性的时候,会从局部名称空间、全局名称空间、内建名称空间中寻找该名字,如果都找不到则会返回一个NameError的错误,由于寻找时总是先去寻找局部名称空间,所以局部名称空间中如果有和全局名称空间中的变量重名,则会讲全局名称空间中的变量“覆盖”(其实是不会再被找到)。

内建函数

__import__()函数,实际上import语句调用的就是__import__()函数来完成工作,通过重写该函数,可以自定义导入算法,也可以使用md=__import__(‘module’) ,相当于 import module as ad。

globals()、locals() 返回全局名称空间和局部名称空间的字典,其键为名称空间中的名字。

reload()函数可以从新加载一个模块,顾名思义,会讲模块从新执行一次。

Python学习_09_模块的更多相关文章

  1. Python学习--Selenium模块

    1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台

  2. Python学习--Selenium模块学习(2)

    Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...

  3. Python学习---重点模块的学习【all】

    time     [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...

  4. Python学习之模块进程函数详解

    今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...

  5. python学习——常用模块

    在学习常用模块时我们应该知道模块和包是什么,关于模块和包会单独写一篇随笔,下面先来了解有关在python中的几个常用模块. 一.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文 ...

  6. Python学习之模块基础

    模块就是程序 编写以下简单代码 print('hello python') 并将py文件保存在c盘的python(假设新建)文件下,通过pycharm的Terminal 或者windom命令窗口调出p ...

  7. python学习之模块导入,操作邮件,redis

    python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...

  8. Python学习——struct模块的pack、unpack示例

    he struct module includes functions for converting between strings of bytes and native Python data t ...

  9. python学习day15 模块(重点)

    模块(重点) python2,与py3的区别 py2:range() 在内存中立即把所有的值都创建,xrange() 不会再内存中立即创建,而是在循环时边环边创建. py3:range() 不会再内存 ...

随机推荐

  1. POJ3191-The Moronic Cowmpouter

    The Moronic Cowmpouter Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4006   Accepted: ...

  2. PHP的AES加密类

    PHP的AES加密类 aes.php <?php /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  3. 关于VS2017,VS2015 中利用 EF使用Mysql 不显示数据源问题解决方案

    在win7,win10,vs2015,vs2017之间折腾了两天,死活就是调不出来Mysql数据源.真是活见鬼了. 直接说方案吧. 一,卸载你所安装过的mysql-connector-net.mysq ...

  4. 企业级LNMP架构搭建实例(基于Centos6.x)

    1.1 部署LNMP架构说明 1.1.1 LNMP架构内容 01.部署linux系统 02.部署nginx网站服务 03.部署mysql数据库服务 04.部署php动态解析服务 1.1.2 配置LNM ...

  5. javascript设计模式——代理模式

    前面的话 代理模式是为一个对象提供一个占位符,以便控制对它的访问. 代理模式是一种非常有意义的模式,在生活中可以找到很多代理模式的场景.比如,明星都有经纪人作为代理.如果想请明星来办一场商业演出,只能 ...

  6. linux系统下安装配置解压版的MySQL数据库

    一.解压文件到当前目录 命令:tar -zxvf mysql....tar.gz 二.移动解压完成的文件夹到目标目录并更名mysql 命令:mv mysql-版本号 /usr/local/mysql ...

  7. 【WF2017】Mission Improbable

    http://www.lydsy.com/JudgeOnline/problem.php?id=4950 对于俯视图很好解决,把所有不是0的位置拿到剩1就可以了. 对于正视图与侧视图,稍微想一下也能发 ...

  8. 使用python处理excle表格

    # -*- coding: utf-8 -*- import xlrd ########################### #通用功能,读取excel表格中所有数据 #返回一个包含所有单元格名和对 ...

  9. 编码中的setCharacterEncoding 理解<转自-fancychendong>

    1.pageEncoding="UTF-8"的作用是设置JSP编译成Servlet时使用的编码. 2.contentType="text/html;charset=UTF ...

  10. 基于Handler架构的录音程序

    近期我的app须要一个录音功能,于是搜到这篇文章 文章中录音线程与主线程间的通讯是通过内部类訪问外部类成员变量的方式来实现 while (isRecord == true) { //isRecord是 ...