1. 程式人生 > >python中的字元輸出(str()、repr()、print)

python中的字元輸出(str()、repr()、print)

一、字元輸出的三種函式
str()、repr()、print
開發環境為python2.7
我們常常會遇到字元輸出和轉換問題,一個看似簡單的字元問題卻往往讓我們殫精竭慮。其實只要真的理解了,python的字元輸出轉換規則,這些問題再也不是問題了。

二、實戰
簡單的互動輸出

    >>> 'hello'
    'hello'
    >>> print 'hello'
    hello
    >>> '你好'
    '\xc4\xe3\xba\xc3'
    >>> print '你好'
    你好

變數是英文的話不管直接輸入還是print結果都一樣。但是變數是中文的話直接輸入變數和print變數會顯示不一樣的東西呢?因為python 2是絕對英文友好的。中文對於它來說,只儲存為一串編碼而不是原文。

話說回來,為什麼’你好’和print ‘你好’結果會不一樣呢?

在檢視print官方文件時發現,在python裡面print是一個非常厲害的小傢伙:它能把幾乎任何常見型別的物件列印成一串文字,甚至包括列表、字典、元組等等。這在別的語言裡是不可理解的,所以給從其他語言轉過來的人埋了個大坑。

總結:Python中出現的任何中文,雖然我們在編輯器裡看到的是中文,但是背地裡全是一串編碼。千萬不要輕易信任print!print xx給你顯示出來的,其實並不是xx的真實面貌!

至於這個編碼是什麼格式,unicode還是utf-8之類,一會再說。

Python中的str()和repr()原生函式

好多人都知道str()能把123數字轉成字串,python裡的str()甚至還能把列表、字典等物件轉成字串。這都好理解,可是一旦把str()和repr()放在一起,大家就全都不淡定了-_-!
來看一段程式碼,仍是在IDLE裡互動:

>>> str('hello')
'hello'
>>> repr('hello')
"'hello'"

>>> str('你好')
'\xc4\xe3\xba\xc3'
>>> repr('你好')
"'\\xc4\\xe3\\xba\\xc3'"

先看前兩句:英文的’hello’在str()後仍是’hello’,可是在repr()後就變成了“‘hello’”。這就說明,str()返回的就是字串本身,而repr()雖然返回的也是字串,但它是一個標準字串,官方解釋比較繞,我來解釋下吧。repr是representation及描述的意思,不是對人的描述,而是對python機器的描述,也就是它會將某物返回一個它在python中的描述。說人話:repr(obj)告訴我們obj這個變數在背地裡是什麼樣子,在背地裡是怎麼被python處理被python”玩弄”的。
在python裡,我們總會被眼睛欺騙。編輯器裡顯示的東西,並不總是它原本的面貌。python為了方便,總是表面上一套,背地裡又一套。
再來理解後兩句:中文的’你好’在str()後變成了編碼’\xc4\xe3\xba\xc3’,在repr()後變成了”’\xc4\xe3\xba\xc3’”。都加上了轉移符變成\,相當於把字串中的內容都“標準化”了。至於'變成"只是為了說明repr()返回的是一個經過處理的新字串。

print後的str()和repr()

來看程式碼:

>>> print str('你好')
你好
>>> print repr('你好')
'\xc4\xe3\xba\xc3'

之前str(‘你好’)顯示的是’\xc4\xe3\xba\xc3’,而一經過print,就變成了正確的’你好’。上面說過了,命令列裡直接輸入一個變數,顯示的是它在python後臺儲存的資料;而用print出來的東西,會顯出出盡量友好、讓人能看懂的東西。
理解了這個,對print這兩個結果的不同,也就全然理解了。然後也就放棄print作為考據的心了。

另外,以上程式碼的互動,再windows系統cmd中,結果是一樣的。

這樣一來,python對字串的基本理解就差不多了。這篇文章裡儘量避免了對各種code編碼的討論,如unicode, ascii, ANSI, UTF-8, GB2312, GBK等等,是因為太複雜了。