
说明: 打印给出一些有规律的图案。
1. 分析/思路
看如下图案如何打印出来:
*************************
分析:
| 行号 n |
个数 star |
* 前空格数 pre_spaces |
总空格数 spaces |
|---|---|---|---|
| 1 | 1 | 3 | 6 |
| 2 | 3 | 2 | 4 |
| 3 | 5 | 1 | 2 |
| 4 | 7 | 0 | 0 |
| 5 | 5 | 1 | 2 |
| 6 | 3 | 2 | 4 |
| 7 | 1 | 3 | 6 |
观察发现:
- 总共 n=7 行,star最多 n=7 个,空格数最少 0 个;
- pre_spaces == spaces // 2; star == n - spaces
思路:
- 每行print:前空格数+star数;
- 虽然行号有 n=range(1, 8),但发现前空格数 pre_spaces 是中心对称的 [3, 2, 1, 0, 1, 2, 3] ,由它可以联想到[-3, -2, -1, 0, 1, 2, 3] = range(-3, 4);
- 个数 star = n - 2*pre_spaces;
- 代码实现见 【实例 2】
2. 程序
下面的三角形图案是由*组成的图案。
* * *** ** ****** *** ********* **** ************ ***** *********
【实例 1-1】打印如上所示的三角形图案
n = int(input('请输入图案行数: '))for i in range(1, n+1):for j in range(1, n+1):if i + j >= n + 1:print('*', end='')else:print(' ', end='')print()for i in range(1, n + 1):print('*' * i)for i in range(n):for _ in range(n - i - 1):print(' ', end='')for _ in range(2 * i + 1):print('*', end='')print()
第三个图案也可这样实现,【实例 1-2】
star = 2 * n - 1for i in range(1, n+1):star_number = 2 * i -1print(' ' * ((star - star_number) // 2) + '*' * star_number)
【实例 2-1】打印 7 行菱形图案
for i in range(-3, 4):if i < 0:pre_spaces = -ielse:pre_spaces = istar_num = 7 - 2 * pre_spacesprint(' ' * pre_spaces + '*' * star_num)
将其通用化,打印 n 行图案的代码【实例 2-2】
n = int(input('Please enter the number of row(odd):'))while n % 2 == 0:row = int(input('Please enter the odd number:'))for i in range(-((n+1)//2-1), (n+1)//2):if i < 0:pre_spaces = -ielse:pre_spaces = istar_num = n - 2 * pre_spacesprint(' ' * pre_spaces + '*' * star_num)
有这样一个闪电图案,如下
*******************
| 行号 n |
个数 star |
* 前空格数 pre_spaces |
索引 n’ |
总空格数 spaces |
|---|---|---|---|---|
| 1 | 1 | 3 | -3 | 6 |
| 2 | 3 | 2 | -2 | 4 |
| 3 | 5 | 1 | -1 | 2 |
| 4 | 7 | 0 | 0 | 0 |
| 5 | 5 | 3 | 1 | 2 |
| 6 | 3 | 3 | 2 | 4 |
| 7 | 1 | 3 | 3 | 6 |
代码如下【实例 3】
for i in range(-3, 4):if i < 0:line = ' ' * (-i) + '*' * (4 + i)elif i > 0:line = ' ' * 3 + '*' * (4-i)else:line = '*' * 7print(line)
2. 扩展
- range的应用小结 | 实例 | 推导 | | —- | —- | | [0, 1, 2, 3] -> range(4) | [0, 1, 2, …, n] -> range(n+1) | | [1, 2, 3] -> range(1, 4) | [1, 2, …, n] -> range(1, n+1) | | [5, 8, 11, 14] -> range(5, 15, 3) | [star, star+step, star+step+step, …, n] -> range(star, n+1, step) | | [-3, -2, -1, 0, 1, 2, 3] -> range(-3, 4) | [-n, -n-1, -n-2, …, n-2, n-1, n] -> range(-n, n+1) |
注意值和索引可以去灵活应用。

