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等等,是因爲太複雜了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章