我正在尝试编写将显示奇数宽度的形状的代码。一旦形状完成,它就被放置在外形内。用户将能够输入用于形状和行数的字符。 我希望能够生成一个形状,并且带有for循环,可以产生外形。
***** .
*** ...
* .....
.*****.
...***...
.....*.....
这是我目前的代码。我只知道如何创建一个形状。
char = (input("Enter first charactrer"))
rows = int(input("enter the number of rows"))
for m in range(rows, 0, -1):
for n in range(0, rows-m):
print(end=" ")
for n in range(0,m):
print(char,end=" ")
print()
答案 0 :(得分:2)
python中一个有用的功能是,您可以将char
乘以int
,以获得重复string
的{{1}}。
例如,如果你这样做:
char
你得到:
'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
有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
上打印一样。要做到这一点,一旦过了一半,我们需要将0
变量模数为总row
的一半(现在总行数不是输入的数量,但输入数量加倍,因为你可以看到我们有一个三角形,rows
行,但输入的行值为8
)。这将使三角形的预期效果为整个三角形的一半大小。
最后,最后要考虑的是中心/内三角需要像以前一样翻转。由于我们的行计数现在从顶部向下4
而不是相反,我们需要将该行的计算更改为0
,以便将其翻转。
考虑到所有这些因素,最终的代码可能如下所示:
rows - r
答案 1 :(得分:0)
使这更容易的一种方法是首先不要担心空间。只需生成每行的非空格符号,并将它们保存到列表中。然后在最后,确定最大行的宽度,并使用str.center
方法以正确的空间量打印每一行。
def tri(n, chars='*.'):
ic, oc = chars
outer = range(1, 2*n, 2)
# top triangle chars
rows = []
for w in outer:
rows.append(w * oc)
# lower triangles chars
inner = reversed(outer)
for u, v in zip(outer, inner):
a, b = u * oc, v * ic
rows.append(a + b + a)
# Get maximum row size
width = len(rows[-1])
#Print all the rows
for row in rows:
print(row.center(width))
# test
tri(5)
<强>输出强>
.
...
.....
.......
.*******.
...*****...
.....***.....
.......*.......
要使用的字符作为双字符字符串传递给tri
,默认值为&#39; *&#39;对于内部字符(ic
)和&#39;。&#39;对于外部字符(oc
)。但是如果你想使用其他字符,你可以传递它们,如下所示:
tri(4, '@o')