python中的str和repr函数的区别

看了一些网上的解释,最主流的解释是“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

 

posted @ 2019-01-06 01:43  火军刀  阅读(444)  评论(0编辑  收藏  举报