首先应该了解菱形在输出时,每一行的组成有哪些规律,并且除了中间的一行,上部分和下半部分应该是对称的 我们设菱形上半部分的总行数为rows,当前输出行数为row 由此可以总结一个规律,在菱形的上半部分,随着row的增加,A的变化依次为 1 ;3 ;5 … 随着row的增加A的变化趋势应该是一个公差为2,首项为1的等差数列,项数即为row,而星号变化趋势应该总行数rows减去当前行数再加1。 这里因为菱形下部分也是类似的,A也是一个等差数列,星号字符就是当前目标行数(仅以下半部分为开始) 下面就是代码实现: 运用刚刚所讲的规律: 下面是运行结果: 也可以采用Python center()方法 ,返回一个原字符串居中,并使用空格填充至长度 width 的新字符串。默认填充字符为空格。 语法: 例如: 了解了这个函数后,下面可以用这个函数实现输出实心菱形: 下面是运行效果图: 空心菱形的规律与实心菱形的很像,可以把它想成就是实心菱形,只不过出去首尾两行,每一个行只有两个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. 下面是代码实现: 空心菱形则无法用center方法实现。 这里只是用最简单的数学规律来分析,有更优解这里不做讨论。
这是一个我们要准备输出的一个菱形的模板 ,一共有7行 7列
当row1时候,A只有1个,星号字符一共有6个,A左右分别3个;
当row2时候,A有3个,星号字符一共有4个,A左右分别2个;
当row==3的时候,A有5个,星号字符一共有2个,A左右分别1个;
星号字符因为是关于字符A对称的所有只用考虑左边或者右边,随着row的增加,星号字符的变化依次为 3 ;2 ;1 …
一:输出一个实心菱形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
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 反之少一 '''
运行结果:
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
注意使用center方法时候,因为字符串是不支持原地修改的,所以要引入新的空间,这里我是直接做了输出。
二:
输出一个空心菱形:
所以说我们可以先打印前半部分星号字符,再打印一个A字符,然后打印空格,打印下一个A,最后打印后半部分星号字符。# 星号字符的规律与实心菱形一样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))
纯数学规律计算,代码健壮性可能不足,欢迎指出。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算