以.py为后缀
解释器会自动在一些目录下查找模块
但我们也可以自行指定一些目录
import sys
sys.path.append('/home/zk/桌面/chap10 自带电池/')
#把路径字符串加入(append)到sys.path中
#字符串中不能直接写成‘~/桌面/chap10 自带电池'
import hello
#我们已经在目录下写了一个模块hello.py
导入模块的时候,会在同一目录下会产生一个.pyc的文件
该文件是经过处理的,能使python能更加有效地处理的文件
稍后如果导入同一模块,纳闷导入的是.pyc而不是.py
除非.py文件改变,此时会产生新的.pyc
#如果再次导入这个模块,它的语句不会被重新调用
import hello
#看,不再打印出“hello, world!”了
为什么只导入一次呢?
试想,如果有两个模块A和B,
A模块里面导入了B模块,B模块又导入了A模块,
如果不限制导入次数,那不就陷入死循环了么?
#如果非要重新载入呢?我们可以借助reload函数(python3中已不存在这个函数)
hello = reload(hello)
hello
模块的重要之处在于保持了作用域,所以模块用于定义,而不用于打印之类的语句
通常定义的是类、函数、特殊的变量等
模块的作用:防止代码重用、增加测试代码
防止代码重用容易理解,下面说明以下测试代码
import hello2
hello2.test()
hello2.py内容
def hello():
print 'hello, world!'
def test():
hello()
if __name__ == '__main__':test()
这里的__name__变量的内容是告知当前运行的程序,如果是主程序那就是__main__,如果是模块那就是对应的模块名
有两种方法——放到指定目录下、给解释器指定路径
import sys, pprint
pprint.pprint(sys.path)
#这些搜索路径以字符串的形式保存在列表里,通过sys.path访问
#如果数据结构过大,不能一次打完,可以借助pprint模块的pprint函数更加智能的打印
#解释器搜索路径很多,我们一般是把模块存储到python/lib/site-packages目录中
为了组织好模块,我们可以将他们分组成包
模块所在目录加入一个__init__.py模块,即可将目录作为包目录,而该模块称为包代码
这样以来,目录下的所有模块就组成了一个包
假设我们创建了一个目录drawing,目录下有__init__.py、colors.py、shapes.py三个模块
#导入包
#——import 包
import drawing
#导入包内的某个模块——法1
#——import 包.模块
import drawing.colors
#导入包内的某个模块——法2
#——from 包 import 模块
from drawing import shapes
使用前模块必须被导入
dir(copy) #不导入模块会出错
import copy
dir(copy)
#函数内容有很多下划线开头的名字,这些名字约定俗成地不为外部使用而准备,所以我们不用关注他们(借助字符串的startswith方法)
[n for n in dir(copy) if not n.startswith('_')]
这个变量存在于模块中,以列表的形式告诉我们有哪些公共接口(pubilc interface)
当我们导入模块时,程序会查看这个变量,只将变量列出的内容导入
如果不设置这个变量,那么程序会导入所有不以下划线开头的全局名称
copy.__all__
help(copy.copy)
#通过函数的__doc__特性获取文档信息
print copy.copy.__doc__
更多参考信息,可以从http://python.org/doc/lib 获取
#查看源代码,通过检查模块的__file__属性获取模块的路径,然后用文本编辑器打开
print copy.__file__
#但是有部分模块是融入解释器的,不可阅读
#也有的模块是用C语言写成的