Python的标准安装包括一组模块,称为标准库。这里介绍模块的工作方式,学习如何使用它们。

一. 模块

1.1 用import从外部模块获取函数并为自己的程序所用:

>>> from math import sqrt
>>> import math

1.2 编写自己的模块

任何python程序都可以作为模块导入。程序保存的位置很重要。假设我们所写的程序叫hello.py被保存在c:/python目录下,可以执行以下的代码,告诉解释器在哪里寻找hello.py模块:

#hello.py
print "hello,world!" >>> import sys
>>> sys.path.append('c:/python')
>>> import hello
hello,world!

如上所见,在导入模块时,其中的代码被执行了。不过如果再次导入该模块,就什么都不会发生了。因为导入模块并不意味着在导入时执行某些操作,它们主要用于定义,只需要定义一次,导入模块一次和多次的效果是一样的。

1.3 模块用于定义

导入模块真正的用处在于保持自己的作用域,这意味着定义的所有类和函数以及赋值后的变量都成了模块的特性。

(1)我们可以在模块底下定义函数,然后像标准库那样导入它们。

(2)我们还可以在模块中增加测试代码来检查模块本身是否正常工作:

有2种办法加入测试代码:

第一种办法是“告知”模块本身是作为程序运行还是导入到其他程序:

#hello.py
def hello():
print 'hello:__name__' #A test:
hello() >>> __name__
'__main__'
>>> hello.__name__
'hello:__name__'

第二种办法是使用条件测试代码:

#hello.py
def hello():
print 'hello' #A test:
def test():
hello() if __name__ == '__main__':test()

这样如果将它作为程序运行,hello()函数会被执行,而作为模块导入时,它的行为就会像普通模块一样。

1.4 让模块可用

(1)把模块放在正确的位置:只需找出python解释器从哪里开始查找模块,然后将你自己的文件放置在那里即可。

>>> import sys
>>> print sys.path
['D:\\python', 'C:\\Python27\\Lib\\idlelib', 'C:\\Python27\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages']

以上目录都可以用来存放我们定义的文件,但是site-packages目录是最佳选择,因为它就是用来做这些事情的。

(2)告诉编译器哪里去找:编辑sys.path或者是在PYTHONPATH环境变量中包含模块所在目录

二. 包package

为了组织好模块,你可以把它们分组为包。当模块存储在文件.py中时,包就是模块所在的目录。

为了让python将其作为包对待,它必须包含一个名为__init__.py的文件。

如果要建立一个叫dd的包,其中包含aa和cc的模块,那么你就需要创建如下文件和目录:

1. D:/pythons
2. D:/pythons/dd
3. D:/python/sdd/__init__.py
4. D:/python/sdd/aa.py
5. D:/pythonsdd/cc.py

(以上假设D:/pythons已经被放置到PYTHONPATH中。)

import dd             # __init__中的内容可用,aa和cc模块不可用
import dd.aa #aa模块可用了,但只能使用全名dd.aa来使用
from dd import cc #cc模块可用了,可用通过短名cc来使用

三. 探究模块

学会如何探究模块是极有价值的技能。探究模块最直接的方式是在python解释器中研究它们。

3.1 模块中有什么 -- 比如copy标准模块

(1)使用dir函数

使用dir函数可以将对象的特性都列出,如下,我们可以使用列表推导式过滤掉一部分:

>>> import copy
>>> [n for n in dir(copy) if not n.startswith('_')]
['Error', 'PyStringMap', 'copy', 'deepcopy', 'dispatch_table', 'error', 'name', 't', 'weakref']
>>> [n for n in dir(copy) if n.startswith('__')]
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__']

(2)继续查看它的__all__

>>> copy.__all__
['Error', 'copy', 'deepcopy']

可见它定义了模块的公有借口,更准确地说,它告诉解释器:从模块导入所有名字代表什么含义。

如:from cpy import *意味着你只能使用__all__变量中的几个函数,如果要导入PyStringMap的话,就要这样做:

导入copy然后使用copy.PyStringMap;或者是使用from copy import PyStringMap

我们在编写模块的时候,像设置__all__这样的技术是相当有用的,因为一个模块中可能会有一大堆其他程序不需要或者不想要的变量,函数和类,__all__会把它们过滤出去。如果没有设定__all__,用import*会默认输出模块中所有不以下划线开头的全局名称。

3.2 用help函数获取帮助

help函数能够为你提供日常所需的信息:

>>> help(copy)
Help on module copy:
NAME
copy - Generic (shallow and deep) copying operations.
FILE
c:\python27\lib\copy.py
DESCRIPTION
Interface summary:
import copy
x = copy.copy(y) # make a shallow copy of y
x = copy.deepcopy(y) # make a deep copy of y
.......

3.3 文档--模块信息的自然来源

比如寻找range的文档描述:

>>> print range.__doc__
range(stop) -> list of integers
range(start, stop[, step]) -> list of integers Return a list containing an arithmetic progression of integers.
range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.
When step is given, it specifies the increment (or decrement).
For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!
These are exactly the valid indices for a list of 4 elements.

这样就获得了关于range函数的精确描述。但是要记住,并不是所有的模块和函数都有不错的文档字符串的,有时候要透彻理解模块和函数是如何工作的,最好参考Pyhton库:http:python.org/doc/lib

3.4 使用源代码

使用如下语句就可以查找到想要模块的源代码位置:

>>> print copy.__file__
C:\Python27\lib\copy.pyc

如果文件名以.pyc结尾,只要查看相应的以.py结尾的文件即可。

python学习笔记之九:模块和包的更多相关文章

  1. python学习笔记13(模块、包)

    在Python中有一个概念叫做模块(module),比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块. 模块文件以.py后缀结 ...

  2. python学习笔记五:模块和包

    一.模块用import导入 cal.py: #!/usr/bin/python def add(x,y): return x+y if __name__ == '__main__': print ad ...

  3. Python学习笔记(九)

    Python学习笔记(九): 装饰器(函数) 内置函数 1. 装饰器 1. 作用域 2. 高阶函数 3. 闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就 ...

  4. python学习笔记-(九)模块

    基础知识 1. 定义 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑----实现一个功能),本质就是.py结尾的python文件(文件名:test.py,对应的模块就是test) 包:用 ...

  5. python学习笔记之常用模块(第五天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  6. python学习笔记25(文件管理 os包)

    os包我们经常会与文件和目录打交道,对于这些操作python提供了一个os模块,里面包含了很多操作文件和目录的函数.如果你对linux基本操作了解的话,下面的一些os方法应该会很熟悉的,因为基本和li ...

  7. python学习第十三天 -模块和包

    模块和包 大家都知道,在计算机程序开发的过程中,随着程序代码越写越多,这样代码就会越不容易维护. 有时候为了好维护代码,把不同功能的函数放到不同的xx.py文件中. 在python中,一个.py文件就 ...

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

    一.模块.包 1.模块 模块实质上就是一个python文件.它是用来组织代码的,意思就是把python代码写到里面,文件名就是模块的名称,test.py test就是模块的名称 2.包 包,packa ...

  9. Python学习(十一) —— 模块和包

    一.模块 一个模块就是一个包含了python定义和声名的文件,文件名就是模块名加上.py后缀. import加载的模块分为四个通用类别: 1.使用python编写的代码(.py文件) 2.已被编译为共 ...

随机推荐

  1. ABAP 负号前置方法汇总

    ABAP 负号前置方法汇总 开发过程中有这样的一个需求,要求指定数字栏位负号前置: 方法一: PERFORM FRM_MOVE_DATA_MINUS CHANGING L_CHAR20. ” 负号前置 ...

  2. 积累的VC编程小技巧之视图

    1.如何得到视图指针 [问题提出]    现在你有一个多线程的Demo,你想在多线程里处理视图指针里的函数,我们给这个函数起个名字:Put();该如何实现呢?   //有两种方法可以实现你的要求:   ...

  3. MySQL 採用Xtrabackup对数据库进行全库备份

    1,xtrabackup简单介绍 关于数据库备份以及备份工具.參考:http://blog.itpub.net/26230597/viewspace-1460065/,这里来介绍xtrabackup已 ...

  4. mxGraph改变图形大小重置overlay位置

    要在改变图形大小的时候改变overlay的位置.那肯定就要对重置图形大小的方法进行改造了.以下是源文件里的代码 mxGraph.prototype.resizeCells = function(cel ...

  5. C++经典笔试题及参考答案-趋势科技

    1.static有什么用途?(请至少说明两种) 答案:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数 ...

  6. ACM-最小生成树之畅通project——hdu1863

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  7. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  8. nginx & flup & django & python3.x @ window7配置备忘录

    最近考虑原Prism建筑(非职业.半专业人士认为C/S建筑)至B/S迁移,主要是由于部署问题,包括两个因素:已经做,虽然一键安装和部署的一个因素,心存顾虑,虽然我一再声明这是一个绿色软件.还有一个因素 ...

  9. Java创建、重命名、删除文件和文件夹(转)

    Java的文件操作太基础,缺乏很多实用工具,比如对目录的操作,支持就非常的差了.如果你经常用Java操作文件或文件夹,你会觉得反复编写这些代码是令人沮丧的问题,而且要大量用到递归. 下面是的一个解决方 ...

  10. 极路由1s,固件需要刷入RipOS系统的加40块

    极路由1s,固件需要刷入RipOS系统的加40块,集成wifidog功能,wifi广告路由器的理想选择功能. 经过测试,无线性能稳定,无线可带32个手机客户端. 具体配置: 7620CPU ,主频58 ...