版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
版权
Coding专栏收录该内容
8 篇文章0 订阅
订阅专栏
首先应该了解菱形在输出时,每一行的组成有哪些规律,并且除了中间的一行,上部分和下半部分应该是对称的
这是一个我们要准备输出的一个菱形的模板 ,一共有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也是一个等差数列,星号字符就是当前目标行数(仅以下半部分为开始)
下面就是代码实现:
一:输出一个实心菱形
运用刚刚所讲的规律:
defPrintDiamond(n):if n&1==0:return'error' row=int((n-1)/2)# row为上部分行数for iinrange(1, row+1):# 上部分规律print('*'*(row-i+1)+'A'*(2*i-1)+'*'*(row-i+1))print('A'*n)# 打印中间行for iinrange(1, row+1):# 下部分规律print('*'*i+'A'*(n-2*i)+'*'*i)return'OK'if __name__=='__main__': n=int(input())print(PrintDiamond(n))
下面是运行结果:
测试值为n=11
也可以采用Python center()方法 ,返回一个原字符串居中,并使用空格填充至长度 width 的新字符串。默认填充字符为空格。
语法:
str.center(width[, fillchar])
例如:
str_a='aoligei' str_b= str_a.center(10,'-')# 表示定义最终输出的字符串长度为10,不足用-填充。print(len(str_a))# 因为当前字符串长度为7为奇数,减去width之后为3# 不能保证均匀填充,最终字符串右边填充的字符的会比左边多1print(str_b)print(len(str_b))''' 注意当width减去字符串长度的数目为奇数的时候,即是无法满足左右两边填充字符相等 如果当前需要填充字符串长度为偶数的时候,最终字符串左边填充的字符的会比右边多1 反之少一 '''
运行结果:
了解了这个函数后,下面可以用这个函数实现输出实心菱形:
defPrintDiamond(n):if n&1==0:# 判断是否为奇数return'error'for iinrange(1, n+1,2):# 上部分 ,当i==n的时候center不做任何填充# 这里我直接设置步长为2 其实符合上面我们提到的规律,是一个公差为2的等差数列print(('A'*i).center(n,'*'))for iinrange(n-2,0,-2):# 下部分 步长-2类似print(('A'*i).center(n,'*'))return'OK'if __name__=='__main__': n=int(input())print(PrintDiamond(n))
下面是运行效果图:
这里测试输入的n为12和11
注意使用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.
下面是代码实现:
# 星号字符的规律与实心菱形一样11defPrintDiamond(n):if n&1==0:return'error' row=int((n-1)/2)for iinrange(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 iinrange(1, row+1):# 下部分if i== row:# 应该排除尾行print('*'* i+'A'+'*'* i)continueprint('*'* i+'A'+' '*(9-2* i)+'A'+'*'* i)return'OK'if __name__=='__main__': n=int(input())print(PrintDiamond(n))
空心菱形则无法用center方法实现。
这里只是用最简单的数学规律来分析,有更优解这里不做讨论。
纯数学规律计算,代码健壮性可能不足,欢迎指出。