在 Python 中要将某一类型的变量或者常量转换为字符串对象通常有两种方法,即str() 或者 repr() 。

>>> a = 10
>>> type(str(a))
<class 'str'>
>>> type(repr(a))
<class 'str'>

但是这二者之间有什么区别呢?因为提供两个功能完全相同的内建函数是没有意义的。

区别

Python中的str( )和repr( )两个函数的区别,都是可以将任意的值转化为字符串:函数str( )将其转化成为适于人阅读的前端样式文本,而repr(object)就是原本未处理的用于编译器阅读的后台底层代码,下面直接上例子来说明这两个函数的用法。

对于字符串: a = ‘hello, world!\n’

>>> a
'hello, world!\n'     #输出的a本来的模样
>>> print(a)      #对a经过编译后的样式文本输出,将转义字符进行转义
hello,world!
>>> print(str(a))     #可以看到对str返回的值进行print处理,这将与直接print(a)得到相同的结果
hello,world!
>>> repr(a)     #获得的是a原始输入的存在于存储器中用于机器底层编译的代码
"'hello, world!\n'"
>>> print(repr(a))     #对于repr返回的值进行print处理,可以看到这与直接在终端输入a,得到的是相同的结果 'hello,world!\n'

造成这两种输出形式不同的原因在于,print 语句结合 str() 函数实际上是调用了对象的 __str__方法来输出结果。而 print 结合 repr() 实际上是调用对象的__repr__方法输出结果,来实际对比一下看看。

>>> print(str('123'))
123
>>> print(str(123))
123
>>> print(repr('123'))
'123'
>>> print(repr(123))
123

不难发现,当我们把一个字符串传给str()函数再打印到终端的时候,输出的字符不带引号。而将一个字符串传给repr()函数再打印到终端的时候,输出的字符带有引号。

下例中我们用 str 对象直接调用这两个方法,输出结果的形式与前一个例子保持一致。

>>> print('123'.__repr__())
'123'
>>> print('123'.__str__())
123

这个例子可能还是无法很好表达到底 str() 与 repr() 各有什么意义,再看下一个例子

>>> from datetime import datetime
>>> now = datetime.now()
>>> print(str(now))
2017-04-22 15:41:33.012917
>>> print(repr(now))
datetime.datetime(2017, 4, 22, 15, 41, 33, 12917)

通过str()的输出结果我们能很好地知道 now 实例的内容,但是却丢失了 now 实例的数据类型信息。而通过repr()的输出结果我们不仅能获得 now 实例的内容,还能知道 now 是datetime.datetime对象的实例。

因此 str() 与 repr() 的不同在于:

  • str() 的输出追求可读性,输出格式要便于理解,适合用于输出内容到用户终端。
  • repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用。

另外如果想要自定义类的实例能够被 str()和 repr()所调用,那么就需要在自定义类中重构__str____repr__方法。

重构

在类中的使用,可以定义一些在实例运行时,控制repr()函数作用在其实例上时的行为。

class test(object): def __init__(self, data): self.data = data 

仅仅是这样的话我们进行如下操作:

>>> t = test(100)
>>> t
<__main__.test at 0x4db85f8>
>>> print(t)
<__main__.test at 0x4db85f8>
>>> str(t)
'<__main__.test at 0x4db85f8>'
>>> repr(t)
'<__main__.test at 0x4db85f8>'

在类中没有方法的时候,如果直接在终端输入类的实例,不会输出任何东西的,上面显示的内容是由于类的特殊方法(基本定制型)有str()和repr(), 在print(object)和直接运行实例的时候回打印字符串。如果没有实现(覆盖)该函数,就会出现上面的结果。

那我们定义一个str函数来看看效果:

class test(object): def __init__(self, data): self.data = data def __str__(self): return "ss" >>> t = test(100)
>>> t
<__main__.test at 0x4db85f8>
>>> str(t)
'ss'
>>>print(t)
ss
>>>repr(t)
<__main__.test at 0x4db85f8>

可以看到在这里直接输入t还会跟上面的例子的结果一致,但是str(t)和print(t)已经发生了改变,不难看出显示的是我们在类中定义的str()函数的返回值,而rerp(t)还是 跟上个例子一样,下面我们也来实现一个str()函数来看一看效果。

class test(object): def __init__(self, data): self.data = data def __str__(self): return "ss" def __repr__(self): return "gg"
>>> t = test(100)
>>> t
gg
>>> str(t)
'ss'
>>>print(t)
ss
>>>repr(t)
'gg'
>>> print(repr(t))
gg

如此可以很清楚的明白,默认的str() repr()函数与重构后的区别,以及这两者与直接输入和经过print处理以后的关系,也就是直接在终端输入对象,相当于调用print(repr(oblect))函数,如果没有被复写则会出现上面最开始的那种显示形式;而print(object)函数相当于调用了print(str(object))这个函数,如果没有被复写就是使用的默认的,也会出现上面的显示结果。

下面还有一个对于repr( )函数的说明:
Python中这个repr函数,对应repr(object)这个函数,返回一个可以用来表示对象的可打印字符串:

  • 尝试生成这样一个字符串,将其传给 eval()可重新生成同样的对象 ;
  • 否则,生成用尖括号包住的字符串,包含类型名和额外的信息(比如地址) ;
  • 一个类(class)可以通过 repr() 成员来控制repr()函数作用在其实例上时的行为。

Python中,有的操作符和函数是做同样的事情,原因是某些场合下函数会比操作符更适合使用,比如函数对象可作为参数传递。

Python中的str()函数和repr()函数相关推荐

  1. python中的str方法和repr方法_Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些

    Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些 发布时间:2020-11-05 17:11:48 来源:亿速云 阅读:95 作者:Leah 本篇文章给大家分享的是有关P ...

  2. python中的str方法和repr方法_详解Python中__str__和__repr__方法的区别

    对我当前工程进行全部测试需要花费不少时间.既然有 26 GB 空闲内存,为何不让其发挥余热呢? tmpfs 可以通过把文件系统保存在大内存中来加速测试的执行效率. 但优点也是缺点,tmpfs 只把结果 ...

  3. python整数转换字符串_使用Python中的str()函数将整数值转换为字符串

    python整数转换字符串 Given an integer value and we have to convert the value to the string using str() func ...

  4. python中的str()函数

    1.python中的str()用来避免数据类型匹配错误 例如: 运行下列代码 num=19960223 info="my name is z,my birthday is" mes ...

  5. python中的map,feilter,和reduce函数

    python中的map,feilter,和reduce函数 map() map()的原型是map(function, iterable, -) 参数 function: 传的是一个函数名,可以是pyt ...

  6. python命名规则数字开头的成语_浅谈Python中带_的变量或函数命名

    搜索热词 Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就 ...

  7. python关键字define_在Python中,使用关键字define定义函数。

    在Python中,使用关键字define定义函数. 以下属于生药学有效性评价的是A:有效成分定量分析B:限量检查C:重金属检测D:基原鉴定 若有如下定义和语句:A:7B:12C:8D:9 图示电路中的 ...

  8. 从Python中的另一个文件调用函数

    本文翻译自:Call a function from another file in Python Set_up: I have a .py file for each function I need ...

  9. python列表去重函数_对python中两种列表元素去重函数性能的比较方法

    测试函数: 第一种:list的set函数 第二种:{}.fromkeys().keys() 测试代码: #!/usr/bin/python #-*- coding:utf-8 -*- import t ...

最新文章

  1. android api版本 闪退_经验分享:从事 Android 开发六年,我学到的那些事
  2. [爬虫学习笔记]C# 使用 ScrapySharp 并行下载天涯图片
  3. 应用按home键无最近应用
  4. vivo AI 计算平台的 ACK 混合云实践
  5. java学习(109):StringBuilder,stringbuffer,string区别
  6. spark 数据框 删除列_pandas 常用的数据处理函数
  7. 数据结构之选择排序:堆排序
  8. CSS基本布局16例(原网页引自Owen Briggs)
  9. diff测试与流量回放测试
  10. 用php制作抖音视频去水印小程序?
  11. python基础教程视频优酷_Python快速入门视频
  12. [zz]明月虽好by 王大根 from 豆瓣
  13. linux sd卡修复工具,免费的SD卡数据恢复工具介绍
  14. 动态指针时钟:利用pyqt5制作指针钟表显示实时时间
  15. echarts生成三维柱状图
  16. 《软件工程(C编码实践篇)》学习总结
  17. 对接支付宝、微信、第三方支付,超详细讲解+demo演示
  18. C++基础面试问题总结
  19. IOS7使用吐槽(抛弃拟物化您还能走多远.........)
  20. 表单验证-----验证图片格式

热门文章

  1. python爬取图片到本地文件夹
  2. 面试题整理|50个React面试题及解析
  3. #define宏定义是什么?怎么写?一文搞懂。
  4. C语言实现10只小猪称体重
  5. HA存储HP 3PAR 7200c
  6. 2019 ECNU Campus Invitational Contest
  7. 如何测试linux虚拟机性能,虚拟机平台性能测试
  8. java中用Calendar获取各个阶段时间
  9. IDEA配置Struts2框架搭建
  10. HDU 4526 威威猫系列故事——拼车记 dp