您当前的位置:首页 > 计算机 > 编程开发 > Python

【Python实践】打印各种形状

时间:04-23来源:作者:点击数:

来吧,展示

虽说Python要写的优美,但有些人就不按套路出牌!就喜欢整一行代码干完活:

row = int(input('请输入行数:'))
assert row > 1, '形状的行数必须大于等于2!'
print('正方形实心:')
print(*('* ' * row for col in range(row)), sep='\n')
print('正方形空心:')
print(*('* ' + ('* ' if col in [0, row - 1] else '  ') * (row - 2) + '*' for col in range(row)), sep='\n')
print('正三角形实心:')
print(*(' ' * (row - col - 1) + '* ' * (col + 1) for col in range(row)), sep='\n')
print('正三角形空心:')
print(*(' ' * (row - col - 1) + '* ' + ('* ' if col in [0, row - 1] else '  ') * (col - 1) + ('*' if col else '') for col in range(row)), sep='\n')
print('倒三角形实心:')
print(*(' ' * col + '* ' * (row - col) for col in range(row)), sep='\n')
print('倒三角形空心:')
print(*(' ' * col + '* ' + ('* ' if col in [0, row - 1] else '  ') * (row - col - 2) + ('*' if col < row - 1 else '') for col in range(row)), sep='\n')
assert row > 2, '菱形的行数必须大于等于3!'
print('菱形实心:')
print(*(' ' * ((row + 1) // 2 - col - 1) + '* ' * (col + 1) for col in range((row + 1) // 2)), *(' ' * (col + 1 if row % 2 else col) + '* ' * (row // 2 - col) for col in range(row // 2)), sep='\n')
print('菱形空心:')
print(*(' ' * ((row + 1) // 2 - col - 1) + '* ' + ('* ' if not col else '  ') * (col - 1) + ('*' if col else '') for col in range((row + 1) // 2)), *(' ' * (col + 1 if row % 2 else col) + '* ' + ('* ' if col == row // 2 - 1 else '  ') * (row // 2 - col - 2) + ('*' if col < row // 2 - 1 else '') for col in range(row // 2)), sep='\n')
# row_half = ((row + 1) // 2) if row % 2 else row // 2  # 从总行数变成半三角行数
# print('菱形实心:')
# print(*(' ' * (row_half - col - 1) + '* ' * (col + 1) for col in range(row_half)), *(' ' * ((col + 1) if row % 2 else col) + '* ' * ((row_half - col - 1) if row % 2 else (row_half - col)) for col in range(row_half - 1 if row % 2 else row_half)), sep='\n')
# print('菱形空心:')
# print(*(' ' * (row_half - col - 1) + '* ' + ('* ' if not col else '  ') * (col - 1) + ('*' if col else '') for col in range(row_half)), *(' ' * ((col + 1) if row % 2 else col) + '* ' + ('* ' if col + 1 == row_half else '  ') * ((row_half - col - 3) if row % 2 else (row_half - col - 2)) + ('*' if col < row_half - (2 if row % 2 else 1) else '') for col in range(row_half - 1 if row % 2 else row_half)), sep='\n')

其中最后注释掉的部分是我一开始直接手撸的,写的是格外的艰难,后来上面的方法就是复制粘贴上面正三角、倒三角,调试调试修改一下就成了,而且写的比较简短(相较下面注释部分而言)

教学

上面的写法对于新手来说,应该已经懵了吧,没关系,接下来进入正式教学,每行都理解,逐行下去,你就明白了。

因为博主今天想发博文的时候断网了,然后觉得一直用热点的话太浪费流量了,所以在本地编辑器里编辑好了再一次性粘贴到博文里的,请欣赏:

# 空心方法:
# 1、按规律输出空格
# 2、使用 \b 退格并覆盖输出

# row = int(input('请输入行数:'))  # 行数
row = 5  # 测试用固定值(省的每次运行重复输入)
# ******************************************************************************************************************************************************
print('正方形实心:')  # 行数 == 列数
for r in range(row):  # r的范围:[0, ..., row-1],共 row 个数字
    print('* ' * row)
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):  # 精确到每行每列的输出,所有图形都可以用这种处理方法
        print('* ', end='')
    print()
# ******************************************************************************************************************************************************
print('正方形空心:')
for r in range(row):
    if r in [0, row - 1]:  # 如果是第一行、最后一行,则全输出 * ,否则输出 * 空格 *
        print('* ' * row)
    else:
        print('* ' + '  ' * (row - 2) + '* ')
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if r in [0, row - 1] or c in [0, row - 1]:  # 如果是第一行、最后一行或第一列、最后一列,输出 * 其他输出空格
            print('* ', end='')
        else:
            print('  ', end='')
    print()
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        print('* ', end='')
        if 0 < r < row - 1 and 0 < c < row - 1:  # 如果是矩形中间部分,输出两个退格再输出两个空格
            print('\b\b  ', end='')
    print()
# ******************************************************************************************************************************************************
print('左上角是直角的等腰直角三角形:')  # 正方形的一半
for r in range(row):
    print('* ' * (row - r))
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c >= r:  # c == r 是斜向右上的一条分界线!
            print('* ', end='')
    print()
# ******************************************************************************************************************************************************
print('左下角是直角的等腰直角三角形:')  # 正方形的一半
for r in range(row):
    print('* ' * (r + 1))
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c <= r:  # c == r 是斜向右下的一条分界线!
            print('* ', end='')
    print()
# ******************************************************************************************************************************************************
print('左上角是直角的非等腰直角三角形:')  # 正方形的一半,将 * 之间的空格去掉
for r in range(row):
    print('*' * (row - r))
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c >= r:  # c == r 是斜向右上的一条分界线!
            print('*', end='')
    print()
# ******************************************************************************************************************************************************
print('左下角是直角的非等腰直角三角形:')  # 正方形的一半,将 * 之间的空格去掉
for r in range(row):
    print('*' * (r + 1))
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c <= r:  # c == r 是斜向右下的一条分界线!
            print('*', end='')
    print()
# ******************************************************************************************************************************************************
print('尖向上的正三角形(视觉相似):')  # 左上角是直角的非等腰直角三角形填充为空格 + 左下角是直角的等腰直角三角形
for r in range(row):
    print(' ' * (row - r - 1), end='')
    print('* ' * (r + 1))
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c > r:
            print(' ', end='')
    for c in range(r + 1):
        print('* ', end='')
    print()
# ******************************************************************************************************************************************************
print('尖向下的正三角形(视觉相似):')  # 左下角是直角的非等腰直角三角形填充为空格 + 左上角是直角的等腰直角三角形
for r in range(row):
    print(' ' * r, end='')
    print('* ' * (row - r))
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c < r:
            print(' ', end='')
    for c in range(row - r):
        print('* ', end='')
    print()
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c < r:
            print(' ', end='')
        else:
            print('* ', end='')
    print()
# ******************************************************************************************************************************************************
print('尖向上的空正三角形(视觉相似):')  # 空心手法和正方形一致
for r in range(row):
    print(' ' * (row - r - 1), end='')
    if not r:
        print('* ')
    elif r == row - 1:
        print('* ' * row)
    else:
        print('* ' + '  ' * (r - 1) + '* ')
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c > r:
            print(' ', end='')
    for c in range(r + 1):
        if c not in [0, r] and not r == row - 1:
            print('  ', end='')
        else:
            print('* ', end='')
    print()
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c > r:
            print(' ', end='')
    for c in range(r + 1):
        print('* ', end='')
        if 0 < r < row - 1 and 0 < c < r:
            print('\b\b  ', end='')
    print()
# ******************************************************************************************************************************************************
print('尖向下的空正三角形(视觉相似):')  # 空心手法和正方形一致
for r in range(row):
    print(' ' * r, end='')
    if not r:
        print('* ' * row)
    elif r == row - 1:
        print('* ')
    else:
        print('* ' + '  ' * (row - r - 2) + '* ')
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c < r:
            print(' ', end='')
    for c in range(row - r):
        if c not in [0, row - r - 1] and r not in [0, row - 1]:
            print('  ', end='')
        else:
            print('* ', end='')
    print()
print('-' * row * 2)  # 区分形状专用分界线~
for r in range(row):
    for c in range(row):
        if c < r:
            print(' ', end='')
        else:
            print('* ', end='')
            if 0 < r < row - 1 and r < c < row - 1:
                print('\b\b  ', end='')
    print()
# ******************************************************************************************************************************************************
if row % 2:  # 假如是奇数行,行数+1
    row += 1
print('偶数菱形实心:')  # 尖向上的正三角形(视觉相似) + 尖向下的正三角形(视觉相似)
print('上半三角形行数:', row // 2)
# 只举例一种组合代码的例子:
for r in range(row // 2):
    print(' ' * (row // 2 - r - 1), end='')
    print('* ' * (r + 1))
for r in range(row // 2):
    print(' ' * r, end='')
    print('* ' * (row // 2 - r))
# ******************************************************************************************************************************************************
print('偶数菱形空心:')  # 尖向上的空正三角形(视觉相似) + 尖向下的空正三角形(视觉相似)
print('上半三角形行数:', row // 2)
# 只举例一种组合代码的例子:
for r in range(row // 2):
    print(' ' * (row // 2 - r - 1), end='')
    if not r:
        print('* ')
    else:
        print('* ' + '  ' * (r - 1) + '* ')
for r in range(row // 2):
    print(' ' * r, end='')
    if r == row // 2 - 1:
        print('* ')
    else:
        print('* ' + '  ' * (row // 2 - r - 2) + '* ')
# ******************************************************************************************************************************************************
row += 1
print('奇数菱形实心:')  # 尖向上的正三角形(视觉相似) + 尖向下的正三角形(视觉相似)【行数 - 1】
print('上半三角形行数:', (row + 1) // 2)
# 只举例一种组合代码的例子:
for r in range((row + 1) // 2):
    print(' ' * ((row + 1) // 2 - r - 1), end='')
    print('* ' * (r + 1))
for r in range((row - 1) // 2):
    print(' ' * (r + 1), end='')
    print('* ' * ((row - 1) // 2 - r))
# ******************************************************************************************************************************************************
print('奇数菱形空心:')  # 尖向上的空正三角形(视觉相似) + 尖向下的空正三角形(视觉相似)【行数 - 1】
print('上半三角形行数:', (row + 1) // 2)
# 只举例一种组合代码的例子:
for r in range((row + 1) // 2):
    print(' ' * ((row + 1) // 2 - r - 1), end='')
    if not r:
        print('* ')
    else:
        print('* ' + '  ' * (r - 1) + '* ')
for r in range((row - 1) // 2):
    print(' ' * (r + 1), end='')
    if r == (row - 1) // 2 - 1:
        print('* ')
    else:
        print('* ' + '  ' * ((row - 1) // 2 - r - 2) + '* ')
# ******************************************************************************************************************************************************
# 测奇数
print('菱形实心:')  # 组合一下,不管是奇数行菱形还是偶数行菱形都能适用(奇数上半 + 偶数下半)
# 只举例一种组合代码的例子:
for r in range((row + 1) // 2):
    print(' ' * ((row + 1) // 2 - r - 1), end='')
    print('* ' * (r + 1))
for r in range(row // 2):
    print(' ' * (r + row % 2), end='')
    print('* ' * (row // 2 - r))
# ******************************************************************************************************************************************************
print('菱形空心:')  # 组合一下,不管是奇数行菱形还是偶数行菱形都能适用(奇数上半 + 偶数下半)
# 只举例一种组合代码的例子:
for r in range((row + 1) // 2):
    print(' ' * ((row + 1) // 2 - r - 1), end='')
    if not r:
        print('* ')
    else:
        print('* ' + '  ' * (r - 1) + '* ')
for r in range(row // 2):
    print(' ' * (r + row % 2), end='')
    if r == row // 2 - 1:
        print('* ')
    else:
        print('* ' + '  ' * (row // 2 - r - 2) + '* ')
# ******************************************************************************************************************************************************
# 测偶数
row += 1
print('菱形实心:')  # 组合一下,不管是奇数行菱形还是偶数行菱形都能适用(奇数上半 + 偶数下半)
# 只举例一种组合代码的例子:
for r in range((row + 1) // 2):
    print(' ' * ((row + 1) // 2 - r - 1), end='')
    print('* ' * (r + 1))
for r in range(row // 2):
    print(' ' * (r + row % 2), end='')
    print('* ' * (row // 2 - r))
# ******************************************************************************************************************************************************
print('菱形空心:')  # 组合一下,不管是奇数行菱形还是偶数行菱形都能适用(奇数上半 + 偶数下半)
# 只举例一种组合代码的例子:
for r in range((row + 1) // 2):
    print(' ' * ((row + 1) // 2 - r - 1), end='')
    if not r:
        print('* ')
    else:
        print('* ' + '  ' * (r - 1) + '* ')
for r in range(row // 2):
    print(' ' * (r + row % 2), end='')
    if r == row // 2 - 1:
        print('* ')
    else:
        print('* ' + '  ' * (row // 2 - r - 2) + '* ')

代码提供了多种打印方式(不然不会有这么多的代码),可以参考我的,也可以自己动脑创新实现新的思路,如果有更妙的实现方法可以在评论区留言让更多的人学到哦~

思路

关于正三角形组成

在这里插入图片描述

简单来说,三角形就是被一个三角形推倒的三角形(前面一个指的是正方形的一半去掉空格,后面的这个三角形指的是正方形的一半)

倒三角形就和正三角形方向相反,一样的操作。

关于菱形组成

在这里插入图片描述

可见画好正三角形,可以组成不少形状,如果要画平行四边形(菱形是特殊的平行四边形),那可以水平画,只有菱形这个特殊一点的能中心对称的画

在这里插入图片描述

这和正三角形类似,是被推倒的矩形,如果这个平行四边形特殊点是菱形,那么这是被推倒的正方形。

结束语

更多图形可以评论留言,不复杂的话会更新进来。感谢大家的支持!

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门