|
2 | 2 |
|
3 | 3 | #标准库(1)
|
4 | 4 |
|
5 |
| -“python自带‘电池’”,听说过这种说法吗? |
| 5 | +“Python自带‘电池’”,听说过这种说法吗? |
6 | 6 |
|
7 |
| -在python被安装的时候,就有不少模块也随着安装到本地的计算机上了。这些东西就如同“能源”、“电力”一样,让python拥有了无限生机,能够非常轻而易举地免费使用很多模块。所以,称之为“自带电池”。 |
| 7 | +在Python被安装的时候,就有不少模块也随着安装到本地的计算机上了。这些东西就如同“能源”、“电力”一样,让Python拥有了无限生机,能够非常轻而易举地免费使用很多模块。所以,称之为“自带电池”。 |
8 | 8 |
|
9 |
| -它们被称为“标准库”。 |
| 9 | +那些在安装Python时就默认已经安装好的模块被统称为“标准库”。 |
10 | 10 |
|
11 |
| -熟悉标准库,是进行编程的必须。 |
| 11 | +熟悉标准库编程之必须。 |
12 | 12 |
|
13 | 13 | ##引用的方式
|
14 | 14 |
|
15 |
| -不仅是标准库的模块,所有模块都服从下述引用方式。 |
16 |
| - |
17 |
| -最基本的、也是最常用的,还是可读性非常好的: |
| 15 | +所有模块都服从下述引用方式,是最基本的、也是最常用的,还是可读性非常好的: |
18 | 16 |
|
19 | 17 | import modulename
|
20 | 18 |
|
|
28 | 26 | 'lang': 'python',
|
29 | 27 | 'teacher': 'qiwsir'}
|
30 | 28 |
|
31 |
| -在对模块进行说明的过程中,我以标准库pprint为例。以`pprint.pprint()`的方式应用了一种方法,这种方法能够让dict格式化输出。看看结果,是不是比原来更容易阅读了你? |
| 29 | +在对模块进行说明的过程中,以标准库pprint为例。 |
| 30 | + |
| 31 | +以`pprint.pprint()`的方式使用模块中的一种方法,这种方法能够让字典格式化输出。看看结果是不是比原来更容易阅读了呢? |
32 | 32 |
|
33 |
| -在import后面,理论上可以跟好多模块名称。但是在实践中,我还是建议大家一次一个名称吧。这样简单明了,容易阅读。 |
| 33 | +在`import`后面,理论上可以跟好多模块名称。但是在实践中,我还是建议大家一次一个名称,太多了看着头晕眼花,不容易阅读。 |
34 | 34 |
|
35 |
| -这是用`import pprint`样式引入模块,并以`.`点号的形式引用其方法。 |
| 35 | +这是用`import pprint`样式引入模块,并以`.`点号(英文半角)的形式引用其方法。 |
36 | 36 |
|
37 |
| -还可以: |
| 37 | +还有下面的方式: |
38 | 38 |
|
39 | 39 | >>> from pprint import pprint
|
40 | 40 |
|
41 |
| -意思是从`pprint`模块中之将`pprint()`引入,然后就可以这样来应用它: |
| 41 | +意思是从`pprint`模块中之将`pprint()`引入,之后就可以直接使用它了。 |
42 | 42 |
|
43 | 43 | >>> pprint(a)
|
44 | 44 | {'book': 'www.itdiffer.com',
|
|
50 | 50 |
|
51 | 51 | >>> from pprint import *
|
52 | 52 |
|
53 |
| -这就将pprint模块中的一切都引入了,于是可以像上面那样直接使用每个函数。但是,这样造成的结果是可读性不是很好,并且,有用没用的都拿过来,是不是太贪婪了?贪婪的结果是内存就消耗了不少。所以,这种方法,可以用于常用并且模块属性或方法不是很多的情况。 |
| 53 | +这就将pprint模块中的一切都引入了,于是可以像上面那样直接使用模块中的所有可用的内容。但是,这样造成的结果是可读性不是很好,并且,不管是不是在程序中用上,都拿过来,是不是太贪婪了?贪婪的结果是消耗内存。所以,这种方法,可以用于常用的并且模块属性或方法不是很多的情况。莫贪婪。 |
54 | 54 |
|
55 |
| -诚然,如果很明确使用那几个,那么使用类似`from modulename import name1, name2, name3...`也未尝不可。一再提醒的是不能因为引入了模块东西而降低了可读性,让别人不知道呈现在眼前的方法是从何而来。如果这样,就要慎用这种方法。 |
| 55 | +诚然,如果很明确使用模块中的哪些方法或属性,那么使用类似`from modulename import name1, name2, name3...`也未尝不可。需要再次提醒的是不能因为引入了模块而降低了可读性,让别人不知道呈现在眼前的方法是从何而来。 |
56 | 56 |
|
57 | 57 | 有时候引入的模块或者方法名称有点长,可以给它重命名。如:
|
58 | 58 |
|
|
72 | 72 | 'lang': 'python',
|
73 | 73 | 'teacher': 'qiwsir'}
|
74 | 74 |
|
75 |
| -但是不管怎么样,一定要让人看懂,过了若干时间,自己也还能看懂。记住:“软件很多时候是给人看的,只是偶尔让机器执行”。 |
| 75 | +但是不管怎么样,一定要让人看懂,且要过了若干时间,自己也还能看懂。记住:“软件很多时候是给人看的,只是偶尔让机器执行”。 |
76 | 76 |
|
77 | 77 | ##深入探究
|
78 | 78 |
|
79 |
| -继续以pprint为例,深入研究: |
| 79 | +继续以`pprint`为例,深入研究: |
80 | 80 |
|
81 | 81 | >>> import pprint
|
82 | 82 | >>> dir(pprint)
|
83 | 83 | ['PrettyPrinter', '_StringIO', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_commajoin', '_id', '_len', '_perfcheck', '_recursion', '_safe_repr', '_sorted', '_sys', '_type', 'isreadable', 'isrecursive', 'pformat', 'pprint', 'saferepr', 'warnings']
|
84 | 84 |
|
85 |
| -对dir()并不陌生。从结果中可以看到pprint的属性和方法。其中有不少是双划线、电话线开头的。为了不影响我们的视觉,先把它们去掉。 |
| 85 | +对`dir()`并不陌生。从结果中可以看到`pprint`的属性和方法。其中有有的是双划线、单划线开头的。为了不影响我们的视觉,先把它们去掉。 |
86 | 86 |
|
87 | 87 | >>> [ m for m in dir(pprint) if not m.startswith('_') ]
|
88 | 88 | ['PrettyPrinter', 'isreadable', 'isrecursive', 'pformat', 'pprint', 'saferepr', 'warnings']
|
89 | 89 |
|
90 |
| -对这几个,为了能够搞清楚它们的含义,可以使用`help()`,比如: |
| 90 | +针对这几个,为了能够搞清楚它们的含义,可以使用`help()`,比如: |
91 | 91 |
|
92 | 92 | >>> help(isreadable)
|
93 | 93 | Traceback (most recent call last):
|
|
98 | 98 |
|
99 | 99 | >>> help(pprint.isreadable)
|
100 | 100 |
|
101 |
| -别忘记了,我前面是用`import pprint`方式引入模块的。 |
| 101 | +前面是用`import pprint`方式引入模块的。 |
102 | 102 |
|
103 | 103 | Help on function isreadable in module pprint:
|
104 | 104 |
|
|
109 | 109 |
|
110 | 110 | 注意的是`pprint.PrettyPrinter`是一个类,后面的是函数(方法)。
|
111 | 111 |
|
112 |
| -在回头看看`dir(pprint)`的结果,关注一个: |
| 112 | +再回头看看`dir(pprint)`的结果: |
113 | 113 |
|
114 | 114 | >>> pprint.__all__
|
115 | 115 | ['pprint', 'pformat', 'isreadable', 'isrecursive', 'saferepr', 'PrettyPrinter']
|
116 | 116 |
|
117 | 117 | 这个结果是不是眼熟?除了"warnings",跟前面通过列表解析式得到的结果一样。
|
118 | 118 |
|
119 |
| -其实,当我们使用`from pprint import *`的时候,就是将`__all__`里面的方法引入,如果没有这个,就会将其它所有属性、方法等引入,包括那些以双划线或者单划线开头的变量、函数,这些东西事实上很少被在引入模块时使用。 |
| 119 | +其实,当我们使用`from pprint import *`的时候,就是将`__all__`里面的方法引入,如果没有这个,就会将其它所有属性、方法等引入,包括那些以双划线或者单划线开头的变量、函数,事实上这些东西很少在引入模块时被使用。 |
120 | 120 |
|
121 | 121 | ##帮助、文档和源码
|
122 | 122 |
|
123 |
| -不知道读者是否能够记住看过的上述内容?反正我记不住。所以,我非常喜欢使用dir()和help(),这也是本教程从开始到现在,乃至到以后,总在提倡的方式。 |
| 123 | +你能记住每个模块的属性和方法吗?比如前面刚刚查询过的`pprint`模块中的属性和方法,现在能背诵出来吗?我的记忆力不行,都记不住。所以,我非常喜欢使用`dir()`和`help()`,这也是本书从开始到现在,乃至到以后,总在提倡的方式。 |
124 | 124 |
|
125 | 125 | >>> print pprint.__doc__
|
126 | 126 | Support to pretty-print lists, tuples, & dictionaries recursively.
|
|
149 | 149 |
|
150 | 150 | `pprint.__doc__`是查看整个类的文档,还知道整个文档是写在什么地方的吗?
|
151 | 151 |
|
152 |
| -关于文档的问题,曾经在[《类(5)》](./210.md)、[《自省》](./130.md)中有介绍。但是,现在出现的是模块文档。 |
153 |
| - |
154 | 152 | 还是使用pm.py那个文件,增加如下内容:
|
155 | 153 |
|
156 | 154 | #!/usr/bin/env python
|
|
163 | 161 | def lang():
|
164 | 162 | ... #省略了,后面的也省略了
|
165 | 163 |
|
166 |
| -在这个文件的开始部分,所有类和方法、以及import之前,写一个用三个引号包括的字符串。那就是文档。 |
| 164 | +在这个文件的开始部分,所有类、方法和`import`之前,写一个用三个引号包括的字符串,这就是文档。 |
167 | 165 |
|
168 | 166 | >>> import sys
|
169 | 167 | >>> sys.path.append("~/Documents/VBS/StarterLearningPython/2code")
|
170 | 168 | >>> import pm
|
171 |
| - >>> print pm.__doc__ |
| 169 | + >>> print pm.__doc__ #Python 3: print(pm.__doc__) |
172 | 170 |
|
173 | 171 | This is a document of the python module.
|
174 | 172 |
|
175 |
| -这就是撰写模块文档的方法,即在.py文件的最开始写相应的内容。这个要求应该成为开发习惯。 |
| 173 | +这就是撰写模块文档的方法,即在`.py`文件的最开始写相应的内容。这个要求应该成为开发者的习惯。 |
176 | 174 |
|
177 |
| -python的模块,不仅可以看帮助信息和文档,还能够查看源码,因为它是开放的。 |
| 175 | +对于Python的标准库和第三方模块,不仅可以看帮助信息和文档,还能够查看源码,因为它是开放的。 |
178 | 176 |
|
179 |
| -还是回头到`dir(pprint)`中找一找,有一个`__file__`,它就告诉我们这个模块的位置: |
| 177 | +还是回头到`dir(pprint)`中找一找,有一个`__file__`属性,它就告诉我们这个模块的位置: |
180 | 178 |
|
181 |
| - >>> print pprint.__file__ |
| 179 | + >>> print pprint.__file__ #Python 3: print(pprint.__file__) |
182 | 180 | /usr/lib/python2.7/pprint.pyc
|
183 | 181 |
|
184 |
| -我是在ubuntu中为例,读者要注意观察自己的操作系统结果。 |
| 182 | +我是在Ubuntu中为例,读者要注意观察自己的操作系统结果。 |
185 | 183 |
|
186 |
| -虽然是.pyc文件,但是不用担心,根据现实的目录,找到相应的.py文件即可。 |
| 184 | +虽然是`.pyc文件,但是不用担心,根据显示的目录,找到相应的.py文件即可。 |
187 | 185 |
|
188 | 186 | $ ls /usr/lib/python2.7/pp*
|
189 | 187 | /usr/lib/python2.7/pprint.py /usr/lib/python2.7/pprint.pyc
|
@@ -216,7 +214,9 @@ python的模块,不仅可以看帮助信息和文档,还能够查看源码
|
216 | 214 |
|
217 | 215 | 我只查抄了文档中的部分信息,是不是跟前面通过`__doc__`查看的结果一样一样的呢?
|
218 | 216 |
|
219 |
| -请读者在闲暇时间,阅读以下源码。事实证明,这种标准库中的源码是质量最好的。 |
| 217 | +请读者在闲暇时间阅读源码。 |
| 218 | + |
| 219 | +事实证明,这种标准库中的源码是质量最好的。阅读高质量的代码,是提高编程水平的途径之一。 |
220 | 220 |
|
221 | 221 | ------
|
222 | 222 |
|
|
0 commit comments