不需要某些 for 循环:
python 中一个有用的功能是您可以将 char 乘以 int 以得到重复的 char 的 string。
例如,如果你这样做:
'c' * 10
你得到:
'cccccccccc'
这对您的情况有用的原因是您可以使用它来打印spaces 和chars。这将比 for-loops 更整洁,因为您可以一次调用将全部空格数打印为字符串,而不是一遍又一遍地打印单个 chars 而没有换行符。
为了明白我的意思,我使用以下代码编写了您的原始代码:
char = input("enter the char ")
rows = int(input("enter the number of inner rows "))
for r in range(rows, 0, -1):
print(' ' * 2 * (rows-r), end='')
print((char+' ') * (2*r+1))
看看它有多整洁?此外,您可以注意到在chars 的每一行的第二个打印中,我使用了计算:2*r +1。这是您转换此模式所需的:
3. * * * *
2. * * *
1. * *
0. *
到这个(根据您的要求):
3. *******
2. *****
1. ***
0. *
您可以看到,对于第二行的每一行,chars 的数量为2 * row +1。所以3 行有7 chars,2 行有5 等等。
如果您愿意,因为您现在已经摆脱了不必要的 for-loops,您可以将两个 prints 放在一个语句中:
print(' ' * 2 * (rows-r) + (char+' ') * (2*r+1))
但是,第一个可能被认为更简洁明了,因此您可能希望坚持使用单独的语句。
将内部三角形嵌入外部三角形
首先,我们需要input 两个不同的chars 用于内部和外部三角形。这将使我们能够区分哪个是哪个。
我认为最好的方法是保留print 语句,它像以前一样在三角形之前创建空格,但修改我们绘制字符及其模式的方式。
这就是我们想要4 行的输入:
0. .
1. ...
2. .....
3. .......
4. .*******.
5. ...*****...
6. .....***.....
7. .......*.......
注意将printing 进程分成两半是最简单的。所以上半部分只打印一个正三角形,但底部打印一个regular、一个flipped和另一个regular。
为此,我们希望遍历8 的每一行并检查我们何时完成了一半。如果过了一半,我们希望每个较小三角形的计算都认为它们位于三角形的顶部,即重置它们的 row 计数,因此当 printing 行 4 时,我们计算就像打印在行 @ 987654360@。为了实现这一点,一旦过了一半,我们需要将 row 变量与总数 rows 的一半取模(现在的总行数不是输入的内容,而是输入数量的两倍,如您所见,我们有一个三角形8 行,但输入的行值为4)。这将使三角形的预期效果是整个三角形的一半。
最后,要考虑的最后一件事是中心/内部三角形需要像我们之前所做的那样翻转。由于我们的行数现在从顶部的 0 向下而不是相反,我们需要将该行的计算更改为 rows - r 以便翻转。
考虑到所有这些,最终代码可能如下所示:
innerChar = input("enter the inner char ")
outerChar = input("enter the outer char ")
rows = int(input("enter the number of inner rows "))
for r in range(2 * rows):
#print the white space on the left
print(' ' * 2 * (2 * rows-r), end='')
if r < rows:
#top triangle
print((outerChar+' ') * (2*r + 1))
else:
#working with the row modulo 2
r %= rows
#bottom three triangles
print((outerChar+' ') * (2*r + 1), end='')
print((innerChar+' ') * (2*(rows-r) - 1), end='')
print((outerChar+' ') * (2*r + 1))