標(biāo)準(zhǔn)庫(2)

2018-02-24 15:48 更新

python標(biāo)準(zhǔn)庫內(nèi)容非常多,有人專門為此寫過一本書。在本教程中,由于我的原因,不會將標(biāo)準(zhǔn)庫進行完整的詳細介紹,但是,我根據(jù)自己的理解和喜好,選幾個呈現(xiàn)出來,一來顯示標(biāo)準(zhǔn)庫之強大功能,二來演示如何理解和使用標(biāo)準(zhǔn)庫。

sys

這是一個跟python解釋器關(guān)系密切的標(biāo)準(zhǔn)庫,上一節(jié)中我們使用過sys.path.append()。

>>> import sys
>>> print sys.__doc__

顯示了sys的基本文檔,看第一句話,概括了本模塊的基本特點。

This module provides access to some objects used or maintained by the
interpreter and to functions that interact strongly with the interpreter.

在諸多sys函數(shù)和變量中,選擇常用的(應(yīng)該說是我覺得常用的)來說明。

sys.argv

sys.argv是變量,專門用來向python解釋器傳遞參數(shù),所以名曰“命令行參數(shù)”。

先解釋什么是命令行參數(shù)。

$ python --version
Python 2.7.6

這里的--version就是命令行參數(shù)。如果你使用python --help可以看到更多:

$ python --help
usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ...
Options and arguments (and corresponding environment variables):
-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x
-c cmd : program passed in as string (terminates option list)
-d     : debug output from parser; also PYTHONDEBUG=x
-E     : ignore PYTHON* environment variables (such as PYTHONPATH)
-h     : print this help message and exit (also --help)
-i     : inspect interactively after running script; forces a prompt even
         if stdin does not appear to be a terminal; also PYTHONINSPECT=x
-m mod : run library module as a script (terminates option list)
-O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x
-OO    : remove doc-strings in addition to the -O optimizations
-R     : use a pseudo-random salt to make hash() values of various types be
         unpredictable between separate invocations of the interpreter, as
         a defense against denial-of-service attacks

只選擇了部分內(nèi)容擺在這里。所看到的如-B, -h之流,都是參數(shù),比如python -h,其功能同上。那么-h也是命令行參數(shù)。

sys.arg在python中的作用就是這樣。通過它可以向解釋器傳遞命令行參數(shù)。比如:

#!/usr/bin/env python
# coding=utf-8

import sys

print "The file name: ", sys.argv[0]
print "The number of argument", len(sys.argv)
print "The argument is: ", str(sys.argv)

將上述代碼保存,文件名是22101.py(這名稱取的,多么數(shù)字化)。然后如此做:

$ python 22101.py
The file name:  22101.py
The number of argument 1
The argument is:  ['22101.py']

將結(jié)果和前面的代碼做個對照。

  • $ python 22101.py中,“22101.py”是要運行的文件名,同時也是命令行參數(shù),是前面的python這個指令的參數(shù)。其地位與python -h中的參數(shù)-h是等同的。
  • sys.argv[0]是第一個參數(shù),就是上面提到的22101.py,即文件名。

如果我們這樣來試試,看看結(jié)果:

$ python 22101.py beginner master www.itdiffer.com
The file name:  22101.py
The number of argument 4
The argument is:  ['22101.py', 'beginner', 'master', 'www.itdiffer.com']

如果在這里,用sys.arg[1]得到的就是beginner,依次類推。

sys.exit()

這是一個方法,意思是退出當(dāng)前的程序。

Help on built-in function exit in module sys:

exit(...)
    exit([status])

    Exit the interpreter by raising SystemExit(status).
    If the status is omitted or None, it defaults to zero (i.e., success).
    If the status is an integer, it will be used as the system exit status.
    If it is another kind of object, it will be printed and the system
    exit status will be one (i.e., failure).

從文檔信息中可知,如果用sys.exit()退出程序,會返回SystemExit異常。這里先告知讀者,還有另外一退出方式,是os._exit(),這兩個有所區(qū)別。后者會在后面介紹。

#!/usr/bin/env python
# coding=utf-8

import sys

for i in range(10):
    if i == 5:
        sys.exit()
    else:
        print i

這段程序的運行結(jié)果就是:

$ python 22102.py
0
1
2
3
4

需要提醒讀者注意的是,在函數(shù)中,用到return,這個的含義是終止當(dāng)前的函數(shù),并返回相應(yīng)值(如果有,如果沒有就是None)。但是sys.exit()的含義是退出當(dāng)前程序,并發(fā)起SystemExit異常。這就是兩者的區(qū)別了。

如果使用sys.exit(0)表示正常退出。如果讀者要測試,需要在某個地方退出的時候有一個有意義的提示,可以用sys.exit("I wet out at here."),那么字符串信息就被打印出來。

sys.path

sys.path已經(jīng)不陌生了,前面用過。它可以查找模塊所在的目錄,以列表的形式顯示出來。如果用append()方法,就能夠向這個列表增加新的模塊目錄。如前所演示。不在贅述。不理解的讀者可以往前復(fù)習(xí)。

sys.stdin, sys.stdout, sys.stderr

這三個放到一起,因為他們的變量都是類文件流對象,分別表示標(biāo)準(zhǔn)UNIX概念中的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤。與python功能對照,sys.stdin獲得輸入(用raw_input()輸入的通過它獲得,python3.x中是imput()),sys.stdout負責(zé)輸出了。

流是程序輸入或輸出的一個連續(xù)的字節(jié)序列,設(shè)備(例如鼠標(biāo)、鍵盤、磁盤、屏幕、調(diào)制解調(diào)器和打印機)的輸入和輸出都是用流來處理的。程序在任何時候都可以使用它們。一般來講,stdin(輸入)并不一定來自鍵盤,stdout(輸出)也并不一定顯示在屏幕上,它們都可以重定向到磁盤文件或其它設(shè)備上。

還記得print()吧,在這個學(xué)習(xí)過程中,用的很多。它的本質(zhì)就是sys.stdout.write(object + '\n')

>>> for i in range(3):
...     print i
... 
0
1
2

>>> import sys
>>> for i in range(3):
...     sys.stdout.write(str(i))
... 
012>>> 

造成上面輸出結(jié)果在表象上如此差異,原因就是那個'\n'的有無。

>>> for i in range(3):
...     sys.stdout.write(str(i) + '\n')
... 
0
1
2

從這看出,兩者是完全等效的。如果僅僅止于此,意義不大。關(guān)鍵是通過sys.stdout能夠做到將輸出內(nèi)容從“控制臺”轉(zhuǎn)到“文件”,稱之為重定向。這樣也許控制臺看不到(很多時候這個不重要),但是文件中已經(jīng)有了輸出內(nèi)容。比如:

>>> f = open("stdout.md", "w")
>>> sys.stdout = f
>>> print "Learn Python: From Beginner to Master"
>>> f.close()

當(dāng)sys.stdout = f之后,就意味著將輸出目的地轉(zhuǎn)到了打開(建立)的文件中,如果使用print(),即將內(nèi)容輸出到這個文件中,在控制臺并無顯現(xiàn)。

打開文件看看便知:

$ cat stdout.md
Learn Python: From Beginner to Master

這是標(biāo)準(zhǔn)輸出。另外兩個,輸入和錯誤,也類似。讀者可以自行測試。

關(guān)于對文件的操作,雖然前面這這里都涉及到一些。但是,遠遠不足,后面我會專門講授對某些特殊但常用的文件讀寫操作。

copy

《字典(2)》中曾經(jīng)對copy做了講授,這里再次提出,即是復(fù)習(xí),又是湊數(shù),以顯得我考慮到了這個常用模塊,還有:

>>> import copy
>>> copy.__all__
['Error', 'copy', 'deepcopy']

這個模塊中常用的就是copy和deepcopy。

為了具體說明,看這樣一個例子:

#!/usr/bin/env python
# coding=utf-8

import copy

class MyCopy(object):
    def __init__(self, value):
        self.value = value

    def __repr__(self):
        return str(self.value)

foo = MyCopy(7)

a = ["foo", foo]
b = a[:]
c = list(a)
d = copy.copy(a)
e = copy.deepcopy(a)

a.append("abc")
foo.value = 17

print "original: %r\n slice: %r\n list(): %r\n copy(): %r\n deepcopy(): %r\n" % (a,b,c,d,e)

保存并運行:

$ python 22103.py 
original: ['foo', 17, 'abc']
 slice: ['foo', 17]
 list(): ['foo', 17]
 copy(): ['foo', 17]
 deepcopy(): ['foo', 7]

讀者可以對照結(jié)果和程序,就能理解各種拷貝的實現(xiàn)方法和含義了。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號