统一说明:非常遗憾,图片无法上传,请移步到CSDN博客(Mark学编程)或者微信公众号(Mark学编程)或者QQ加群(Mark学编程)参考。没有办法,只能这样给人一广告之嫌了。
模块
你已经看到,你如何通过定义函数,在程序中重复使用代码,如果你需要重复使用,来自你自己写的其他程序中的若干函数,怎么办?你可能猜到了,答案是模块。
有若干撰写模块的方法,简单的方法就是创建一个扩展名为 .py的文件。文件中有函数和有变量。
另一个方法则是,用Python源语言写代码,比如,你可以用C程序语言来写模块,当编译时,他们可以被用于Python代码,当你使用标准Python编译器时。
一个模块可以被另一个程序导入(import),使用其功能。这也是我们使用Python标准库的方法。首先,我们看看如何使用标准库模块。
例子:
自行测试运行,这里故意不显示结果
代码运行原理
首先,我们使用import语句导入sys模块。基本上,这表示我们告诉Python我们要使用这个模块。sys模块包含的功能与Python的编译器和环境有关,比如系统。
当Python执行import sys语句时,它寻找sys模块,在这个例子中,它是内置模块,所以Python知道到那里找。
(其中一段,译者跳过翻译,感觉对初学者muddy the water)
代码里argv变量是sys模块中的,这里用了点记号来访问,sys.argv; 清楚的表明这个名字是sys的一部分。另一个好处是这样名字就不会和程序中其他argv相碰撞。
sys.argv变量是字符串列表(列表会在今后的章节详细解释)。具体的,它包含命令行实际参数列表。也就是说,用命令行传递给程序的实际参数。
(其他略,作者这此写了好多,感觉暂时无用,请参考原版)
Byte-compiled.pyc 文件
略
From…import 语句
如果你想直接导入argv变量到你的程序中(防止每次写下sys.),那么你可以用 from sys import argv 语句。
(这个有利有弊,作者建议不要使用from…import, 因为容易碰车,并且使用带点的代码更清晰。)
举例:
from math import sqrt
print(“Square rootof 16 is”, sqrt(16))
模块的 name
每个模块都有自己的名字,模块中的语句能够发现他们模块的名称。这个特别是分方便,用于发现此模块是自己单独运行还是被导入的。正像以前提及的,当一个模块被初次导入后,它的代码被执行。根据模块是单独自己运行还是被导入另一个模块,我们可以利用这一点使模块的有不同的行为。这个可以利用模块的name属性达成。
举例:
if name == ‘main’: # 注意都是下双划线
print(‘This program is being run by itself’)
else:
print(‘I am being imported from another module’)
代码运行原理
每一个Python的模块都有定义的name。 如果这是’main’, 那就暗示模块是自己单独运行的,我们可以采取恰当行动。
制作自己的模块
创建自己的模块简单,你一直在这么做。这是因为每个Python程序也是一个模块。你仅仅需要确保文件有.py扩展名。下列例子应当使之清晰。
以下代码另存为 mymodule.py
Def sayHi():
Print(‘Hi, this is mymodule speaking.’)
version = ‘0.1’
上面是模块例子。你可以看到,和Python程序相比,模块并没有什么特别的东西。我们将在下面看到如何在Python的其他程序里使用这个模块。
记住,模块应当要么放在与导入模块策程序相同的目录下,要么放在sys.path列出的目录下。
例子
Import mymodule
Mymodule.sayHi()
print(‘Version’, mymodule.version)
代码运行原理
请注意,我们使用点连接符来访问模块的成员。Python很好的重复使用了同样的符号来让你感到呢Pythonic,我们也不需要不断学习新的东西。
请看下面的例子:
from mymodule import sayHi, version
sayHI()
print(‘Version, version’)
(还有一小段译者选择略去)
你可以这样:
From mymodule import *
这将导入所有公开的比如像sayHi这样的名字。但并不能导入带双下划线的,因为他们是带双下划线的(作者循环证明了,不管怎样,双下划线的不能通过上面的代码达到直接使用的目的。)
Python之禅
Python其中一个原则是:明确好过暗示,使用import this学习Python的规矩吧。
dir 函数
内置dir()返回对象定义的名称列表。如果对象是模块,这个列表包含函数,类和变量,这些都是在模块中定义。没有翻译完,译者吃不准到底如何翻译。
例子
请学着上面的代码练习一番。
代码工作原理
起初,我们看到dir 在导入 sys 模块上的用法。我们可以看到包括大量的属性列表。
接下来,我们使用dir函数但并没有给它传参,默认的,它返回了当前的模块列表。请留意,导入的模块也是他列表的一部分。
为了观察dir 的运作,我们定义了一个新的变量a, 给它赋值然后检查dir,我们注意到有个额外的值在那个列表了。我们使用del将变量/属性删掉,变化马上在dir函数的输出上有翻译。
对于del的一个注意,这个语句用于删除变量/名字, 然后语句运行, 在这个例子中del a, 你就不能访问变量a了。就像是它从来没有存在一样。
请注意,dir()函数在任何对象上都适用,举例运行 dir(str) 得到string类的属性。
还有一个vars()函数,它能给你属性和值,但并不对所以案例有效。
包
到此为止,你必定已经开始留意到有层次的组织你的程序了。变量一般在函数内,函数和全局变量一般在模块内。那么如何组织模块?那就是包入场的时候到了。
包就是一个模块们的文件夹,有一个特别的init.py文件,给Python标出这个文件夹是特别的,它包含Python模块。
让我们说,你需要创建一个叫做“world”的包,里面有子包名字为“asia”,”Africa”等的。这些子包包含像‘India’,‘Madagascar’等模块。
你应该像下面一样组织文件夹:
总结
就像函数是程序的部分重复使用,模块就是重复的程序使用。包则是另外一个等级式的组织模块(形式)。与Python一起的标准文库就是一个如此的一系列的包和模块。
我们已经学习了如何使用模块和创建自己的模块。
下一步,我们学习一些叫做数据结构的有趣的概念。