首先应该了解菱形在输出时,每一行的组成有哪些规律,并且除了中间的一行,上部分和下半部分应该是对称的

python输岀一个菱形 python用*输出菱形_字符串

这是一个我们要准备输出的一个菱形的模板 ,一共有7行 7列

我们设菱形上半部分的总行数为rows,当前输出行数为row

当row1时候,A只有1个,星号字符一共有6个,A左右分别3个;

当row2时候,A有3个,星号字符一共有4个,A左右分别2个;

当row==3的时候,A有5个,星号字符一共有2个,A左右分别1个;

由此可以总结一个规律,在菱形的上半部分,随着row的增加,A的变化依次为 1 ;3 ;5 …

星号字符因为是关于字符A对称的所有只用考虑左边或者右边,随着row的增加,星号字符的变化依次为 3 ;2 ;1 …

随着row的增加A的变化趋势应该是一个公差为2,首项为1的等差数列,项数即为row,而星号变化趋势应该总行数rows减去当前行数再加1。

这里因为菱形下部分也是类似的,A也是一个等差数列,星号字符就是当前目标行数(仅以下半部分为开始)

下面就是代码实现:

一:输出一个实心菱形

运用刚刚所讲的规律:

def PrintDiamond(n):
if n & 1 == 0: return 'error'
row = int((n - 1) / 2) # row为上部分行数
for i in range(1, row+1): # 上部分规律
print('*'*(row-i+1)+'A'*(2*i-1)+'*'*(row-i+1))
print('A'*n) # 打印中间行
for i in range(1, row+1): # 下部分规律
print('*'*i+'A'*(n-2*i)+'*'*i)
return 'OK'
if __name__ == '__main__':
n = int(input())
print(PrintDiamond(n))

下面是运行结果:

测试值为n=11

python输岀一个菱形 python用*输出菱形_字符串长度_02

也可以采用Python center()方法 ,返回一个原字符串居中,并使用空格填充至长度 width 的新字符串。默认填充字符为空格。

语法:

str.center(width[, fillchar])

例如:

str_a = 'aoligei'
str_b = str_a.center(10, '-') # 表示定义最终输出的字符串长度为10,不足用-填充。
print(len(str_a)) # 因为当前字符串长度为7为奇数,减去width之后为3
# 不能保证均匀填充,最终字符串右边填充的字符的会比左边多1
print(str_b)
print(len(str_b))
'''

注意当width减去字符串长度的数目为奇数的时候,即是无法满足左右两边填充字符相等

如果当前需要填充字符串长度为偶数的时候,最终字符串左边填充的字符的会比右边多1

反之少一

'''

python输岀一个菱形 python用*输出菱形_字符串_03

运行结果:

python输岀一个菱形 python用*输出菱形_字符串长度_04

了解了这个函数后,下面可以用这个函数实现输出实心菱形:

def PrintDiamond(n):
if n & 1 == 0: # 判断是否为奇数
return 'error'
for i in range(1, n+1, 2): # 上部分 ,当i==n的时候center不做任何填充
# 这里我直接设置步长为2 其实符合上面我们提到的规律,是一个公差为2的等差数列
print(('A'*i).center(n, '*'))
for i in range(n-2, 0, -2): # 下部分 步长-2类似
print(('A'*i).center(n, '*'))
return 'OK'
if __name__ == '__main__':
n = int(input())
print(PrintDiamond(n))

下面是运行效果图:

这里测试输入的n为12和11

python输岀一个菱形 python用*输出菱形_python输岀一个菱形_05

python输岀一个菱形 python用*输出菱形_字符串_06

注意使用center方法时候,因为字符串是不支持原地修改的,所以要引入新的空间,这里我是直接做了输出。

二:

输出一个空心菱形:

空心菱形的规律与实心菱形的很像,可以把它想成就是实心菱形,只不过出去首尾两行,每一个行只有两个A字符,并且中间的A其实是被空格符替换了。

所以说我们可以先打印前半部分星号字符,再打印一个A字符,然后打印空格,打印下一个A,最后打印后半部分星号字符。

当然首尾行不用打印空格,也不用打印第二个A字符。

首先我们知道关于打印A的数目是一个等差数列,只不过上部分和下部分首相和公差不一样而已,由此可以知道在上半部分,除去首行,当row=2,3,4,5…的时候 A的数目分别为2row-1 那么我们再减去每一行首尾的A字符 是不是就得到了空格符的数目,所以空格符的数目:2row-1-2=2*row-3

下半部分同样是可以得到,row=1,2,3,4…的时候,空格符的数目为9-2*row ,与上半部分不同的是,这里我们不用去掉下部分的首行,而应该去掉尾行,所以说这里row可以等于1.

下面是代码实现:

# 星号字符的规律与实心菱形一样11
def PrintDiamond(n):
if n & 1 == 0: return 'error'
row = int((n - 1) / 2)
for i in range(1, row + 1): # 上部分
if i == 1: # 应该排除首行
print('*' * (row - i + 1) + 'A' + '*' * (row - i + 1))
else:
print('*' * (row - i + 1) + 'A' + ' ' * (2 * i - 3)
+ 'A' + '*' * (row - i + 1))
print('A' + ' ' * (n - 2) + 'A') # 中间行
for i in range(1, row + 1): # 下部分
if i == row: # 应该排除尾行
print('*' * i + 'A' + '*' * i)
continue
print('*' * i + 'A' + ' ' * (9 - 2 * i) + 'A' + '*' * i)
return 'OK'
if __name__ == '__main__':
n = int(input())
print(PrintDiamond(n))

空心菱形则无法用center方法实现。

这里只是用最简单的数学规律来分析,有更优解这里不做讨论。

纯数学规律计算,代码健壮性可能不足,欢迎指出。