你已经了解了如何在你的程序中通过定义一次函数工作来重用代码。那么如果你 想在你所编写的别的程序中重用一些函数的话,应该怎么办?正如你可能想象到的那样,答 案是模块(Modules)
编写模块有很多种方法,其中最简单的一种便是创建一个包含函数与变量、以 .py 为后缀的 文件
from…import 语句
import 语句允许在当前运行的程序文件中使用模块中的代码。通过将函数存储在独立的文件中,可隐藏程序代码的细节,将重点放在程序的高层逻辑上。这还能让你在众多不同的程序中重用函数。
**将函数存储在独立文件中后,可与其他程 序员共享这些文件而不是整个程序。**知道如何导入函数还能让你使用其他程序员编写的函数库。
案例
from math import sqrt
print("16开平方是", sqrt(16))
输出
16开平方是 4.0
模块的 name
每个模块都有一个名称,而模块中的语句可以找到它们所处的模块的名称。这对于确定模块 是独立运行的还是被导入进来运行的这一特定目的来说大为有用。正如先前所提到的,当模 块第一次被导入时,它所包含的代码将被执行。
我们可以通过这一特性来使模块以不同的方 式运行,这取决于它是为自己所用还是从其它模块中导入而来。这可以通过使用模块的 name 属性来实现。
案例 (保存为 module_using_name.py ):
if __name__ == '__main__':
print('这个程序是自己运行的')
else:
print('我是从其他模块导入的')
输出:
这个程序是自己运行的
在python控制台导入
import module_using_name
# 输出:我是从其他模块导入的
它是如何工作的
每一个 Python 模块都定义了它的 name 属性。如果它与 main 属性相同则代表这一 模块是由用户独立运行的,因此我们便可以采取适当的行动。
编写你自己的模块
编写你自己的模块很简单,这其实就是你一直在做的事情!这是因为每一个 Python 程序同时 也是一个模块。你只需要保证它以 .py 为扩展名即可。下面的案例会作出清晰的解释。
案例(保存为 mymodule.py ):
def say_hi():
print('Hi, mymodule 正在说话.')
__version__ = '0.1'
要记住该模块应该放置于与其它我们即将导入这一模块的程序相同的目录下,
另一个模块(保存为 mymodule_demo.py ):
import mymodule
mymodule.say_hi()
print('Version', mymodule.__version__)
输出
Hi, mymodule 正在说话.
它是如何工作的
你会注意到我们使用相同的点符来访问模块中的成员。Python 很好地重用了其中的符号,这 充满了“Pythonic”式的气息,这使得我们可以不必学习新的方式来完成同样的事情。
下面是一个使用 from…import 语法的范本(保存为 mymodule_demo2.py ):
from mymodule import say_hi, __version__
say_hi()
print('Version', __version__)
mymodule_demo2.py 所输出的内容与 mymodule_demo.py 所输出的内容是一样的
在这里需要注意的是,如果导入到 mymodule 中的模块里已经存在了 version 这一名 称,那将产生冲突。
这可能是因为每个模块通常都会使用这一名称来声明它们各自的版本 号。因此,我们大都推荐最好去使用 import 语句,尽管这会使你的程序变得稍微长一些。
你还可以使用:
from mymodule import
这将导入诸如 say_hi 等所有公共名称,但不会导入 version 名称,因为后者以双下划 线开头。
> 警告:要记住你应该避免使用 from mymodule import * 这种形式
>
> Python 的一大指导原则是“明了胜过晦涩”这样的话你都不知道函数是在哪定义,哪儿导入的
包
现在,你必须开始遵守用以组织你的程序的层次结构。变量通常位于函数内部,函数与全局 变量通常位于模块内部。
如果你希望组织起这些模块的话,应该怎么办?这便是包 (Packages)应当登场的时刻。
包是指一个包含模块与一个特殊的 init.py 文件的文件夹,后者向 Python 表明这一文 件夹是特别的,因为其包含了 Python 模块。
具备一定功能的工具 | 包含很多工具、功能强大的工具箱 |
python中的模块 | python中的包(模块包/程序包) |
考虑一个在 package_my 目录下的 **demo1.py、demo2.py、init.py **文件,test.py 为测试调用包的代码,目录结构如下:
test.py
package_my/demo1.py
def runfun1():
print "我在demo1.py"
package_my/demo2.py
def runfun2():
print "我在demo2.py"
package_my/init.py
if __name__ == '__main__':
print '作为主程序运行'
else:
print 'package_my 初始化'
test.py
from package_my.demo1 import runfun1
from package_my.demo2 import runfun2
结果
package_my 初始化
总结
如同函数是程序中的可重用部分那般,模块是一种可重用的程序。包是用以组织模块的另一 种层次结构。Python 所附带的标准库就是这样一组有关包与模块
我们已经了解了如何使用这些模块并创建你自己的模块。