22
33#编写模块
44
5- 在本章之前,python还没有显示出太突出的优势 。本章开始,读者就会越来越感觉到python的强大了 。这种强大体现在“模块自信”上,因为python不仅有很强大的自有模块(称之为标准库 ),还有海量的第三方模块,任何人还都能自己开发模块,正是有了这么强大的“模块自信”,才体现了python的优势所在 。并且这种方式也正在不断被更多其它语言所借鉴。
5+ 在本章之前,Python还没有显示出太突出的优势 。本章开始,读者就会越来越感觉到Python的强大了 。这种强大体现在“模块自信”上,因为Python不仅有很强大的自有模块(或者包、库,比如为标准库 ),还有海量的第三方模块(或者包、库) ,任何人还都能自己开发模块(或者包、库) ,正是有了这么强大的“模块自信”,才体现了Python的优势所在 。并且这种方式也正在不断被更多其它语言所借鉴。
66
7- “模块自信”的本质是:开放 。
7+ “模块自信”的本质是:** 开放 ** 。
88
9- python不是一个封闭的体系 ,是一个开放系统。开放系统的最大好处就是避免了“熵增”。
9+ Python不是一个封闭的体系 ,是一个开放系统。开放系统的最大好处就是避免了“熵增”。
1010
11- > 熵的概念是由德国物理学家克劳修斯于1865年(这一年李鸿章建立了江南机械制造总局,美国废除奴隶制,林肯总统遇刺身亡,美国南北战争结束。)所提出。 是一种测量在动力学方面不能做功的能量总数,也就是当总体的熵增加,其做功能力也下降,熵的量度正是能量退化的指标。
11+ > 熵的概念是由德国物理学家克劳修斯于1865年(这一年李鸿章建立了江南机械制造总局,美国废除奴隶制,林肯总统遇刺身亡,美国南北战争结束。)所提出, 是一种测量在动力学方面不能做功的能量总数,也就是当总体的熵增加,其做功能力也下降,熵的量度正是能量退化的指标。
1212
1313> 熵亦被用于计算一个系统中的失序现象,也就是计算该系统混乱的程度。
1414
@@ -22,27 +22,29 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
2222 >>> math.pow(3,2)
2323 9.0
2424
25- 这里的math就是一个模块,用import引入这个模块,然后可以使用模块里面的函数,比如这个pow()函数。显然,这里我们是不需要自己动手写具体函数的,我们的任务就是拿过来使用。这就是模块的好处:拿过来就用,不用自己重写。
25+ 这里的math就是一个库,用import引入这个库,然后可以使用库里面的函数,比如这个pow()函数。显然,这里我们是不需要自己动手写具体函数的,我们的任务就是拿过来使用。这就是库的好处:拿过来就用,不用自己重写。
26+
27+ 请读者注意,到现在为止,我们看到了模块、库、包这些名词,并且在开发实践中,也会常常遇到。它们有区别吗?有!只不过,现在我们暂时不区分,就笼统地说,阅读下面的内容,就理解它们之间的区分了。
2628
2729##模块是程序
2830
29- 这个标题,一语道破了模块的本质,它就是一个扩展名为` .py ` 的python程序 。我们能够在应该使用它的时候将它引用过来,节省精力,不需要重写雷同的代码。
31+ 这个标题,一语道破了模块的本质,它就是一个扩展名为` .py ` 的Python程序 。我们能够在应该使用它的时候将它引用过来,节省精力,不需要重写雷同的代码。
3032
31- 但是,如果我自己写一个` .py ` 文件,是不是就能作为模块import过来呢?还不那么简单。必须得让python解释器能够找到你写的模块 。比如:在某个目录中,我写了这样一个文件:
33+ 但是,如果我自己写一个` .py ` 文件,是不是就能作为模块import过来呢?还不那么简单。必须得让Python解释器能够找到你写的模块 。比如:在某个目录中,我写了这样一个文件:
3234
3335 #!/usr/bin/env python
3436 # coding=utf-8
3537
3638 lang = "python"
3739
38- 并把它命名为pm.py,那么这个文件就可以作为一个模块被引入。不过由于这个模块是我自己写的,python解释器并不知道 ,我得先告诉它我写了这样一个文件。
40+ 并把它命名为pm.py,那么这个文件就可以作为一个模块被引入。不过由于这个模块是我自己写的,Python解释器并不知道 ,我得先告诉它我写了这样一个文件。
3941
4042 >>> import sys
4143 >>> sys.path.append("~/Documents/VBS/StartLearningPython/2code/pm.py")
4244
43- 用这种方式就是告诉python解释器 ,我写的那个文件在哪里。在这个告诉方法中,也用了一个模块 ` import sys ` ,不过由于sys模块是python被安装的时候就有的 ,所以不用特别告诉,python解释器就知道它在哪里了 。
45+ 用这种方式就是告诉Python解释器 ,我写的那个文件在哪里。在这个告诉方法中,也用了Python标准库中的sys,即 ` import sys ` ,不过由于sys是Python被安装的时候就有的 ,所以不用特别告诉,Python解释器就知道它在哪里了 。
4446
45- 上面那个一长串的地址,是ubuntu系统的地址格式 ,如果读者使用的windows系统,请写你所保存的文件路径。
47+ 上面那个一长串的地址,是Ubuntu系统的地址格式 ,如果读者使用的windows系统,请写你所保存的文件路径。
4648
4749 >>> import pm
4850 >>> pm.lang
@@ -55,19 +57,19 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
5557 File "<stdin>", line 1, in <module>
5658 AttributeError: 'module' object has no attribute 'xx'
5759
58- 请读者回到pm.py文件的存储目录,是不是多了一个扩展名是.pyc的文件?如果不是,你那个可能是外星人用的python 。
60+ 请读者回到pm.py文件的存储目录,是不是多了一个扩展名是.pyc的文件?如果不是,你那个可能是外星人用的Python 。
5961
60- > 解释器,英文是:interpreter,港台翻译为:直译器。在python中 ,它的作用就是将.py的文件转化为.pyc文件,而.pyc文件是由字节码(bytecode)构成的,然后计算机执行.pyc文件。关于这方面的详细解释,请参阅维基百科的词条:[ 直譯器] ( http://zh.wikipedia.org/zh/%E7%9B%B4%E8%AD%AF%E5%99%A8 )
62+ > 解释器,英文是:interpreter,港台翻译为:直译器。在Python中 ,它的作用就是将.py的文件转化为.pyc文件,而.pyc文件是由字节码(bytecode)构成的,然后计算机执行.pyc文件。关于这方面的详细解释,请参阅维基百科的词条:[ 直譯器] ( http://zh.wikipedia.org/zh/%E7%9B%B4%E8%AD%AF%E5%99%A8 )
6163
62- 不少人喜欢将这个世界简化简化再简化。比如人,就分为好人还坏人,比如编程语言就分为解释型和编译型,不但如此,还将两种类型的语言分别贴上运行效率高低的标签,解释型的运行速度就慢,编译型的就快。一般人都把python看成解释型的 ,于是就得出它运行速度慢的结论。不少人都因此上当受骗了,认为python不值得学 ,或者做不了什么“大事”。这就是将本来复杂的多样化的世界非得划分为“黑白”的结果。这种喜欢用“非此即彼”的思维方式考虑问题的现象可以说在现在很常见,比如一提到“日本人”,除了苍老师,都该杀,这基本上是小孩子的思维方法,可惜在某个过度内大行其道 。
64+ 不少人喜欢将这个世界简化简化再简化。比如人,就分为好人还坏人,比如编程语言就分为解释型和编译型,不但如此,还将两种类型的语言分别贴上运行效率高低的标签,解释型的运行速度就慢,编译型的就快。一般人都把Python看成解释型的 ,于是就得出它运行速度慢的结论。不少人都因此上当受骗了,认为Python不值得学 ,或者做不了什么“大事”。这就是将本来复杂的多样化的世界非得划分为“黑白”的结果。这种喜欢用“非此即彼”的思维方式考虑问题的现象可以说在现在很常见,比如一提到“日本人”,除了苍老师,都该杀,这基本上是小孩子的思维方法,可惜在某国大行其道 。
6365
64- 世界是复杂的,“敌人的敌人就是朋友”是幼稚的,“一分为二”是机械的。当然,苍老师是德艺双馨的。
66+ 世界是复杂的,“敌人的敌人就是朋友”是幼稚的,“一分为二”是机械的。当然,苍老师是德艺双馨的,无可辩驳、毋庸置疑 。
6567
66- 就如同刚才看到的那个.pyc文件一样,当python解释器读取了 .py文件,先将它变成由字节码组成的.pyc文件,然后这个.pyc文件交给一个叫做python虚拟机的东西去运行 (那些号称编译型的语言也是这个流程,不同的是它们先有一个明显的编译过程,编译好了之后再运行)。如果.py文件修改了,python解释器会重新编译 ,只是这个编译过程不是完全显示给你看的。
68+ 就如同刚才看到的那个.pyc文件一样,当Python解释器读取了 .py文件,先将它变成由字节码组成的.pyc文件,然后这个.pyc文件交给一个叫做Python虚拟机的东西去运行 (那些号称编译型的语言也是这个流程,不同的是它们先有一个明显的编译过程,编译好了之后再运行)。如果.py文件修改了,Python解释器会重新编译 ,只是这个编译过程不是完全显示给你看的。
6769
68- 我这里说的比较笼统,要深入了解python程序的执行过程 ,可以阅读这篇文章:[ 说说Python程序的执行过程] ( http://www.cnblogs.com/kym/archive/2012/05/14/2498728.html )
70+ 我这里说的比较笼统,要深入了解Python程序的执行过程 ,可以阅读这篇文章:[ 说说Python程序的执行过程] ( http://www.cnblogs.com/kym/archive/2012/05/14/2498728.html )
6971
70- 总之,有了.pyc文件后,每次运行,就不需要从新让解释器来编译.py文件了,除非.py文件修改了。这样,python运行的就是那个编译好了的 .pyc文件。
72+ 总之,有了.pyc文件后,每次运行,就不需要从新让解释器来编译.py文件了,除非.py文件修改了。这样,Python运行的就是那个编译好了的 .pyc文件。
7173
7274是否还记得,我们在前面写有关程序,然后执行,常常要用到` if __name__ == "__main__" ` 。那时我们写的.py文件是来执行的,这时我们同样写了.py文件,是作为模块引入的。这就得深入探究一下,同样是.py文件,它是怎么知道是被当做程序执行还是被当做模块引入?
7375
@@ -115,7 +117,7 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
115117
116118##模块的位置
117119
118- 为了让我们自己写的模块能够被python解释器知道 ,需要用` sys.path.append("~/Documents/VBS/StarterLearningPython/2code/pm.py") ` 。其实,在python中 ,所有模块都被加入到了sys.path里面了。用下面的方法可以看到模块所在位置:
120+ 为了让我们自己写的模块能够被Python解释器知道 ,需要用` sys.path.append("~/Documents/VBS/StarterLearningPython/2code/pm.py") ` 。其实,在Python中 ,所有模块都被加入到了sys.path里面了。用下面的方法可以看到模块所在位置:
119121
120122 >>> import sys
121123 >>> import pprint
@@ -155,13 +157,13 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
155157
156158##PYTHONPATH环境变量
157159
158- 将模块文件放到指定位置是一种不错的方法。当程序员都喜欢自由,能不能放到别处呢?当然能,用` sys.path.append() ` 就是不管把文件放哪里,都可以把其位置告诉python解释器 。但是,这种方法不是很常用。因为它也有麻烦的地方,比如在交互模式下,如果关闭了,然后再开启,还得从新告知。
160+ 将模块文件放到指定位置是一种不错的方法。当程序员都喜欢自由,能不能放到别处呢?当然能,用` sys.path.append() ` 就是不管把文件放哪里,都可以把其位置告诉Python解释器 。但是,这种方法不是很常用。因为它也有麻烦的地方,比如在交互模式下,如果关闭了,然后再开启,还得从新告知。
159161
160162比较常用的告知方法是设置PYTHONPATH环境变量。
161163
162164> 环境变量,不同操作系统的设置方法略有差异。读者可以根据自己的操作系统,到网上搜索设置方法。
163165
164- 我以ubuntu为例,建立一个python的目录 ,然后将我自己写的.py文件放到这里,并设置环境变量。
166+ 我以Ubuntu为例,建立一个Python的目录 ,然后将我自己写的.py文件放到这里,并设置环境变量。
165167
166168 :~$ mkdir python
167169 :~$ cd python
@@ -186,6 +188,12 @@ python不是一个封闭的体系,是一个开放系统。开放系统的最
186188
187189如此,就完成了告知过程。
188190
191+ ##模块中的'__ all__ '
192+
193+ 上面的模块虽然比较简单,但是已经显示了编写模块和在程序中导入模块的基本方式。在实践中,所编写的模块也许更复杂一点,比如,我写了这么一个模块,并把其文件命名为21901.py
194+ http://python.jobbole.com/81187/
195+
196+
189197##` __init__.py ` 方法
190198
191199` __init__.py ` 是一个空文件,将它放在某个目录中,就可以将该目录中的其它.py文件作为模块被引用。这个具体应用参见[ 用tornado做网站(2)] ( ./304.md )
0 commit comments