Python学习_09_模块
模块
模块是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_模块的更多相关文章
- Python学习--Selenium模块
1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台
- Python学习--Selenium模块学习(2)
Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...
- Python学习---重点模块的学习【all】
time [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...
- Python学习之模块进程函数详解
今天在看<Beginning Linux Programming>中的进程相关部分,讲到Linux几个进程相关的系统函数: system , exec , fork ,wait . Pyt ...
- python学习——常用模块
在学习常用模块时我们应该知道模块和包是什么,关于模块和包会单独写一篇随笔,下面先来了解有关在python中的几个常用模块. 一.什么是模块 常见的场景:一个模块就是一个包含了python定义和声明的文 ...
- Python学习之模块基础
模块就是程序 编写以下简单代码 print('hello python') 并将py文件保存在c盘的python(假设新建)文件下,通过pycharm的Terminal 或者windom命令窗口调出p ...
- python学习之模块导入,操作邮件,redis
python基础学习06 模块导入 导入模块的顺序 1.先从当前目录下找 2.当前目录下找不到,再从环境变量中找,如果在同时在当前目录和环境变量中建立相同的py文件,优先使用当前目录下的 导入模块的实 ...
- Python学习——struct模块的pack、unpack示例
he struct module includes functions for converting between strings of bytes and native Python data t ...
- python学习day15 模块(重点)
模块(重点) python2,与py3的区别 py2:range() 在内存中立即把所有的值都创建,xrange() 不会再内存中立即创建,而是在循环时边环边创建. py3:range() 不会再内存 ...
随机推荐
- CCF-201312-2-ISBN号码
问题描述 试题编号: 201312-2 试题名称: ISBN号码 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包 ...
- SQL Server学习之路(八):扩展SQL语句
0.目录 1.问题描述 2.第一种方法 通过GROUP BY子句解决 3.第二种方法 通过聚合函数解决 4.第三种方法 在select...from...中的from后面嵌套一个表 5.第四种方法 在 ...
- tomcat8权限分离
安装jdk tar xf jdk-8u121-linux-x64.tar.gz mv jdk-* /usr/local/jdk1.8 vi /etc/profile export JAVA_HOME ...
- 【JDK1.8】JDK1.8集合源码阅读——ArrayList
一.前言 在前面几篇,我们已经学习了常见了Map,下面开始阅读实现Collection接口的常见的实现类.在有了之前源码的铺垫之后,我们后面的阅读之路将会变得简单很多,因为很多Collection的结 ...
- 命令行保存指定目录文件的名字(可包含文件夹文字)到txt文本文件
Microsoft Visual Studio中配置OpenCV解决方案属性的时候, 需要将OpenCV的lib扩展名的库文件添加到属性的依赖列表里面,网上的有些人博客里面直接给出的会有问题(但大多数 ...
- tensorflow 自定义损失函数示例
这个自定义损失函数的背景:(一般回归用的损失函数是MSE, 但要看实际遇到的情况而有所改变) 我们现在想要做一个回归,来预估某个商品的销量,现在我们知道,一件商品的成本是1元,售价是10元. 如果我们 ...
- C++ - 复制容器(container)的元素至还有一个容器
复制容器(container)的元素至还有一个容器 本文地址: http://blog.csdn.net/caroline_wendy C++复制容器(container)元素, 能够使用标准库(ST ...
- 如何做更好的Android驱动project师
随着智能手机的飞跃发展,特别是Android智能机的爆炸性发展,Android驱动project师是越来越受欢迎的一个职位,并且是一个非常值得人期待的职位,由于可能你參与研发的一款手机就能改变 ...
- 有关怎样入门ACM
想给大家看看 所以就弄了原创了,造成作者困扰请联系在下. 来源: 吴垠的日志 一些题外话 首先就是我为什么要写这么一篇日志.原因非常easy,就是由于前几天有个想起步做ACM人非常诚恳的问我该怎样 ...
- python 创建列表和向列表添加元素方法
今天的学习内容是python中的列表的相关内容. 一.创建列表 1.创建一个普通列表 >>> tabulation1 = ['大圣','天蓬','卷帘'] >>> ...