python学习笔记系列----(四)模块
这一章主要是叙述了python模块的概念以及包的概念,还有它们的使用;收获也是大大的。
提起python文件,经常会听到3个名词,python脚本,python模块,python包。脚本的概念是从python交互式命令行引用过来的,把在命令行内运行的代码段复制到一个文件里再运行,这个文件就可以称为一个脚本;脚本之间可能存在相同的函数等,为了一个脚本能使用另一个脚本里的函数等,这里的另一个脚本就可以称为一个模块,也就是说一个模块里的定义是可以被导入到别的模块或者主模块中使用的;python包是python管理模块命名空间的一种方式,类似python模块解决了不同模块之间的全局变量的重名,python包解决了多个模块组成的包时模块名的重名。
4.1 模块
模块是包含 Python 定义和声明的文件。文件名就是模块名加上.py 后缀。可以通过可以全局变量 __name__ 的值得到。每个模块都有自己的私有符号表(程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址。)。模块里的所有定义把这个表当成全局符号表。所以这个模块的使用者可以在这个模块内使用全局变量而不需要担心与用户的全局变量冲突。
4.1.1 模块的导入
模块的导入语句一般常规性的会放在一个模块的最开始部分;被导入的模块名就会被放置到使用该模块的模块的全局符号表内。
模块的导入有2种方法:
A:import modname.submodname。其中这种方式只能导入包,而且只有父包的包名会被放置到引入该模块的模块的全局符号内,也就是说通过这个方式导入了包,如果要使用包内的函数或者一些变量,需要进入父包,再进入父包内的符号表内,得到那些定义。
下面有2个例子:第一个例子,python的安装子目录下有一个pip包,下面有子包以及子模块等,接下来会以这个包为例进行说明:
>>> print dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> import pip
>>> print dir()
['__builtins__', '__doc__', '__name__', '__package__', 'pip']
>>> import pip.index
>>> print dir()
['__builtins__', '__doc__', '__name__', '__package__', 'pip']
>>> import pip.index.egg_info_matches
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named egg_info_matches
在使用import语句导入该模块后,当前的全局符号表内多了包名pip;待再次导入子模块,全局符号表并没有增加子模块的名字;用import语句企图导入子文件内的函数时,提示不存在这个模块。
例2是通过这类导入,如何使用包内各种定义的问题。因为导入后当前的全局符号表内,只有包名,所以要使用子模块的方法,必须通过.的方式,从包到子模块,再到具体的方法或者其他定义。
# Fibonacci numbers module def fib(n): # write Fibonacci series up to n
a, b = ,
while b < n:
print b,
a, b = b, a+b def fib2(n): # return Fibonacci series up to n
result = []
a, b = ,
while b < n:
result.append(b)
a, b = b, a+b
return result
>>> import fibo
>>> fibo.fib() >>> fibo.fib2()
[, , , , , , , , , , ]
B. from modname.submodname import subsubmodname or function
通过这个方法,可以直接导入一个包下的子模块,或者直接导入子模块下的函数。在例子中,企图在import语句后导入子文件的函数名,会提示存在语法错误。但是导入子文件或者函数是没问题的。
>>> print dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> from pip import index
>>> print dir()
['__builtins__', '__doc__', '__name__', '__package__', 'index']
>>> from pip import index.egg_info_matches
File "<stdin>", line
from pip import index.egg_info_matches
^
SyntaxError: invalid syntax
>>> from pip.index import egg_info_matches
>>> print dir()
['__builtins__', '__doc__', '__name__', '__package__', 'egg_info_matches', 'inde
x']
如果使用from pip import index语句,要调用index内函数时,使用index.egg_info_matches进行调用。
如果使用from pip.index import egg_info_matches语句,要调用index内egg_info_matches函数时,直接使用egg_info_matches即可,但是如果企图调用该模块内的其他函数,会报错。
4.1.2 dir()函数
dir()是内置函数里的一个,是用来列出模块中定义了哪些名字,然后返回一个list字符串。里面包含变量名,模块名,函数名等等。使用help查看dir的使用,可以得到更多的小细节。
4.1.3 模块的搜索路径
导入一个模块时,python是怎么搜索这个模块的呢?首先,解析器会从内置模块内查找是否存在,如果不存在,就会从sys.path这个路径下进行搜索,这个路径包含以下三个部分:
A. 包含当前文件的文件夹
B. python配置的path下
C. python的默认安装目录下
脚本所在的目录被放置在搜索路径的最开始,也就是在标准库的路径之前。这意味着将会加载当前目录中的脚本,如果库目录中具有相同名称的模块则不会被加载。除非是有意想替换标准库,否则这应该被当成是一个错误。
python的sys.path是可以被修改的,但是其他文件运行时不会使用到该列表(或者执行完后再打印sys.path之前添加的目录就消失了)。
>>> import sys
>>> sys.path.append('/ufs/guido/lib/python')
4.1.4 标准模块
python 官网内有一个文档“Library Reference”是介绍标准模块的,标准模块里有一部分的模块是直接构建在解释器内,使用import后就能直接使用,常见的有以下几个:
4.2 包
包的基本概念在介绍模块的时候已经提及了,为了让python能识别一个目录是python包,需要在目录里增加__init__.py文件,这个文件可以是空的,可以对包进行初始化或者设置__all__
参数。
设置_all__参数的主要原因是:为包提供显式的索引。import 语句使用以下约定: 如果包中的 __init__.py 代码定义了一个名为__all__的列表,那么在遇 到 from package import *语句的时候,应该把这个列表中的所有模块名字导入。当包有新版本包发布时,就需要包的作者更新这个列表了。如果包的作者认为不可以用 import * 方式导入它们的包,也可以决定不支持它。如果 __all__ 没有定义,From a Package Importing * 语句 不会从包中导入所有的子模块到当前命名空间;它只保证包已经被导入。(在pip的该文件内未找到_all__参数的赋值,但是导入的时候却能全部导入;自己测试的时候,不给_all__参数赋值,确实又只能导入包。暂时还未解,可能做了另一种等效的赋值)
导入模块或者方法时,还有一种方法:From a Package Importing * ,对PIP包进行尝试结果如下:
>>> print dir()
['__builtins__', '__doc__', '__name__', '__package__']
>>> from pip import *
>>> print dir()
['CommandError', 'ConfigOptionParser', 'FrozenRequirement', 'InsecureRequestWarning', 'InstallationError', 'PipError', 'UpdatingDefaultsHelpFormatter', '__builtins__', '__doc__', '__name__', '__package__', 'absolute_import', 'autocomplete', 'basecommand', 'baseparser', 'bazaar', 'check_isolated', 'cmdoptions', 'commands', 'commands_dict', 'compat', 'create_main_parser', 'deprecation', 'dist_is_editable', 'download', 'exceptions', 'get_installed_distributions', 'get_prog', 'get_similar_commands', 'get_summaries', 'git', 'index', 'locale', 'locations', 'logger', 'logging', 'main', 'mercurial', 'models', 'operations', 'optparse', 'os', 'parseopts', 'pep425tags', 'pip', 're', 'req', 'status_codes', 'subversion', 'sys', 'utils', 'vcs', 'warnings', 'wheel']
结果PIP下所有的子包和子模块全部都导进来了。
python学习笔记系列----(四)模块的更多相关文章
- Python学习笔记(四)函数式编程
高阶函数(Higher-order function) Input: 1 abs Output: 1 <function abs> Input: 1 abs(-10) Output: 1 ...
- Python学习笔记(四)
Python学习笔记(四) 作业讲解 编码和解码 1. 作业讲解 重复代码瘦身 # 定义地图 nav = {'省略'} # 现在所处的层 current_layer = nav # 记录你去过的地方 ...
- python学习笔记(四)random 、json模块
一.模块简介 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 导入模块 import module #导入模块 f ...
- Python基础笔记系列四:工具的安装与配置
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 一开始是没有打算写工具这篇的,后来发现在某些情况下会遇到一些奇怪的问题,这 ...
- python学习笔记系列----(一)python简介
一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定 ...
- [Python学习笔记][第四章Python字符串]
2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...
- Python学习笔记系列
1.小甲鱼 python 学习系列笔记
- Python 学习笔记(6)--常用模块(2)
一.下载安装 下载安装有两种方式: yum\pip\apt-get 或者源码 下载源码 解压源码 进入目录 编译源码 python setup.py build 安装源码 python setup.p ...
- python学习笔记系列----(八)python常用的标准库
终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...
随机推荐
- ios 单例设计模式
单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类.单例可用性非常高,用于登录用户管理等可供全局调用. + (AccountMa ...
- SQL Server 2008 R2数据库镜像部署
概述 “数据库镜像”是一种针对数据库高可用性的基于软件的解决方案.其维护着一个数据库的两个相同的副本,这两个副本分别放置在不同的SQL Server数据库实例中.建议使用不同位置的两台服务器来承载.在 ...
- Java学习记录-Jdk包简单介绍
java.applet Java语言编写的一些小应用程序 java.awt AWT 是Abstract Window ToolKit (抽象窗口工具包)的缩写,这个工具包提供了一套与本地图形界面进行交 ...
- Java将文件转为字节数组
Java将文件转为字节数组 关键字:文件,文件流,字节流,字节数组,二进制 摘要:最近工作中碰到的需求是,利用http传输二进制数据到服务器对应接口,需要传输userId, file(加密后)等一系列 ...
- php_cz
post.php <?php require_once 'config.php'; $ddh=trim(htmlspecialchars($_POST['ddh'])); //支付宝交易号 $m ...
- Ant和Maven的作用是什么?两者之间功能、特点有哪些区别?
Ant和Maven都是基于Java的构建(build)工具.理论上来说,有些类似于(Unix)C中的make ,但没有make的缺陷. Ant是软件构建工具,Maven的定位是软件项目管理和理解工具. ...
- sublime work flow
Tools -> Developer -> New Snippet <snippet> <content><![CDATA[ }() { ${} } ]]&g ...
- Intellij IDEA如何使用Maven Tomcat Plugin运行web项目(转)
首先,Run --> Edit Configurations,这时候如下图: 然后点击左上角的加号,可以添加一个新的配置,如下图: 选择Maven,如下图: 下面填上自己的配置信息,点击appl ...
- 前端页面使用 Json对象与Json字符串之间的互相转换
前言 在前端页面很多时候都会用到Json这种格式的数据,最近没有前端,后端的我也要什么都要搞,对于Json对象与Json字符串之间的转换终于摸清楚了几种方式,归纳如下! 一:Json对象转换为json ...
- python爬虫学习-爬取某个网站上的所有图片
最近简单地看了下python爬虫的视频.便自己尝试写了下爬虫操作,计划的是把某一个网站上的美女图全给爬下来,不过经过计算,查不多有好几百G的样子,还是算了.就首先下载一点点先看看. 本次爬虫使用的是p ...