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 = 0, 1
    while b < n:
        print b,
        a, b = b, a+b

def fib2(n):   # return Fibonacci series up to n
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result
>>> import fibo
>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

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 1
    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下所有的子包和子模块全部都导进来了。

时间: 2024-10-08 10:28:56

python学习笔记系列----(四)模块的相关文章

Python学习笔记-安装MySQLdb模块

模块下载地址: MySQL-python 1.2.3 for Windows and Python 2.7, 32bit and 64bit versions http://www.codegood.com/archives/129 直接点击安装exe即可,如果缺少dll文件,可以百度下载相关dll文件. Python学习笔记-安装MySQLdb模块

python 学习_第四模块 并发编程(多线程)

python 学习_第四模块 并发编程(多线程) 1  开启线程方式 from threading import Thread import time def say(name): time.sleep(2) print("%s hello"%name) if __name__ =="__main__": t = Thread(target=say,args=("alex",)) t.start() print("主线程")

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

本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 一开始是没有打算写工具这篇的,后来发现在某些情况下会遇到一些奇怪的问题,这里记录一下. 环境基础我是用的是windows 10操作系统python版本:python2.7  地址-->https://www.python.org/downloads/ Sublime Text3:地址-->https://www.sublimetext.com/ 安装python的坑:直

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

一个月前,就按下决心要系统的学习下python了,虽然之前有学习过java,学习过c++,也能较为熟练的使用java做自动化测试看懂c++里的业务逻辑,但是实际上有那么多的东西自己还是不清楚,今天下定决心,开始了python的系统的学习之路,之前我是有看过廖学峰的教程的,看完收获确实也是少,但总感觉就是少了什么,后面想了下,我想应该是自己的学习方法~~~介于之前学习RF的经验,我认为看官方文档对于一个想系统学习python的人来说,真的是一个不能再好的学习方法,接下来我会开始坚持把python2

Python学习笔记__5章 模块

# 这是学习廖雪峰老师python教程的学习笔记 1.概览 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,在Python中,一个.py文件就称之为一个模块(Module) 1.1.使用模块的好处 提高了代码的可维护性 当一个模块编写完毕,就可以被其他地方引用 避免函数名和变量名冲突.相同名字的函数和变量可以分别存在不同的模块中 1.2.python组织模块的方法 为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Pack

Python学习笔记整理(四)Python中的字符串..

字符串是一个有序的字符集合,用于存储和表现基于文本的信息. 常见的字符串常量和表达式 T1=‘’ 空字符串 T2="diege's" 双引号 T3="""...""" 三重引号块 T4=r'\temp\diege' Raw字符串 抑制(取消)转义,完全打印\tmp\diege,而没有制表符 T5=u’diege' Unicode字符串 T1+T2     合并 T1*3    重复 T2[i]    索引 T2[i:j] 分片

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

一.下载安装 下载安装有两种方式: yum\pip\apt-get 或者源码 下载源码 解压源码 进入目录 编译源码 python setup.py build 安装源码 python setup.py install 注:在使用源码安装时,需要使用到gcc编译和python开发环境,所以,需要先执行: yum install gcc python-devel 安装成功后,模块会自动安装到 sys.path 中的某个目录中,如: /usr/lib/python2.7/site-packages/

python学习笔记(六):常用模块

一.模块.包 什么是模块? 模块实质上就是一个python文件,它是用来组织代码的,意思就是说把python代码写到里面,文件名就是模块的名称,test.py test就是模块名称. 什么是包? 包,package本质就是一个文件夹,和文件夹不一样的是它有一个__init__.py文件,包是从逻辑上来组织模块的,也就是说它是用来存放模块的,如果你想导入其他目录下的模块,那么这个目录必须是一个包才可以导入. 导入模块 1 2 3 4 5 import module #导入模块 from modul

Python学习笔记十_模块、第三方模块安装、模块导入

一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,package本质就是一个文件夹,和文件夹不一样的是它有一个__init__.py文件.包是从逻辑上来组织模块的,也就是说它是用来存放模块的,如果想到如其他目录下的模块,那么这个目录必须是一个包才可以导入. 二.模块分类 1.标准模块.标准包 python自带的这些模块,直接import就能用的 import