在python中,%s和%r的對應呼叫方法如下,它們都可以用來轉換字串。.
%s -> str
%r -> repr
其中,str的可讀性強,repr傾向於表明一個物件的詳細資訊。一般來說,在一個類中,__repr__一般都會又,__str__不一定有,而當__str__()函式沒有定義的時候,__repr__定義的話,呼叫str和repr一樣,即是str=repr。
     看下面的例子,
>>> print(repr('hello'))
'hello'
>>>
>>> print(str('hello'))
hello  
>>> print(repr(1))
1
>>> print(str(1))

       str和repr列印字串的結果是不一樣的,那是因為它繼承的object.__repr__(self),轉換成"正式(official)"字串(反向引用),而object.__str__(self)是轉換成"非正式的(imfomal)", 但是列印int型別的是一樣的。

        使用eval()函式可以看出它們區別,repr返回的是有效的字串,而str返回的是無效的字串

>>> teststr = 'hello'
>>> repr(teststr)
"'hello'"
>>> str(teststr)
'hello'
>>> teststr2 = eval(repr(teststr))
>>> teststr == teststr2
True
>>>
>>> eval(str(teststr))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 1, in <module>
NameError: name 'hello' is not defined

     從例子可以看出,再eval()中,把str返回的字串當成了一個名字是'hello'的未定義變數名,而用repr返回的結果得到的字串物件teststr2和teststr是同一個物件。

再看看下面的例子,自定義一個類:

# coding=utf-8
class Foo(object):
    def __init__(self, foo):
        self.foo = foo

    def __repr__(self):
        return 'Foo(%r)' % self.foo

    def __str__(self):
        return self.foo

if __name__ == '__main__':
    test = Foo('hello')
    print(test)
    print('test instance,%%r is %r , %%s is %s' % (test, test))

輸出結果:

C:\Python36-32\python.exe D:/PythonLearning/PythonCore/test.py
hello
test instance,%r is Foo('hello') , %s is hello

當註釋__str__函式後,str和repr的輸出結果一樣的:

C:\Python36-32\python.exe D:/PythonLearning/PythonCore/test.py
Foo('hello')
test instance,%r is Foo('hello') , %s is Foo('hello')
在上面的基礎上註釋__repr__函式後,輸出結果:
C:\Python36-32\python.exe D:/PythonLearning/PythonCore/test.py
<__main__.Foo object at 0x052A0410>
test instance,%r is <__main__.Foo object at 0x052A0410> , %s is <__main__.Foo object at 0x052A0410>
     總結:str一般用於一個string顯示的友好,可以理解成該字串直接了當的告訴針使用者是什麼,而repr較為規範的表示string是程式設計師使用的。