22
33#标准库(2)
44
5- python标准库内容非常多,有人专门为此写过一本书。在本教程中,由于我的原因,不会将标准库进行完整的详细介绍,但是,我根据自己的理解和喜好 ,选几个呈现出来,一来显示标准库之强大功能,二来演示如何理解和使用标准库。
5+ python标准库内容非常多,有人专门为此写过一本书。在本教程中,我将根据自己的理解和喜好 ,选几个呈现出来,一来显示标准库之强大功能,二来演示如何理解和使用标准库。
66
77##sys
88
9- 这是一个跟python解释器关系密切的标准库,上一节中我们使用过 ` sys.path.append() ` 。
9+ 这是一个跟Python解释器关系密切的标准库,前面已经使用过 ` sys.path.append() ` 。
1010
1111 >>> import sys
1212 >>> print sys.__doc__
1313
14- 显示了sys的基本文档,看第一句话,概括了本模块的基本特点 。
14+ 显示了 ` sys ` 的基本文档,第一句话概括了本模块的基本特点 。
1515
1616 This module provides access to some objects used or maintained by the
1717 interpreter and to functions that interact strongly with the interpreter.
1818
19- 在诸多sys函数和变量中 ,选择常用的(应该说是我觉得常用的)来说明。
19+ 在诸多 ` sys ` 函数和属性中 ,选择常用的(应该说是我觉得常用的)来说明。
2020
2121###sys.argv
2222
23- sys.argv是变量,专门用来向python解释器传递参数,所以名曰 “命令行参数”。
23+ sys.argv是专门用来向python解释器传递参数,名曰 “命令行参数”。
2424
2525先解释什么是命令行参数。
2626
@@ -48,18 +48,18 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
4848
4949只选择了部分内容摆在这里。所看到的如` -B, -h ` 之流,都是参数,比如` python -h ` ,其功能同上。那么` -h ` 也是命令行参数。
5050
51- ` sys.arg ` 在python中的作用就是这样 。通过它可以向解释器传递命令行参数。比如:
51+ ` sys.arg ` 在Python中的作用就是这样 。通过它可以向解释器传递命令行参数。比如:
5252
5353 #!/usr/bin/env python
5454 # coding=utf-8
5555
5656 import sys
5757
58- print "The file name: ", sys.argv[0]
58+ print "The file name: ", sys.argv[0] #Python 3的读者,请自行修改为print()函数形式,下同,从略
5959 print "The number of argument", len(sys.argv)
6060 print "The argument is: ", str(sys.argv)
6161
62- 将上述代码保存,文件名是22101.py(这名称取的,多么数字化) 。然后如此做:
62+ 将上述代码保存,文件名是22101.py。然后如此做:
6363
6464 $ python 22101.py
6565 The file name: 22101.py
@@ -71,18 +71,18 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
7171- 在` $ python 22101.py ` 中,“22101.py”是要运行的文件名,同时也是命令行参数,是前面的` python ` 这个指令的参数。其地位与` python -h ` 中的参数` -h ` 是等同的。
7272- sys.argv[ 0] 是第一个参数,就是上面提到的` 22101.py ` ,即文件名。
7373
74- 如果我们这样来试试,看看结果 :
74+ 如果这样来试试 :
7575
7676 $ python 22101.py beginner master www.itdiffer.com
7777 The file name: 22101.py
7878 The number of argument 4
7979 The argument is: ['22101.py', 'beginner', 'master', 'www.itdiffer.com']
8080
81- 如果在这里,用 ` sys.arg[1] ` 得到的就是` beginner ` ,依次类推。
81+ 在这里用 ` sys.arg[1] ` 得到的就是` beginner ` ,依次类推。
8282
8383###sys.exit()
8484
85- 这是一个方法,意思是退出当前的程序 。
85+ 这个方法的意思是退出当前程序 。
8686
8787 Help on built-in function exit in module sys:
8888
@@ -95,7 +95,7 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
9595 If it is another kind of object, it will be printed and the system
9696 exit status will be one (i.e., failure).
9797
98- 从文档信息中可知,如果用` sys.exit() ` 退出程序,会返回SystemExit异常 。这里先告知读者,还有另外一退出方式,是` os._exit() ` ,这两个有所区别。后者会在后面介绍 。
98+ 从文档信息中可知,如果用` sys.exit() ` 退出程序,会返回 ` SystemExit ` 异常 。这里先告知读者,还有另外一退出方式,是` os._exit() ` ,这两个有所区别。
9999
100100 #!/usr/bin/env python
101101 # coding=utf-8
@@ -106,7 +106,7 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
106106 if i == 5:
107107 sys.exit()
108108 else:
109- print i
109+ print i #Python 3: print(i)
110110
111111这段程序的运行结果就是:
112112
@@ -117,36 +117,40 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
117117 3
118118 4
119119
120- 需要提醒读者注意的是,在函数中,用到return,这个的含义是终止当前的函数,并返回相应值(如果有, 如果没有就是None)。但是sys .exit()的含义是退出当前程序,并发起SystemExit异常 。这就是两者的区别了。
120+ 在大多数函数中会用到return,其含义是终止当前的函数,并向调用函数的位置返回相应值( 如果没有就是None)。但是 ` sys .exit()` 的含义是退出当前程序——不仅仅是函数,并发起 ` SystemExit ` 异常 。这就是两者的区别了。
121121
122- 如果使用` sys.exit(0) ` 表示正常退出。如果读者要测试,需要在某个地方退出的时候有一个有意义的提示 ,可以用` sys.exit("I wet out at here.") ` ,那么字符串信息就被打印出来。
122+ 如果使用` sys.exit(0) ` 表示正常退出。若需要在退出的时候有一个对人友好的提示 ,可以用` sys.exit("I wet out at here.") ` ,那么字符串信息就被打印出来。
123123
124124###sys.path
125125
126- ` sys.path ` 已经不陌生了,前面用过。 它可以查找模块所在的目录,以列表的形式显示出来。如果用` append() ` 方法,就能够向这个列表增加新的模块目录。如前所演示。不在赘述。不理解的读者可以往前复习 。
126+ ` sys.path ` 已经不陌生了,它可以查找模块所在的目录,以列表的形式显示出来。如果用` append() ` 方法,就能够向这个列表增加新的模块目录。如前所演示。不在赘述。
127127
128- ###sys.stdin, sys. stdout, sys.stderr
128+ ###sys.stdout
129129
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 ` 负责输出。
131133
132134> 流是程序输入或输出的一个连续的字节序列,设备(例如鼠标、键盘、磁盘、屏幕、调制解调器和打印机)的输入和输出都是用流来处理的。程序在任何时候都可以使用它们。一般来讲,stdin(输入)并不一定来自键盘,stdout(输出)也并不一定显示在屏幕上,它们都可以重定向到磁盘文件或其它设备上。
133135
134- 还记得 ` print() ` 吧,在这个学习过程中,用的很多。它的本质就是 ` sys.stdout.write(object + '\n') ` 。
136+ 此处仅就 ` sys.stdout ` 做一个简要说明 。
135137
136138 >>> for i in range(3):
137- ... print i
139+ ... print i #Python 3: print(i)
138140 ...
139141 0
140142 1
141143 2
142144
145+ ` print ` 语句或者函数,你一定很熟悉,此前用的很多。并且,特别说明,在默认情况下,不管是语句还是函数,最后都是有` \n ` 换行的。这种输入,本质上是用` sys.stdout.write(object + '\n') ` 实现。
146+
143147 >>> import sys
144148 >>> for i in range(3):
145149 ... sys.stdout.write(str(i))
146150 ...
147151 012>>>
148152
149- 造成上面输出结果在表象上如此差异,原因就是那个 ` '\n' ` 的有无 。
153+ 跟前面的不同,是因为没有加上那个 ` \n ` 。
150154
151155 >>> for i in range(3):
152156 ... sys.stdout.write(str(i) + '\n')
@@ -155,42 +159,40 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
155159 1
156160 2
157161
158- 从这看出,两者是完全等效的。如果仅仅止于此,意义不大。关键是通过sys.stdout能够做到将输出内容从 “控制台”转到“文件”,称之为重定向。这样也许控制台看不到(很多时候这个不重要),但是文件中已经有了输出内容。比如:
162+ 从这看出,两者是完全等效的。如果仅仅止于此,意义不大。关键是通过 ` sys.stdout ` 能够做到将输出内容从 “控制台”转到“文件”,称之为重定向。这样也许控制台看不到(很多时候这个不重要),但是文件中已经有了输出内容。比如:
159163
160164 >>> f = open("stdout.md", "w")
161165 >>> 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")
163167 >>> f.close()
164168
165- 当` sys.stdout = f ` 之后,就意味着将输出目的地转到了打开(建立)的文件中,如果使用print() ,即将内容输出到这个文件中,在控制台并无显现。
169+ 当` sys.stdout = f ` 之后,就意味着将输出目的地转到了打开(建立)的文件中,如果使用 ` print ` ,即将内容输出到这个文件中,在控制台并无显现。
166170
167171打开文件看看便知:
168172
169173 $ cat stdout.md
170174 Learn Python: From Beginner to Master
171175
172- 这是标准输出。另外两个,输入和错误,也类似。读者可以自行测试。
173-
174- 关于对文件的操作,虽然前面这这里都涉及到一些。但是,远远不足,后面我会专门讲授对某些特殊但常用的文件读写操作。
175-
176+ 以上,对标准库中的` sys ` 有了粗浅的了解。更详细内容,请读者运用本书已经反复使用的` dir() ` 、` help() ` 去探究,当然还有Google。
177+
176178##copy
177179
178- 在 [ 《字典(2)》 ] ( ./117.md ) 中曾经对copy做了讲授 ,这里再次提出,即是复习,又是凑数,以显得我考虑到了这个常用模块,还有:
180+ 前面对浅拷贝和深拷贝做了研究 ,这里再次提出,温故知新。
179181
180182 >>> import copy
181183 >>> copy.__all__
182184 ['Error', 'copy', 'deepcopy']
183185
184186这个模块中常用的就是copy和deepcopy。
185187
186- 为了具体说明,看这样一个例子:
188+ 为了具体说明,看这样一个例子,这个例子跟以前讨论浅拷贝和深拷贝略有不同,请读者认真推敲结果,并对照代码。
187189
188190 #!/usr/bin/env python
189191 # coding=utf-8
190192
191193 import copy
192194
193- class MyCopy(object):
195+ class MyCopy(object): #Python 3: class MyCopy:
194196 def __init__(self, value):
195197 self.value = value
196198
@@ -208,7 +210,9 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
208210 a.append("abc")
209211 foo.value = 17
210212
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))
212216
213217保存并运行:
214218
@@ -219,7 +223,7 @@ sys.argv是变量,专门用来向python解释器传递参数,所以名曰“
219223 copy(): ['foo', 17]
220224 deepcopy(): ['foo', 7]
221225
222- 读者可以对照结果和程序,就能理解各种拷贝的实现方法和含义了 。
226+ 尽在不言中,请读者认真对邵上面的显示结果,体会深拷贝和浅拷贝 。
223227
224228------
225229
0 commit comments