Python如何更优雅地返回对象列表的多行str()格式化结果
解决方案
你当前的循环字符串拼接方案存在两个可优化点:Python中字符串为不可变类型,循环+=拼接会频繁生成新字符串对象,数据量大时性能损耗明显;同时需要手动切片移除末尾多余的换行符,代码冗余。更优的实现方式如下:
方案1:直接用str.join()生成结果(无需修改类定义)
str.join()会预先计算所需内存一次性生成字符串,效率远高于循环拼接,且自动处理分隔符不会产生末尾多余换行:
return '\n'.join("{}({}),ISBN:{},${:.2f}".format(item.title, item.author, item.isbn, item.price) for item in self.__books)
如果使用Python3.6及以上版本,用f-string替换str.format可读性更高:
return '\n'.join(f"{item.title}({item.author}),ISBN:{item.isbn},${item.price:.2f}" for item in self.__books)
方案2:复用性更强的实现(推荐)
如果这个格式化规则是Book类的通用字符串表示,可以先给Book类定义__str__方法,后续所有需要输出Book对象的场景都可以直接复用:
class Book: # 原有__init__等逻辑不变 def __str__(self): return f"{self.title}({self.author}),ISBN:{self.isbn},${self.price:.2f}"
之后生成多行字符串的代码可以简化为:
return '\n'.join(str(book) for book in self.__books)
如果只是需要直接打印输出不需要返回字符串,可以进一步简化为:
print(*self.__books, sep='\n')
内容的提问来源于stack exchange,提问作者jwan218
相关产品推荐
相关产品推荐

