home1.gif


说明: 打印给出一些有规律的图案。

1. 分析/思路


看如下图案如何打印出来:

  1. *
  2. ***
  3. *****
  4. *******
  5. *****
  6. ***
  7. *

分析:

行号
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

观察发现:

  1. 总共 n=7 行,star最多 n=7 个,空格数最少 0 个;
  2. pre_spaces == spaces // 2; star == n - spaces

思路:

  1. 每行print:前空格数+star数;
  2. 虽然行号有 n=range(1, 8),但发现前空格数 pre_spaces 是中心对称的 [3, 2, 1, 0, 1, 2, 3] ,由它可以联想到[-3, -2, -1, 0, 1, 2, 3] = range(-3, 4);
  3. 个数 star = n - 2*pre_spaces;
  4. 代码实现见 【实例 2】

    2. 程序


下面的三角形图案是由*组成的图案。

  1. * * *
  2. ** ** ***
  3. *** *** *****
  4. **** **** *******
  5. ***** ***** *********

【实例 1-1】打印如上所示的三角形图案

  1. n = int(input('请输入图案行数: '))
  2. for i in range(1, n+1):
  3. for j in range(1, n+1):
  4. if i + j >= n + 1:
  5. print('*', end='')
  6. else:
  7. print(' ', end='')
  8. print()
  9. for i in range(1, n + 1):
  10. print('*' * i)
  11. for i in range(n):
  12. for _ in range(n - i - 1):
  13. print(' ', end='')
  14. for _ in range(2 * i + 1):
  15. print('*', end='')
  16. print()

第三个图案也可这样实现,【实例 1-2】

  1. star = 2 * n - 1
  2. for i in range(1, n+1):
  3. star_number = 2 * i -1
  4. print(' ' * ((star - star_number) // 2) + '*' * star_number)

【实例 2-1】打印 7 行菱形图案

  1. for i in range(-3, 4):
  2. if i < 0:
  3. pre_spaces = -i
  4. else:
  5. pre_spaces = i
  6. star_num = 7 - 2 * pre_spaces
  7. print(' ' * pre_spaces + '*' * star_num)

将其通用化,打印 n 行图案的代码【实例 2-2】

  1. n = int(input('Please enter the number of row(odd):'))
  2. while n % 2 == 0:
  3. row = int(input('Please enter the odd number:'))
  4. for i in range(-((n+1)//2-1), (n+1)//2):
  5. if i < 0:
  6. pre_spaces = -i
  7. else:
  8. pre_spaces = i
  9. star_num = n - 2 * pre_spaces
  10. print(' ' * pre_spaces + '*' * star_num)

有这样一个闪电图案,如下

  1. *
  2. **
  3. ***
  4. *******
  5. ***
  6. **
  7. *
行号
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】

  1. for i in range(-3, 4):
  2. if i < 0:
  3. line = ' ' * (-i) + '*' * (4 + i)
  4. elif i > 0:
  5. line = ' ' * 3 + '*' * (4-i)
  6. else:
  7. line = '*' * 7
  8. 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) |

注意值和索引可以去灵活应用。

end1.gif