2
2
3
3
#标准库(2)
4
4
5
- python标准库内容非常多,有人专门为此写过一本书。在本教程中,由于我的原因,不会将标准库进行完整的详细介绍,但是,我根据自己的理解和喜好 ,选几个呈现出来,一来显示标准库之强大功能,二来演示如何理解和使用标准库。
5
+ python标准库内容非常多,有人专门为此写过一本书。在本教程中,我将根据自己的理解和喜好 ,选几个呈现出来,一来显示标准库之强大功能,二来演示如何理解和使用标准库。
6
6
7
7
##sys
8
8
9
- 这是一个跟python解释器关系密切的标准库,上一节中我们使用过 ` sys.path.append() ` 。
9
+ 这是一个跟Python解释器关系密切的标准库,前面已经使用过 ` sys.path.append() ` 。
10
10
11
11
>>> import sys
12
12
>>> print sys.__doc__
13
13
14
- 显示了sys的基本文档,看第一句话,概括了本模块的基本特点 。
14
+ 显示了 ` sys ` 的基本文档,第一句话概括了本模块的基本特点 。
15
15
16
16
This module provides access to some objects used or maintained by the
17
17
interpreter and to functions that interact strongly with the interpreter.
18
18
19
- 在诸多sys函数和变量中 ,选择常用的(应该说是我觉得常用的)来说明。
19
+ 在诸多 ` sys ` 函数和属性中 ,选择常用的(应该说是我觉得常用的)来说明。
20
20
21
21
###sys.argv
22
22
23
- sys.argv是变量,专门用来向python解释器传递参数,所以名曰 “命令行参数”。
23
+ sys.argv是专门用来向python解释器传递参数,名曰 “命令行参数”。
24
24
25
25
先解释什么是命令行参数。
26
26
@@ -48,18 +48,18 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
48
48
49
49
只选择了部分内容摆在这里。所看到的如` -B, -h ` 之流,都是参数,比如` python -h ` ,其功能同上。那么` -h ` 也是命令行参数。
50
50
51
- ` sys.arg ` 在python中的作用就是这样 。通过它可以向解释器传递命令行参数。比如:
51
+ ` sys.arg ` 在Python中的作用就是这样 。通过它可以向解释器传递命令行参数。比如:
52
52
53
53
#!/usr/bin/env python
54
54
# coding=utf-8
55
55
56
56
import sys
57
57
58
- print "The file name: ", sys.argv[0]
58
+ print "The file name: ", sys.argv[0] #Python 3的读者,请自行修改为print()函数形式,下同,从略
59
59
print "The number of argument", len(sys.argv)
60
60
print "The argument is: ", str(sys.argv)
61
61
62
- 将上述代码保存,文件名是22101.py(这名称取的,多么数字化) 。然后如此做:
62
+ 将上述代码保存,文件名是22101.py。然后如此做:
63
63
64
64
$ python 22101.py
65
65
The file name: 22101.py
@@ -71,18 +71,18 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
71
71
- 在` $ python 22101.py ` 中,“22101.py”是要运行的文件名,同时也是命令行参数,是前面的` python ` 这个指令的参数。其地位与` python -h ` 中的参数` -h ` 是等同的。
72
72
- sys.argv[ 0] 是第一个参数,就是上面提到的` 22101.py ` ,即文件名。
73
73
74
- 如果我们这样来试试,看看结果 :
74
+ 如果这样来试试 :
75
75
76
76
$ python 22101.py beginner master www.itdiffer.com
77
77
The file name: 22101.py
78
78
The number of argument 4
79
79
The argument is: ['22101.py', 'beginner', 'master', 'www.itdiffer.com']
80
80
81
- 如果在这里,用 ` sys.arg[1] ` 得到的就是` beginner ` ,依次类推。
81
+ 在这里用 ` sys.arg[1] ` 得到的就是` beginner ` ,依次类推。
82
82
83
83
###sys.exit()
84
84
85
- 这是一个方法,意思是退出当前的程序 。
85
+ 这个方法的意思是退出当前程序 。
86
86
87
87
Help on built-in function exit in module sys:
88
88
@@ -95,7 +95,7 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
95
95
If it is another kind of object, it will be printed and the system
96
96
exit status will be one (i.e., failure).
97
97
98
- 从文档信息中可知,如果用` sys.exit() ` 退出程序,会返回SystemExit异常 。这里先告知读者,还有另外一退出方式,是` os._exit() ` ,这两个有所区别。后者会在后面介绍 。
98
+ 从文档信息中可知,如果用` sys.exit() ` 退出程序,会返回 ` SystemExit ` 异常 。这里先告知读者,还有另外一退出方式,是` os._exit() ` ,这两个有所区别。
99
99
100
100
#!/usr/bin/env python
101
101
# coding=utf-8
@@ -106,7 +106,7 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
106
106
if i == 5:
107
107
sys.exit()
108
108
else:
109
- print i
109
+ print i #Python 3: print(i)
110
110
111
111
这段程序的运行结果就是:
112
112
@@ -117,36 +117,40 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
117
117
3
118
118
4
119
119
120
- 需要提醒读者注意的是,在函数中,用到return,这个的含义是终止当前的函数,并返回相应值(如果有, 如果没有就是None)。但是sys .exit()的含义是退出当前程序,并发起SystemExit异常 。这就是两者的区别了。
120
+ 在大多数函数中会用到return,其含义是终止当前的函数,并向调用函数的位置返回相应值( 如果没有就是None)。但是 ` sys .exit()` 的含义是退出当前程序——不仅仅是函数,并发起 ` SystemExit ` 异常 。这就是两者的区别了。
121
121
122
- 如果使用` sys.exit(0) ` 表示正常退出。如果读者要测试,需要在某个地方退出的时候有一个有意义的提示 ,可以用` sys.exit("I wet out at here.") ` ,那么字符串信息就被打印出来。
122
+ 如果使用` sys.exit(0) ` 表示正常退出。若需要在退出的时候有一个对人友好的提示 ,可以用` sys.exit("I wet out at here.") ` ,那么字符串信息就被打印出来。
123
123
124
124
###sys.path
125
125
126
- ` sys.path ` 已经不陌生了,前面用过。 它可以查找模块所在的目录,以列表的形式显示出来。如果用` append() ` 方法,就能够向这个列表增加新的模块目录。如前所演示。不在赘述。不理解的读者可以往前复习 。
126
+ ` sys.path ` 已经不陌生了,它可以查找模块所在的目录,以列表的形式显示出来。如果用` append() ` 方法,就能够向这个列表增加新的模块目录。如前所演示。不在赘述。
127
127
128
- ###sys.stdin, sys. stdout, sys.stderr
128
+ ###sys.stdout
129
129
130
- 这三个放到一起,因为他们的变量都是类文件流对象,分别表示标准UNIX概念中的标准输入、标准输出和标准错误。与python功能对照,sys.stdin获得输入(用raw_input()输入的通过它获得,python3.x中是imput()),sys.stdout负责输出了。
130
+ ` sys.stdin ` ,` sys.stdout ` ,` sys.stderr ` 这三个有相似之处,它们所实现的都是类文件流,分别表示标准UNIX概念中的标准输入、标准输出和标准错误。
131
+
132
+ 与Python中的函数功能对照,` sys.stdin ` 获得输入(等价于Python 2中的raw_input(),Python 3中的input()),` sys.stdout ` 负责输出。
131
133
132
134
> 流是程序输入或输出的一个连续的字节序列,设备(例如鼠标、键盘、磁盘、屏幕、调制解调器和打印机)的输入和输出都是用流来处理的。程序在任何时候都可以使用它们。一般来讲,stdin(输入)并不一定来自键盘,stdout(输出)也并不一定显示在屏幕上,它们都可以重定向到磁盘文件或其它设备上。
133
135
134
- 还记得 ` print() ` 吧,在这个学习过程中,用的很多。它的本质就是 ` sys.stdout.write(object + '\n') ` 。
136
+ 此处仅就 ` sys.stdout ` 做一个简要说明 。
135
137
136
138
>>> for i in range(3):
137
- ... print i
139
+ ... print i #Python 3: print(i)
138
140
...
139
141
0
140
142
1
141
143
2
142
144
145
+ ` print ` 语句或者函数,你一定很熟悉,此前用的很多。并且,特别说明,在默认情况下,不管是语句还是函数,最后都是有` \n ` 换行的。这种输入,本质上是用` sys.stdout.write(object + '\n') ` 实现。
146
+
143
147
>>> import sys
144
148
>>> for i in range(3):
145
149
... sys.stdout.write(str(i))
146
150
...
147
151
012>>>
148
152
149
- 造成上面输出结果在表象上如此差异,原因就是那个 ` '\n' ` 的有无 。
153
+ 跟前面的不同,是因为没有加上那个 ` \n ` 。
150
154
151
155
>>> for i in range(3):
152
156
... sys.stdout.write(str(i) + '\n')
@@ -155,42 +159,40 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
155
159
1
156
160
2
157
161
158
- 从这看出,两者是完全等效的。如果仅仅止于此,意义不大。关键是通过sys.stdout能够做到将输出内容从 “控制台”转到“文件”,称之为重定向。这样也许控制台看不到(很多时候这个不重要),但是文件中已经有了输出内容。比如:
162
+ 从这看出,两者是完全等效的。如果仅仅止于此,意义不大。关键是通过 ` sys.stdout ` 能够做到将输出内容从 “控制台”转到“文件”,称之为重定向。这样也许控制台看不到(很多时候这个不重要),但是文件中已经有了输出内容。比如:
159
163
160
164
>>> f = open("stdout.md", "w")
161
165
>>> sys.stdout = f
162
- >>> print "Learn Python: From Beginner to Master"
166
+ >>> print "Learn Python: From Beginner to Master" #Python 3: print("Learn Python: From Beginner to Master")
163
167
>>> f.close()
164
168
165
- 当` sys.stdout = f ` 之后,就意味着将输出目的地转到了打开(建立)的文件中,如果使用print() ,即将内容输出到这个文件中,在控制台并无显现。
169
+ 当` sys.stdout = f ` 之后,就意味着将输出目的地转到了打开(建立)的文件中,如果使用 ` print ` ,即将内容输出到这个文件中,在控制台并无显现。
166
170
167
171
打开文件看看便知:
168
172
169
173
$ cat stdout.md
170
174
Learn Python: From Beginner to Master
171
175
172
- 这是标准输出。另外两个,输入和错误,也类似。读者可以自行测试。
173
-
174
- 关于对文件的操作,虽然前面这这里都涉及到一些。但是,远远不足,后面我会专门讲授对某些特殊但常用的文件读写操作。
175
-
176
+ 以上,对标准库中的` sys ` 有了粗浅的了解。更详细内容,请读者运用本书已经反复使用的` dir() ` 、` help() ` 去探究,当然还有Google。
177
+
176
178
##copy
177
179
178
- 在 [ 《字典(2)》 ] ( ./117.md ) 中曾经对copy做了讲授 ,这里再次提出,即是复习,又是凑数,以显得我考虑到了这个常用模块,还有:
180
+ 前面对浅拷贝和深拷贝做了研究 ,这里再次提出,温故知新。
179
181
180
182
>>> import copy
181
183
>>> copy.__all__
182
184
['Error', 'copy', 'deepcopy']
183
185
184
186
这个模块中常用的就是copy和deepcopy。
185
187
186
- 为了具体说明,看这样一个例子:
188
+ 为了具体说明,看这样一个例子,这个例子跟以前讨论浅拷贝和深拷贝略有不同,请读者认真推敲结果,并对照代码。
187
189
188
190
#!/usr/bin/env python
189
191
# coding=utf-8
190
192
191
193
import copy
192
194
193
- class MyCopy(object):
195
+ class MyCopy(object): #Python 3: class MyCopy:
194
196
def __init__(self, value):
195
197
self.value = value
196
198
@@ -208,7 +210,9 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
208
210
a.append("abc")
209
211
foo.value = 17
210
212
211
- print "original: %r\n slice: %r\n list(): %r\n copy(): %r\n deepcopy(): %r\n" % (a,b,c,d,e)
213
+ print "original: {0}\n slice: {1}\n list(): {2}\n copy(): {3}\n deepcopy(): {4}\n".forrmat(a,b,c,d,e)
214
+ #Python 3:
215
+ #print("original: {0}\n slice: {1}\n list(): {2}\n copy(): {3}\n deepcopy(): {4}\n".format(a,b,c,d,e))
212
216
213
217
保存并运行:
214
218
@@ -219,7 +223,7 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
219
223
copy(): ['foo', 17]
220
224
deepcopy(): ['foo', 7]
221
225
222
- 读者可以对照结果和程序,就能理解各种拷贝的实现方法和含义了 。
226
+ 尽在不言中,请读者认真对邵上面的显示结果,体会深拷贝和浅拷贝 。
223
227
224
228
------
225
229
0 commit comments