python3编程基础:str()、repr()的区别

原创

python3编程基础:str()、repr()的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/kongsuhongbaby/article/details/87398394
            </div>
                                                <!--一个博主专栏付费入口-->
         
         <!--一个博主专栏付费入口结束-->
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
                                    <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
            <div class="htmledit_views" id="content_views">
                                        <h1><a name="t0"></a>前言</h1>

python中转换成字符有两种方法:str()和repr(),这两种又有什么区别?什么时候用str?什么时候用repr?
str()函数:将值转化为适于人阅读的字符串的形式
repr()函数:将值转化为供解释器读取的字符串形式

代码示例

下面我们用例子来说明两个函数是差异点,还有就是print输出字符串时需要注意的点

将整型转换为字符串


 
 
  1. >>> a = 123 #int类型
  2. >>> type(a)
  3. < class 'int'>
  4. >>> str(a)
  5. '123'
  6. >>> type(str(a))
  7. <class 'str'>
  8. >>> print(str(a)) #print输出时会去掉引号,但是仍然是str类型
  9. 123
  10. >>> repr(a)
  11. '123'
  12. >>> type(repr(a))
  13. <class 'str'>
  14. >>> print(repr(a))
  15. 123
  16. >>> len(repr(a)) #转换后的数据都是'123',所以长度是3
  17. 3
  18. >>> len(str(a)) #转换后的数据都是'123',所以长度是3
  19. 3

将字符串再转换为字符串


 
 
  1. >>> repr( 'abd') #repr转换后是在'abd'的外层又加了一层引号
  2. "'abd'"
  3. >>> str( 'abd') #str转换后还是原来的值
  4. 'abd'
  5. >>> str( 'abd') == 'abd'
  6. True
  7. >>> repr( 'abd') == 'abd'
  8. False
  9. >>> len(repr( 'abd')) #repr转换后的字符串和str转换后的字符串个数都是不一样的
  10. 5
  11. >>> len(str( 'abd'))
  12. 3

命令行下print和直接输出的对比

每个类都有默认的__repr__, __str__方法,在命令行下用print 实例时调用的是类的str方法,直接调用的是类的repr方法;在文件模式下没有print的话是不会有输出值的,自己定义一个类A,验证以上结论:


 
 
  1. >>> class A():
  2. ... def __repr__(self):
  3. ... return 'repr'
  4. ... def __str__(self):
  5. ... return 'str'
  6. ...
  7. >>> a = A()
  8. >>> a #直接输出调用的是repr方法
  9. repr
  10. >>> print(a) #print调用的是str方法
  11. str

repr的使用场景

根据以上代码示例,可以得出只有当repr再次作用在字符串上时会多一层引号,那么这一特性在拼接完字符串用eval执行时是特别有用的,如果不用repr而是采用str会报错,举例,将字符串s = 'abdcf'转换成列表,如果用eval自己实现的话可以这样写:


 
 
  1. >>> s = 'abdcf'
  2. >>> eval( '['+ ','.join([repr(i) for i in s])+ ']')
  3. [ 'a', 'b', 'd', 'c', 'f']
  4. >>> eval( '['+ ','.join([str(i) for i in s])+ ']') #str报错
  5. Traceback (most recent call last):
  6. File "<stdin>", line 1, in <module>
  7. File "<string>", line 1, in <module>
  8. NameError: name 'b' is not defined

为什么会报错呢?当','.join([str(i) for i in s])拼接后的结果'a,b,d,c,f'只有一层引号,eval执行时会去掉这层引号,就成了a,b,d,c,f,解释器就会当做变量对待,但是并没有定义这样的变量,所以报NameError错误


 
 
  1. >>> ','.join([repr(i) for i in s])
  2. "'a','b','d','c','f'"
  3. >>> ','.join([str(i) for i in s])
  4. 'a,b,d,c,f'
  5. >>>

总结

1.除了字符串类型外,使用str还是repr转换没有什么区别,字符串类型的话,外层会多一对引号,这一特性有时候在eval操作时特别有用;

2.命令行下直接输出对象调用的是对象的repr方法,print输出调用的是str方法

文章最后发布于: 2019-02-16 00:28:44
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值