python中的str和repr函式的區別

王明輝發表於2019-01-06

看了一些網上的解釋,最主流的解釋是“str是給人看的,repr是給機器看的”,如果已經理解了的,這句話是對的,但是是有問題的,對於沒懂的,這句話是無法理解的。

我來嘗試解釋一下。先直譯一下官方文件:

 

repr(object)

Return a string containing a printable representation of an object. For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval(), otherwise the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object. A class can control what this function returns for its instances by defining a __repr__() method.

返回一個字串,這個字串包含了一個物件的可列印表示。對於很多型別來講,這個函式試圖返回一個物件的字串,這個字串傳入eval()以後返回的值,與這個物件相等,除非這個“表示”是那種被角括號包圍的、包含了物件的型別名稱的、還有一些附加資訊通常是物件的地址和名稱的字串。一個類可以通過定義__repr__()方法來控制這個函式的返回值。

 

python是個儘量實現使用者友好的語言,儘量讓它簡單簡單再簡單,儘量讓它不出錯,無論怎樣搞都有結果,而且那結果是使用者常用的。

使用C、C++、Java、C#、PHP等語言的人,基本上沒有例外,都是程式猿、開發者,多少了解一些計算機的底層知識和原理,知道類、地址、變數等等,我們稱之為開發者。而使用python的,還有另一類人,他們不是計算機科班,也不是搞開發的,他們是資料科學家、資料分析師、人工智慧研究者等等,他們的專業可能是數學、物理、心理學、統計學、文學等等,他們可能不瞭解計算機底層知識(也不需要了解),他們只是使用一種工具,我們稱之為使用者。打個比方,如果我的目的是去另外一個城市,我可以選擇開車、坐汽車、火車、飛機、輪船等等交通工具,C、C++、Java、C#、PHP這些就是開車,而python,就是坐火車(還不能比作飛機,它有點慢),只要買張到到目的地的票,剩下的事情不用管了,我不需要知道怎樣啟動火車怎樣加速怎樣剎車。而Java等語言,需要知道。所以Java等是開發者友好的,而python是使用者友好的。這也是為什麼近些年來隨著資料量的增大網路傳輸速度的增加,python越來越火的原因,因為它簡單。

說了這麼多的目的就是為了說明,str是面向使用者的,給使用者展示的是結果,repr是面向開發者的,展示的是更詳細的描述。一個是結果,一個是描述,如果你想知道得更多,請用repr。

下面是引用的文章中的例子,很能說明問題:

>>> class A:
    pass
 
>>> a1 = A()
>>> a1
<__main__.A object at 0x000000000302C358>
 
>>> print(a1)
<__main__.A object at 0x000000000302C358>
 
 
>>> class A:
    def __str__(self):        #__str__使用:被列印的時候需要以字串的形式輸出的時候,就會找到這個方法,並將返回值列印出來
        return "我是一個字串"                                                                      
#要想顯示物件的屬性,可以(1)return 後加上你想要格式化輸出的屬性,比如: return "%d %s" % (int("123"), str(123))                                                                   
#(2)利用字串的format方法,比如:"{},{}".format(1,2)    
>>> a1 = A()
>>> a1
<__main__.A object at 0x00000000033712E8>
 
>>> print(a1)

>>> import datetime
>>> today = datetime.datetime.now()
>>> str(today)
'2012-03-14 09:21:58.130922'
>>> repr(today)
'datetime.datetime(2012, 3, 14, 9, 21, 58, 130922)'
---------------------

作者:在到處之間找我 
來源:CSDN 
原文:https://blog.csdn.net/sinat_41104353/article/details/79254149 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

 

這個解釋還是蠻靠譜的。

https://blog.csdn.net/sinat_41104353/article/details/79254149#%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3

 

相關文章