打印一个如上图所示的菱形。遇到这样的题目,我们该如何去思考呢?首先这是一个对称的图形,其次,我们不能只看到 * 这个符号,而应该每行都当成空格+ *的这种组合。那么一步一步的发掘该图形的规律。
这里重点是看*个数和前空格这两列的规律,行号可以自由的由range()函数来控制,7-*个数=2*前空格,这个公式便是该例子的核心算法。找到对称的中心点。
1 # coding=gbk 2 # 此处不考虑*的间距问题,一个*即为边长1 3 line = int(input("请输入该菱形的边长:")) 4 a = 2 * line - 1 5 # a即为菱形中间的对角线长度 6 for i in range(-a//2,a//2+1): 7 # 该range()函数的取值范围是根据行号来裁定的,中间行号定为0 8 if i < 0: 9 print(' '*(-i) + '*'*(2 * i + a)) 10 else: 11 print(' '*i + '*'*(a - 2 * i)) 12 ################################################# 13 D:untitledproject2venvScriptspython.exe D:/untitled/project2/day1/lingxing.py 14 请输入该菱形的边长:6 15 16 * 17 *** 18 ***** 19 ******* 20 ********* 21 *********** 22 ********* 23 ******* 24 ***** 25 *** 26 * 27 28 Process finished with exit code 0
上图中个代码是分为上下两部分打印的,其实这里可以用一个公式来输出上下两部分的结果,因为i取值有正负之分,所以才有了if…else…,我们可以新起一个变量l,让l一直保持为正数。即8~11行代码可以写成如下所示:
1 if i < 0: 2 l = -i 3 else: 4 l = i 5 print(' '*l + '*'*(a - 2 * l))
其实这里可以使用python中的绝对值函数abs(),abs(x),x可以是整数、浮点数和复数。函数返回x(数字)的绝对值,如果参数是一个复数,则返回它的大小。
1 # coding=gbk 2 # 此处不考虑*的间距问题,一个*即为边长1 3 line = int(input("请输入该菱形的边长:")) 4 a = 2 * line - 1 5 # a即为菱形中间的对角线长度 6 for i in range(-a//2,a//2+1): 7 # 该range()函数的取值范围是根据行号来裁定的,中间行号定为0 8 print(' '*abs(i) + '*'*(a - 2*abs(i))) 9 ############################################ 10 D:untitledproject2venvScriptspython.exe D:/untitled/project2/day1/lingxing.py 11 请输入该菱形的边长:5 12 13 * 14 *** 15 ***** 16 ******* 17 ********* 18 ******* 19 ***** 20 *** 21 * 22 23 Process finished with exit code 0