python菱形_python如何输出菱形与空心菱形详解与巧妙地使用center方法

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

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05la29DaGFybXM=,size_16,color_FFFFFF,t_70#pic_center

这是一个我们要准备输出的一个菱形的模板 ,一共有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

20200604215907222.png#pic_center

也可以采用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

反之少一

'''

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L05la29DaGFybXM=,size_16,color_FFFFFF,t_70#pic_center

运行结果:

20200604213921283.png#pic_center

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

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

20200604215030274.png#pic_center

20200604215042201.png#pic_center

注意使用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方法实现。

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值