在学各种编程的循环语句时,经常碰到要求用print函数打印各种星星图案,这类型的题目比较考验人的逻辑思维能力。一开始你可能只能画出直角三角形,后面了解规律后,能够画出菱形了。今天和大家分享如何在一个程序中用string.center( )方法,来实现打印空心/实心的等腰三角形/菱形等四种图案。
首先你要清楚这四种图案的星星是按什么规律排布的,如果你不清楚,你可以先自己手动画出一个星星模版出来,然后根据你要画的图形,自己手动去移动星星,把目标图案先画出来,然后去找找图案规律。这种方式直观,便于打印各种图案。
这里分析下图案规律:
1.实心的等腰三角形/菱形每行星星数量是奇数,整体是左右对称的
2.每行之间距离是等间距的,实心等腰三角形/菱形每行的星星数可以表示成2n-1或4n-3,这里n表示行数
3.菱形图案的上半部分与等腰三角形相同
4.空心图案是把实心图案中间部分的星星替换成空格
使用不同方法打印星星时,所需要考虑的参数不一样,这里使用for循环+函数+string.center( )方法来实现。这里说下我使用此方法的目的:
1.函数中一个普通形参与两个默认形参,普通形参可以用来表示等腰三角形或菱形的最大行星星数,两个默认形参都设成bool值,利用False == 0,True == 1的性质来区分实心/空心,以及等腰三角形/菱形。
2.string.center(num, str)方法有两个参数,第一个参数表示最大字符数,第二参数表示用来填充的字符。此方法实现每行星星的对称排列。
3.for循环,大部分打印星星的题目都需要使用循环来实现。
下面给出代码
def triangle_diamond(line:int, sep:bool = False,shape:bool = False):
#line表示等腰三角形或菱形的列数,sep表示空心还是实心(默认False表示实心,Ture表示空心),shape默认False表示三角形,Ture表示菱形
if shape == False: #打印三角形
row = int((line+1)/2) #n从0开始,中间列n+1,row表示行数
for i in range(1, row+1):
if i == 1: # 打印第一行的1个星星
str_star = "*"*(2*i-1)
print(str_star.center(line," "))
elif i < row: # 打印中间行的星星
str_star = ("*"+" "*(2*i-3)*sep +"*"*(2*i-3)*(1-sep)+"*") # 根据sep不同值,打印实心或者空心的图案
print(str_star.center(line," ")) # 把每行对称排列
else: # 打印三角形最后一行
str_star = ("*"+" "*sep+"*"*(1-sep))*(i-1)+"*"
print(str_star.center(line, " "))
else: # 打印菱形
n = int((line+1)/2) # n表示行数
for i in range(1,n+1): # 前半部分基本与等腰三角形相同
if i == 1:
str_star = "*"*(2*i-1)
print(str_star.center(line," "))
else: # 不需要将中间最大行与其他行分开
str_star = ("*"+" "*(2*i-3)*sep +"*"*(2*i-3)*(1-sep)+"*")
print(str_star.center(line," "))
for i in range(n+1, line+1): # 打印下半部分菱形
if i < line:
str_star = ("*" + " " * (2 * (line+1-i)-3) * sep + "*" * (2*(line+1-i)-3) * (1 - sep) + "*")
print(str_star.center(line, " "))
else:
str_star = "*"
print(str_star.center(line, " "))
triangle_diamond(9, sep=False, shape=True) # 打印9列的实心菱形
代码输出结果如下
*
***
*****
*******
*********
*******
*****
***
*
如果想输出其它图案,只需要改变函数中的参数即可。