我想知道是否有比这更好的方法来打印 Python 列表中的所有对象:
myList = [Person("Foo"), Person("Bar")] print("\n".join(map(str, myList))) Foo Bar
我读到这种方式确实不太好:
myList = [Person("Foo"), Person("Bar")] for p in myList: print(p)
有没有类似的东西:
print(p) for p in myList
如果不是,我的问题是…为什么?如果我们可以使用完整列表来做这种事情,为什么不将其作为列表外的简单语句呢?
在 Python 中,打印列表中的所有对象有几种不同的方法,每种方法都有其优缺点。我们来探讨你的问题以及不同的方法。
join
map
你当前的做法是:
myList = [Person("Foo"), Person("Bar")] print("\n".join(map(str, myList)))
这是一种有效且简洁的方法,可以将每个对象的字符串表示形式连接成一个字符串,并以换行符分隔。这种方法的优点是它能够在一次 print 调用中处理所有输出,适用于你只想简单打印所有对象的场景。
print
for
你的第二种方法是:
这种方法是非常常见的做法,它直接逐个打印列表中的每个对象。这种方式的优点在于直观、简单,并且允许你在打印时做更多处理。如果对象的 __str__ 或 __repr__ 方法定义得当,它会按照预期输出每个对象。
__str__
__repr__
你提出了类似下面的语法:
这种语法在 Python 中是不合法的。列表推导式用于生成新的列表,而不是执行语句。Python 的列表推导式的设计目的是为了创建和返回列表,而不是用于产生副作用(如打印)。
你可以结合使用 map 和 print,并利用参数解包来打印每个对象:
myList = [Person("Foo"), Person("Bar")] print(*map(str, myList), sep="\n")
这里,map(str, myList) 将每个对象转换为字符串,print(*args, sep="\n") 会逐个打印这些字符串,并用换行符分隔。
map(str, myList)
print(*args, sep="\n")
str.join
如果你希望更简洁地处理格式化,可以直接使用生成器表达式与 str.join:
myList = [Person("Foo"), Person("Bar")] print("\n".join(str(p) for p in myList))
这种方法结合了 str.join 和生成器表达式,使代码更加简洁。
根据你的具体需求选择最合适的方法。如果只需要简单地打印所有对象,for 循环或 str.join 方法都是很好的选择。