2025年3月31日 星期一 乙巳(蛇)年 正月初一 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

【Python实践】打印各种形状

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

来吧,展示

虽说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) + '* ')

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

思路

关于正三角形组成

在这里插入图片描述

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

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

关于菱形组成

在这里插入图片描述

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

在这里插入图片描述

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

结束语

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

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