在學各種程式設計的循環語句時,經常碰到要求用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列的實心菱形
代碼輸出結果如下
*
***
*****
*******
*********
*******
*****
***
*
如果想輸出其它圖案,隻需要改變函數中的參數即可。