请参见以下示例:
In [33]: test = {x:str(x)*10 for x in range(10)}
In [35]: print test
{0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}
In [34]: test
Out[34]:
{0: '0000000000',
1: '1111111111',
2: '2222222222',
3: '3333333333',
4: '4444444444',
5: '5555555555',
6: '6666666666',
7: '7777777777',
8: '8888888888',
9: '9999999999'}
打印功能(__str__)的输出客观上比__repr__输出的可读性差。这是一条长长的线,它将自动换行成多行而没有间距。它们两个都足够明确,可以让您使用其输出来重建对象。
相反的输出在这里是否有意义,__ repr__是紧凑的表示形式,而__str__具有更易读的换行符?
答案 0 :(得分:4)
这只是一个ipython问题。在标准的Python 3.7 REPL中,这是输出:
>>> test = {x:str(x)*10 for x in range(10)}
>>> print(test)
{0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}
>>> test
{0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}
>>>
如果我们将其作为“普通”脚本执行,则输出是相同的:
test = {x: str(x) * 10 for x in range(10)}
print(str(test))
# {0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}
print(repr(test))
# {0: '0000000000', 1: '1111111111', 2: '2222222222', 3: '3333333333', 4: '4444444444', 5: '5555555555', 6: '6666666666', 7: '7777777777', 8: '8888888888', 9: '9999999999'}
在str
或repr
表示中,没有换行符,如先前在注释中所提到的:
print(repr(test) == str(test))
# True
结论是,这只是ipython主动使repr
的输出更人性化。
答案 1 :(得分:1)
IPython会这样做,所以print
做常规的事情,但是仅仅命名变量会做一些很酷的事情,这就是为什么...
用pandas dataframes
打印print
很难看,只是给变量命名就好
请注意,@Aran-Fey says:
“这会让您大吃一惊:repr(test) == str(test)
”
很正确的是,非IPython解释器无法实现这一目标。