【发布时间】:2011-12-09 05:21:02
【问题描述】:
【问题讨论】:
-
他为什么不直接使用 pprint 库?
【问题讨论】:
“诀窍”就是在单独的行中打印列表的每个元素,仅此而已。
【讨论】:
for item in li: print item来完成这是同样的伎俩?
join 比使用显式循环更有效
打印这样的列表对于调试无用:
(1) 如果任何列表项不是字符串,则会出现异常。
(2) 您的标准输出可能无法显示字符串,从而导致异常或乱码。
(3) 您不会看到(例如)制表符 (\t) 和多个空格之间的区别。
好多了:
Python 2.x:print repr(li)
Python 3.x:print(ascii(li))
更新下面是print(li') 在 Python 3.x 上可能发生的情况(上面的问题 2):
>>> li = ['\u0404']
>>> print(li)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\python32\lib\encodings\cp850.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u0404' in position
2: character maps to <undefined>
请注意,print li 在 Python 2.x 上“有效”只是因为 repr() 被隐式调用。一般来说,应该只做print repr(thing)。另请注意,print(li) 在 Python 3.x 上可能会失败,因为它隐式调用 repr(),而不是 ascii()
更新2如果你想在一个列表中找到所有非字符串,明确地去做,不要依赖“技巧”:
>>> def check_list(li):
... for x, v in enumerate(li):
... if not isinstance(v, (str, unicode)):
... print "Type %s (%r) at offset %d" % (type(v), v, x)
...
>>> check_list(['\xff', 2, u'\u0303', 4.0])
Type <type 'int'> (2) at offset 1
Type <type 'float'> (4.0) at offset 3
【讨论】:
“诀窍”是"\n".join(li) 在显示屏上写入 li 的所有元素所需的时间比以下代码要少:
for x in li:
print li
如果 li 的元素很少,则不会真正感受到差异。
但是用一长串测试一下区别,就很明显了
不过,“诡计”这个词有点过分了。
【讨论】:
"\n".join(...) 非常有用,我想知道我是否不是引用的作者,虽然后者指的是调试(但想法可能随时间变化)。我搜索了这个帖子:(stackoverflow.com/a/5694834/551449) 现在我可以看到我不是暗示调试的引文的作者。