替换表单的每个调用print(...)
with s += ...
。跟踪行尾,很正常print
附加一个\n
, and print(..., end='')
只是一个简单的附加。另外,请尽量避免全局变量:
def build_string_pyramid(h=10):
s = ''
for i in range(1, h + 1):
s += '1' # print('1', end='')
for j in range(2, i + 1):
s += f'*{j}' # print('*', end=''), print(j, end='')
s += '\n' # print('\r')
for o in range(h - 1, 0, -1):
s += '1' # print('1', end='')
for p in range(2, o + 1):
s += f'*{p}' # print('*', end=''), print(p, end='')
s += '\n' # print('\r')
return s
print(build_string_pyramid())
像这样附加字符串不一定是最佳的,因为它们每次都会重新分配。您可能想先构建一个列表,甚至每行构建一个列表列表,然后join
them:
def build_string_pyramid(h=10):
s = []
for i in range(1, h + 1):
s.append('*'.join(str(j) for j in range(1, i + 1)))
for o in range(h - 1, 0, -1):
s.append('*'.join(str(p) for p in range(1, o + 1)))
return '\n'.join(s)
print(build_string_pyramid())
注意如何str.join
仅将分隔符放置在列表或生成器中的项目之间,因此您将得到一个尾随换行符较少的字符串。
作为一种完全不同的方法,您可以回到原来的打印技术,并实际上也以这种方式构建字符串。您可以通过使用来做到这一点io.StringIO,这是一个类似文件的对象,写入内存,并允许您直接导出字符串:
from io import StringIO
def build_string_pyramid(h=10):
s = StringIO()
for i in range(1, h + 1):
print('1', end='', file=s)
for j in range(2, i + 1):
print(f'*{j}', end='', file=s)
print(file=s)
for o in range(h - 1, 0, -1):
print('1', end='', file=s)
for p in range(2, o + 1):
print(f'*{p}', end='', file=s)
print(file=s)
return s.getvalue()
print(build_string_pyramid())