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

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


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

我们设菱形上半部分的总行数为rows,当前输出行数为row
当row1时候,A只有1个,星号字符一共有6个,A左右分别3个;
当row
2时候,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 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
反之少一
'''

在这里插入图片描述
运行结果:
在这里插入图片描述

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

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其实是被空格符替换了。
所以说我们可以先打印前半部分星号字符,再打印一个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方法实现。

这里只是用最简单的数学规律来分析,有更优解这里不做讨论。
纯数学规律计算,代码健壮性可能不足,欢迎指出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值