这一章主要是叙述了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学习笔记系列----(四)模块的更多相关文章

  1. Python学习笔记(四)函数式编程

    高阶函数(Higher-order function) Input: 1 abs Output: 1 <function abs> Input: 1 abs(-10) Output: 1 ...

  2. Python学习笔记(四)

    Python学习笔记(四) 作业讲解 编码和解码 1. 作业讲解 重复代码瘦身 # 定义地图 nav = {'省略'} # 现在所处的层 current_layer = nav # 记录你去过的地方 ...

  3. python学习笔记(四)random 、json模块

    一.模块简介 Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句. 导入模块 import module #导入模块 f ...

  4. Python基础笔记系列四:工具的安装与配置

    本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 一开始是没有打算写工具这篇的,后来发现在某些情况下会遇到一些奇怪的问题,这 ...

  5. python学习笔记系列----(一)python简介

    一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定 ...

  6. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  7. Python学习笔记系列

    1.小甲鱼 python 学习系列笔记

  8. Python 学习笔记(6)--常用模块(2)

    一.下载安装 下载安装有两种方式: yum\pip\apt-get 或者源码 下载源码 解压源码 进入目录 编译源码 python setup.py build 安装源码 python setup.p ...

  9. python学习笔记系列----(八)python常用的标准库

    终于学到了python手册的最后一部分:常用标准库.这部分内容主要就是介绍了一些基础的常用的基础库,可以大概了解下,在以后真正使用的时候也能想起来再拿出来用. 8.1 操作系统接口模块:OS OS模块 ...

随机推荐

  1. CSS笔记2

    1.     CSS基础选择器 html负责结构 ,css负责样式,js负责行为 css写在head标签里面,容器style标签 <style type="text/css" ...

  2. MySQL:索引工作原理

    索引查找:通过索引键找到索引的叶子节点,再通过叶子节点的标记快速找到表中对应的行数据,再返回指定的列 索引找查是通过索引键定先位到一块局部区域,再开始扫描匹配的数据的. 为什么需要索引(Why is ...

  3. MySQL查询语句(select)详解(1)

    1.查询记录 select*from 表名 [where 条件];eg:select*from students;//查询 students 表中所有记录,所有字段的值都显示出来select fiel ...

  4. python UnicodeDecodeError: 'ascii' codec can't decode byte 0xa6 in position 907: ordinal not in range(128)

    import sysreload(sys)sys.setdefaultencoding('utf-8')

  5. Oracle 树操作(select…start with…connect by…prior)

    摘自:http://www.cnblogs.com/linjiqin/archive/2013/06/24/3152674.html oracle树查询的最重要的就是select…start with ...

  6. USACO 2014 FEB 银组

    1.自动打字{Silver题1} [问题描述] 贝西新买了手机,打字不方便,请设计一款应用,帮助她快速发消息. 字典里有W(W<=30000)个小写字母构成的单词,所有单词的字符总数量不超过1, ...

  7. tjkd-html

    <div class="result-item"> <div class="kd-item"> <div class=" ...

  8. Oracle数据库基础知识1

    DDL语句 1.表的创建 CREATE TABLE table_name(); 例如: CREATE TABLE USER_E( id NUMBER (5), name VARCHAR(20), ge ...

  9. SQL JOIN\SQL INNER JOIN 关键字\SQL LEFT JOIN 关键字\SQL RIGHT JOIN 关键字\SQL FULL JOIN 关键字

    SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表 ...

  10. ElasticSearch 自定义排序处理

    使用function_score进行分组处理,利用分组函数script_score进行自定义分值处理, 注意:使用script功能需要在配置中打开脚本功能: script.inline: on   s ...