python中%r和%s的区别

本文深入解析Python中%r和%s的区别,通过实例演示它们在不同情况下的应用,帮助开发者理解如何正确选择使用方式。

%r用rper()方法处理对象

%s用str()方法处理对象

有些情况下,两者处理的结果是一样的,比如说处理int型对象。

例一:

print "I am %d years old." % 22
print "I am %s years old." % 22
print "I am %r years old." % 22

返回结果:

I am 22 years old.
I am 22 years old.
I am 22 years old.

另外一些情况两者就不同了

例二:

text = "I am %d years old." % 22
print "I said: %s." % text
print "I said: %r." % text

返回结果:

I said: I am 22 years old..
I said: 'I am 22 years old.'. // %r 给字符串加了单引号

再看一种情况

例三:

import datetime
d = datetime.date.today()
print "%s" % d
print "%r" % d


返回结果:
2014-04-14
datetime.date(2014, 4, 14)

可见,%r打印时能够重现它所代表的对象( rper() unambiguously recreate the object it represents)


参考:http://stackoverflow.com/questions/6005159/when-to-use-r-instead-of-s-in-python

<think>嗯,用户问的是Python中`%s``%r`占位符的区别。我需要先回忆这两个占位符的具体用法。记得在字符串格式化中,%操作符用来格式化字符串,%s%r都是其中的转换类型。 首先,%s应该对应str()函数的结果,而%r对应repr()函数的结果。所以当使用%s时,会调用对象的__str__方法,而%r会调用__repr__方法。例如,字符串用%r显示的话,会带有引号,而%s则不会。比如,字符串'hello'用%s就是hello,用%r就是'hello',包括单引号。 然后,可能需要举例子说明不同数据类型的表现差异。比如,数字的话,%s%r可能看起来一样,但对于某些对象,比如datetime,两者的显示可能不同。比如datetime对象用%s可能显示为可读的日期格式,而%r可能显示更详细的对象信息,包括模块类名。 另外,处理转义字符的时候,比如换行符,%r会显示\n,而%s会实际换行。比如字符串里如果有\n,%s会换行,而%r会直接显示\n。 还要说明为什么会有这两个不同的占位符。str()通常是为了用户友好的可读性,而repr()是为了明确的、无歧义的表示,通常用于调试。所以%r生成的字符串理论上可以用eval()重新生成对象,而%s可能不行。 可能还需要提到在格式化时的使用场景。比如在调试时用%r可以得到更详细的信息,而给用户显示时用%s更合适。 最后,可以给出一些代码示例,比如不同的数据类型用这两个占位符的效果对比。例如字符串、数字、特殊字符等的情况。这样用户能更直观地看到区别。 相关问题方面,可以问strrepr函数的区别,字符串格式化的其他方法,如formatf-string是否支持类似功能,还有eval(repr(obj))的习惯用法是否正确,以及如何自定义类的__str____repr__方法。</think><< 在Python的字符串格式化中,`%s``%r`的主要区别在于它们的底层转换方式: 1. **`%s`的行为**: - 使用`str()`函数进行转换,调用对象的`__str__`方法 - 输出对用户友好的可读字符串 - 示例: ```python print("%s" % "Hello\nWorld") # 输出: # Hello # World ``` 2. **`%r`的行为**: - 使用`repr()`函数进行转换,调用对象的`__repr__`方法 - 输出包含Python解释器可读的精确表示(包含类型信息) - 示例: ```python print("%r" % "Hello\nWorld") # 输出:'Hello\nWorld' ``` **关键区别示例**: ```python from datetime import datetime now = datetime.now() print("%s" % now) # 2024-01-01 12:34:56.789000(可读格式) print("%r" % now) # datetime.datetime(2024, 1, 1, 12, 34, 56, 789000)(机器可解析) class Test: def __str__(self): return "String representation" def __repr__(self): return "Repr representation" t = Test() print("%s" % t) # String representation print("%r" % t) # Repr representation ``` **主要应用场景**: - 使用`%s`:需要向用户展示友好信息时 - 使用`%r`:调试代码或需要保留类型信息时 - 注意:`%r`生成的字符串通常可以通过`eval()`重建原始对象
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值