说明: 打印给出一些有规律的图案。
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 - 1
for i in range(1, n+1):
star_number = 2 * i -1
print(' ' * ((star - star_number) // 2) + '*' * star_number)
【实例 2-1】打印 7 行菱形图案
for i in range(-3, 4):
if i < 0:
pre_spaces = -i
else:
pre_spaces = i
star_num = 7 - 2 * pre_spaces
print(' ' * 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 = -i
else:
pre_spaces = i
star_num = n - 2 * pre_spaces
print(' ' * 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 = '*' * 7
print(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) |
注意值和索引可以去灵活应用。