Python中%r和%s的区别

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

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

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

例一:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. print "I am %d years old." % 22  
  2. print "I am %s years old." % 22  
  3. print "I am %r years old." % 22  

返回结果:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. I am 22 years old.  
  2. I am 22 years old.  
  3. I am 22 years old.  

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

例二:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. text = "I am %d years old." % 22  
  2. print "I said: %s." % text  
  3. print "I said: %r." % text  

返回结果:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. I said: I am 22 years old..  
  2. I said: 'I am 22 years old.'. // %r 给字符串加了单引号  

再看一种情况

例三:

[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import datetime  
  2. d = datetime.date.today()  
  3. print "%s" % d  
  4. print "%r" % d  


返回结果:
[python]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 2014-04-14  
  2. datetime.date(2014414)  

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

欢迎加入Python学习交流群:535993938  禁止闲聊 ! 名额有限 ! 非喜勿进 !

<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()`重建原始对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值