鍍金池/ 教程/ Python/ 標(biāo)準(zhǔn)庫(kù) (2)
標(biāo)準(zhǔn)庫(kù) (4)
如何成為 Python 高手
標(biāo)準(zhǔn)庫(kù) (6)
標(biāo)準(zhǔn)庫(kù) (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習(xí)
列表(3)
從小工到專家
除法
錯(cuò)誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準(zhǔn)備
函數(shù)練習(xí)
標(biāo)準(zhǔn)庫(kù) (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫(xiě)一個(gè)簡(jiǎn)單的程序
將數(shù)據(jù)存入文件
語(yǔ)句(5)
SQLite 數(shù)據(jù)庫(kù)
集成開(kāi)發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語(yǔ)句(4)
錯(cuò)誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標(biāo)準(zhǔn)庫(kù) (1)
生成器
mysql 數(shù)據(jù)庫(kù) (1)
第三方庫(kù)
實(shí)戰(zhàn)
運(yùn)算符
類(3)
字典(2)
語(yǔ)句(1)
數(shù)和四則運(yùn)算
語(yǔ)句(2)
文件(2)
MySQL 數(shù)據(jù)庫(kù) (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫(kù) (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫(xiě)模塊
用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫(kù) (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級(jí)
字符串(3)
為計(jì)算做準(zhǔn)備
多態(tài)和封裝
類(4)
迭代
語(yǔ)句(3)
錯(cuò)誤和異常 (3)
分析 Hello
Python 安裝
標(biāo)準(zhǔn)庫(kù) (2)
列表(2)
元組

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

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

sys

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

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

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

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)該說(shuō)是我覺(jué)得常用的)來(lái)說(shuō)明。

sys.argv

sys.argv 是變量,專門(mén)用來(lái)向 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 中的作用就是這樣。通過(guò)它可以向解釋器傳遞命令行參數(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é)果和前面的代碼做個(gè)對(duì)照。

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

如果我們這樣來(lái)試試,看看結(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()

這是一個(gè)方法,意思是退出當(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() 退出程序,會(huì)返回 SystemExit 異常。這里先告知讀者,還有另外一退出方式,是 os._exit(),這兩個(gè)有所區(qū)別。后者會(huì)在后面介紹。

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

import sys

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

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

$ python 22102.py
0
1
2
3
4

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

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

sys.path

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

sys.stdin, sys.stdout, sys.stderr

這三個(gè)放到一起,因?yàn)樗麄兊淖兞慷际穷愇募鲗?duì)象,分別表示標(biāo)準(zhǔn) UNIX 概念中的標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤。與 Python 功能對(duì)照,sys.stdin 獲得輸入(用 raw_input() 輸入的通過(guò)它獲得,Python3.x 中是 imput()),sys.stdout 負(fù)責(zé)輸出了。

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

還記得 print() 吧,在這個(gè)學(xué)習(xí)過(guò)程中,用的很多。它的本質(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é)果在表象上如此差異,原因就是那個(gè)'\n'的有無(wú)。

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

從這看出,兩者是完全等效的。如果僅僅止于此,意義不大。關(guān)鍵是通過(guò) sys.stdout 能夠做到將輸出內(nèi)容從“控制臺(tái)”轉(zhuǎn)到“文件”,稱之為重定向。這樣也許控制臺(tái)看不到(很多時(shí)候這個(gè)不重要),但是文件中已經(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)到了打開(kāi)(建立)的文件中,如果使用 print(),即將內(nèi)容輸出到這個(gè)文件中,在控制臺(tái)并無(wú)顯現(xiàn)。

打開(kāi)文件看看便知:

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

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

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

copy

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

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

這個(gè)模塊中常用的就是 copy 和 deepcopy。

為了具體說(shuō)明,看這樣一個(gè)例子:

#!/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)

保存并運(yùn)行:

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

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


總目錄   |   上節(jié):標(biāo)準(zhǔn)庫(kù)(1)   |   下節(jié):標(biāo)準(zhǔn)庫(kù)(3)

如果你認(rèn)為有必要打賞我,請(qǐng)通過(guò)支付寶:qiwsir@126.com,不勝感激。