【问题标题】:str() vs repr() functions in python 2.7.5 [duplicate]python 2.7.5中的str()与repr()函数[重复]
【发布时间】:2013-10-20 07:36:08
【问题描述】:

python 2.7.5 中str()repr() 函数有什么区别?

python.org 上的解释:

str() 函数旨在返回相当人类可读的值的表示,而repr() 旨在生成 可以解释器读取的表示(如果没有等效语法,则强制使用SyntaxError

但我并不清楚。

一些例子:

>>> s = 'Hello, world.'
>>> str(s)
'Hello, world.'
>>> repr(s)
"'Hello, world.'"      # repr is giving an extra double quotes
>>> str(1.0/7.0)
'0.142857142857'
>>> repr(1.0/7.0)
'0.14285714285714285'  # repr is giving value with more precision

所以我想知道以下内容

  1. 什么时候应该使用str(),什么时候应该使用repr()
  2. 在哪些情况下我可以使用其中任何一个?
  3. str() 可以做什么repr() 不能?
  4. repr() 可以做什么str() 不能?

【问题讨论】:

  • repr 应返回评估为此类对象的 Python“对象表示”(如果适用)。这就是为什么在使用repr 时引用字符串的原因:所以eval(repr(someStr)) == someStr 应该为真(它也可以很好地转义不可打印和控制字符)。它(repr 和 reprlib)对于 debuggingexploring 对象很有用,但通常不应用于最终用户输出。
  • 请注意,当您在解释器中键入 str(s) 时,它会打印出 repr(str(s)),因为解释器会显示您键入的任何表达式的 repr。 print str(s)print repr(s) 你可能会发现它更有启发性。
  • 请注意,在您的数字示例中,repr() 可能会为您提供更高的精度,但不一定是更高的精度。它确实显示了更多的数字,但由于典型的浮点限制,str() 显示的值可能会更好。比较 repr(sum(0.1 for i in range(9)))str(sum(0.1 for i in range(9)))。另一方面,str() 会向你隐藏固有的不准确性,这让那些想知道为什么 sum(0.1 for i in range(9)) == 0.9 返回 False...
  • @hcwhsa 我不明白为什么我的问题是重复的。我看到了你给出的链接。但是那里的解释是使用类自己给出的。我是python的绝对初学者。我什至不明白。我的疑问在于功能,我清楚地解释了它。所以你能重新考虑我的问题吗?

标签: python string python-2.7 repr


【解决方案1】:

什么时候应该使用 str() 什么时候应该使用 repr() ?

在为最终用户创建输出时,几乎总是使用str()

repr()主要用于调试和探索。例如,如果您怀疑字符串中包含非打印字符,或者浮点数有小舍入误差,repr() 会显示给您; str() 可能不会。

repr() 也可用于生成文字以粘贴到您的源代码中。它也可以用于持久化(使用ast.literal_evaleval),但这并不是一个好主意——如果你想要可编辑的持久化值,JSON 或 YAML 之类的东西要好得多,如果你不打算要编辑它们,请使用 pickle。

2.在哪些情况下我可以使用它们中的任何一个?

嗯,您可以几乎在任何地方使用它们。您不应该通常使用它们,除非如上所述。

3.str()能做什么repr()不能?

为您提供适合最终用户消费的输出 - 并非总是如此(例如,str(['spam', 'eggs']) 不太可能是您想要放入 GUI 中的任何内容),但更常见的是比repr().

4.repr()能做什么str()不能做

为您提供对调试有用的输出——同样,并非总是如此(用户创建的类实例的默认值很少有用),但只要有可能。

有时会为您提供有效的 Python 文字或其他表达式的输出——但除了交互式探索之外,您很少希望依赖它。

【讨论】:

  • 您说:“repr 还可用于生成文字以粘贴到源代码中。”另一种方法是使用所谓的Raw Strings
  • @RedJohn 原始字符串文字不会做任何类似的事情。可能会有一点点重叠(如果您不知道如何转义字符串,您可能应该使用原始字符串,但您可以改为使用 repr 向您展示如何转义它),仅此而已。跨度>
  • 同意。我只是在谈论那个相似之处。我不再要求了。一方面,我在源代码中编写文件名时出错;特别是在文件名中有反斜杠的 Windows 中。因此,我使用原始字符串,而不是在解释器中使用 repr() 复制粘贴正确的转义序列字符串。
猜你喜欢
  • 2014-09-13
  • 2014-01-20
  • 2021-05-19
  • 2014-04-24
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多