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模块 ...
随机推荐
- CSS笔记1
一. 列表 列表是有三种形式 1.1 无序列表 无序列表,用来表示一个列表语义,并且每个项目与项目之间是不分先后顺序的 ul 的英文unordered list "无序列表" ...
- ajax pagination 布局刷新
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...
- Strom的配置安装
1.准备环境 1.1配置列表 配置项 版本信息 OS Red Hat Enterprise Linux Server release 5.5 (Tikanga) IP 192.168.1.191/ ...
- JS创建缩略图
<script language="javascript"> //显示缩略图 function DrawImage(ImgD,width_s,height_s){ /* ...
- [转]SQL Server 存储过程 一些常用用法(事物、异常捕捉、循环)
最新更新请访问: http://denghejun.github.io Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中 ...
- 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决
Maven Jetty 插件的问题(css/js等目录死锁,不能自动刷新)的解决: 1. 打开下面的目录:C:\Users\用户名\.m2\repository\org\eclipse\jetty ...
- 百钱买百鸡问题 php版本
/* * 百钱买百鸡问题 * * 我国古代数学家张丘建在<算经>一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五:鸡母一,值钱三:鸡雏三,值钱一:百钱买百鸡,则翁.母 ...
- visual stdio 2015安装配置及原理
安装与配置: 1.先配置好IIS,再安装visual stdio,主要原因系统会自注册.net Framework,若顺序不正确,则需手动注册,步骤: a. IIS可承载的Web核心 b. IIS6 ...
- 关于sed用法
sed处理流程 sed的处理流程,简化后是这样的: 1.读入新的一行内容到缓存空间: 2.从指定的操作指令中取出第一条指令,判断是否匹配pattern: 3.如果不匹配,则忽略后续的编辑命令,回到第2 ...
- vs2015启动网站调试提示 HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容。 解决方法
今天安装了vs2015 下载一个项目进行试用,启动调试的时候提示 HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容. 最可能的原因: 没有为请求的 URL ...