小能豆

使用 Python 方式打印列表项

javascript

我想知道是否有比这更好的方法来打印 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

如果不是,我的问题是…为什么?如果我们可以使用完整列表来做这种事情,为什么不将其作为列表外的简单语句呢?


阅读 52

收藏
2024-07-22

共1个答案

小能豆

在 Python 中,打印列表中的所有对象有几种不同的方法,每种方法都有其优缺点。我们来探讨你的问题以及不同的方法。

1. 使用 joinmap

你当前的做法是:

myList = [Person("Foo"), Person("Bar")]
print("\n".join(map(str, myList)))

这是一种有效且简洁的方法,可以将每个对象的字符串表示形式连接成一个字符串,并以换行符分隔。这种方法的优点是它能够在一次 print 调用中处理所有输出,适用于你只想简单打印所有对象的场景。

2. 使用 for 循环

你的第二种方法是:

myList = [Person("Foo"), Person("Bar")]
for p in myList:
    print(p)

这种方法是非常常见的做法,它直接逐个打印列表中的每个对象。这种方式的优点在于直观、简单,并且允许你在打印时做更多处理。如果对象的 __str____repr__ 方法定义得当,它会按照预期输出每个对象。

3. 使用类似列表推导的打印

你提出了类似下面的语法:

print(p) for p in myList

这种语法在 Python 中是不合法的。列表推导式用于生成新的列表,而不是执行语句。Python 的列表推导式的设计目的是为了创建和返回列表,而不是用于产生副作用(如打印)。

其他替代方法

使用 mapprint

你可以结合使用 mapprint,并利用参数解包来打印每个对象:

myList = [Person("Foo"), Person("Bar")]
print(*map(str, myList), 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 和生成器表达式,使代码更加简洁。

为什么不能在列表外使用类似列表推导的语法?

  • 列表推导的设计目的: 列表推导式的目的是生成新的列表,而不是执行语句。Python 保持了列表推导式和其他语句的明确分离,以避免混淆并保持代码的可读性。
  • 副作用的明确性: 允许列表推导式或类似的语法执行副作用(如打印)可能会降低代码的清晰度。Python 强调明确的、易读的代码结构,通常会将数据生成和副作用操作分开处理。

总结

  • 使用 for 循环 是最直接、最易读的方法来逐个打印列表中的对象。
  • 使用 str.join 和生成器表达式 提供了另一种简洁的方式来处理输出格式。
  • 避免将副作用(如打印)与列表推导式混合 保持了 Python 代码的清晰性和一致性。

根据你的具体需求选择最合适的方法。如果只需要简单地打印所有对象,for 循环或 str.join 方法都是很好的选择。

2024-07-22