函数模块
定义 模块(Module)是一系列函数、变量、类的组成 Python程序是由一系列模块文件组成,一个.py文件就是一个模块
功能:
提高代码重用率 需要用到某些函数,直接调用某个模块即可,无需重复编写 提高程序层次性 不同功能模块放入不同的模块,逻辑性和层次性提高 方便协作防止冲突 函数和变量在不同模块下可以有同样命名,但是不会冲突 这样多人协作时,即便命名冲突,也不会干扰
原理
模块创建 • 用代码编辑器编写代码并保存为py文件 • sublime • vim • 通过IDE编写模块 • #!/usr/bin/env python # -*- coding:UTF-8 -*- • x = 1 • def printx(): • 'it is a module!' • print x + 2 模块导入 • 语法 • import Module •
导入整个模块到内存 不覆盖本地命名空间 采用点号调用函数 Module.Func1 Module.Func2 Module.Func3 不会覆盖本地命名(变量/函数等) from Module import Func 导入模块某个函数到内存 直接调用此函数 Func1 会覆盖本地某个命名(若本地有) from Module import * 导入整个模块到内存 覆盖本地命名空间 直接调用此模块所有函数 Func1 Func2 Func3 会覆盖本地所有命名(若本地有) reload Module Python只会导入同一模块一次,若再次通过import或者from命令调用同一模块,也不会再次加载,而直接从内存寻找 通过reload关键词可以重新载入该模块(另外一种方式便是重启Python) 若脚本文件有变动,则需要通过reload重新载入 流程 搜索 模块路径 编译 编译成字节码.pyc 执行更快 运行 将模块定义的函数和类等导入运行 说明 一般导入一次之后,再import相同模块则不会再搜索、编译、运行 需要通过reload来实现重新导入 举例 >>> import math >>> math.sin(10) -0.5440211108893699
模块路径 搜索路径 程序运行目录 程序运行或安装目录 环境变量PYTHONPATH PYTHONPATH是设置包含Python程序文件的目录的列表,这些目录可以是用户定义的或平台特定的目录名 标准库模块目录 标准库模块目录存储Python内置的模块文件 Python会自动搜索标准库模块安装在此电脑上的那些目录 .pth文件 查看路径 sys.path python会将模块搜索的路径统一存储在sys模块中的path变量中 sys.path 包括程序运行路径、PYTHONPATH、标准库路径等,以列表方式存储 >>> import sys 导入sys模块 >>> sys.path 通过path函数查看标准库路径 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7','/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', ['/Applications/PyCharm.app/Contents/helpers/pydev', '/Applications/PyCharm.app/Contents/helpers/pydev', 配置路径 通过函数sys.path增加模块搜索路径 Windows >>> import sys >>> sys.path ['C:\\Program Files (x86)\\JetBrains\\PyCharm 4.5.3\\helpers\\pydev', 'C:\\Python35\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35\\lib', 'C:\\Python35', 'C:\\Python35\\lib\\site-packages', 'C:\\Users\\jaykingchen\\PycharmProjects\\PL'] >>> sys.path.append("C:\\PATH") >>> sys.path ['C:\\Program Files (x86)\\JetBrains\\PyCharm 4.5.3\\helpers\\pydev', 'C:\\Python35\\python35.zip', 'C:\\Python35\\DLLs', 'C:\\Python35\\lib', 'C:\\Python35', 'C:\\Python35\\lib\\site-packages', 'C:\\Users\\jaykingchen\\PycharmProjects\\PL', 'C:\\PATH'] >>> import MOD1 C盘路径下创建PATH文件夹并创建MOD1.py模块 print ('hello, world!') print ('Welcome to PINGINGLAB') hello, world! Welcome to PINGINGLAB Linux/Unix/Mac >>> import sys 导入sys模块 >>> sys.path 通过path函数查看标准库路径 >>> sys.path.append('/user/pinginglab/') 添加自定义搜索路径 >>> sys.path.append('/users/jaykingchen/MOD') ['/Applications/PyCharm.app/Contents/helpers/pydev', '/Applications/PyCharm.app/Contents/helpers/pydev', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7','/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', 通过环境变量PYTHONPATH增加模块搜索路径 Windows set PYTHONPATH=c:\python27\lib; Linux/Unix/Mac set PYTHONPATH=/usr/local/lib/python 通过文件.pth增加模块搜索路径 在site-packages添加一个路径文件,如sitepath.pth,文件中加入要增加模块所在的路径即可 Windows C:\python27\site-packages C:\Python30\Lib\sitepackages Linux/Unix/Mac /usr/local/lib/python3.0/site-packages /usr/local/lib/site-python /usr/lib/python2.7/site-packages /usr/local/lib/python2.7/dist-packages
模块互导 概述 模块和模块之间可以相互导入 举例 模块中导入内置模块 #!/usr/bin/env python # -*- coding:UTF-8 -*- import math x = 1 i = 10 def printx(): 'it is a module!' print x + 2 def printmsin(): print math.sin(i) 模块中导入自定义模块(已经有路径) #!/usr/bin/env python # -*- coding:UTF-8 -*- import M3 y = M3.x + M3.i def printy(): print y * y 模块中导入自定义模块(还没有添加路径) import sys sys.path.append('/users/jaykingchen/MOD') import M3 def printy(): print y * y y = M3.x + M3.i 拓展 if __name__ == '__main__': 原理 模块直接执行时,这个模块的名字为 __main___ 模块被导入时,这个模块的名字便是模块本身 所以,当模块直接执行时,这个判断条件成立,if语句后面的代码可以执行 当模块被导入时,这个判断不成立,if语句后面的代码不被执行 一般情况下,在模块里面的测试代码例如print等输出,我们可以放置在这个判断语句后面,这样其他人调用我们的模块时,则不会有额外的输出 举例 module3.py #!/usr/bin/env python # -*- coding:UTF-8 -*- import math x = 3 i = 10 def printx(): 'The Module3!' print x + 2 def printsin(): print math.sin(i) if __name__ == '__main__': 当其他模块调用此模块时,以下代码不执行 print printx() print printsin() module4.py #!/usr/bin/env python # -*- coding:UTF-8 -*- import module3 y = module3.x + module3.i def printy(): print y * y print printy() 最终结果 169
来源:oschina
链接:https://my.oschina.net/u/4442211/blog/3211417