
导读\]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python**蓝桥杯真题解析100讲》,**这是解读系列的第9讲。 **打印菱形,**本题是2019年\~2020年举办的第11届蓝桥杯青少组Python编程选拔赛真题(具体日期不详),题目要求根据输入的字符和数字,打印一个菱形图形。 先来看看题目的要求吧。 ### 一.题目说明 **编程实现:** 输入一个半角英文字符和一个3 \~ 19之间的奇数 , 输出由英文字符构成的菱形图形,输入的数值为菱形中间最长一行中英文符号的个数。 **输入描述:** 第一行,构成菱形的半角英文字符 ; 第二行,菱形中最长一行英文符号的个数。 **输出描述:** 由英文符号构成的菱形。 **样例输入:** \* 11 **样例输出:**  **评分标准:** * 10分:能用输入的英文字符输出菱形, 不论输出的字符数量和形状是否正确 ; * 30分:至少对一个随机的评判用例 ,能输出高度符合要求的形状,不要求形状完全正确; * 50分:完全符合题意,即对所有评判用例均 能给出正确输出。 ### 二.思路分析 这是一道打印图案的题目,也是学习Python基础语法时常见的一类题目,考查的知识点包括循环和字符串操作。 本题的难点是如何找到菱形图形的规律,具体来说,就是给定一个行数i,就可以输出第i行的空格和英文字符。 为方便分析和理解,超平老师将题目给出的样例数据,绘制一个表格如下:  你找到这其中的规律了吗? 输入的数字是11,一共有11行字符,可以分成如下3个部分: * 前5行, * 中间行 * 后5行 前5行,每一行的空格数量从5开始,依次递减1,分别是5、4、3、2、1;每一行的\*则从1开始,依次递增2,分别是1、3、5、7、9。 中间行,即第6行,没有空格,一共有11个\*。 后5行和前5行刚好相反,每一行的空格数量从1开始,依次递增1,分别是1、2、3、4、5;每一行的\*则从9开始,依次递减2,分别是9、7、5、3、1。 如此一来,问题就变简单了,针对行数为11的情况,只要处理好前5行就可以。推而广之,如果是n行,则只需要处理好前(n//2)行就ok了。 在Python中,for...in循环默认是从0开始的, for i in range(n//2) 所以,i = 0表示第一行,i = 1表示第二行,根据前面的分析,可以得出如下对应关系: 第i行空格数:n//2 - i第i行字符数:i * 2 + 1 对于中间行,只需要输出n个字符即可。 而后n//2行,只需要将前n//2行倒过来循环就可以,每一行的空格数和字符数还是遵循上面的关系。 思路有了,接下来,我们就进入具体的编程实现环节。 ### 三.编程实现 根据上面的思路分析,我们编写代码如下:  代码不难理解,简单说明3点: 1). 在取中间行的时候,需要使用整除,Python提供了整除运算符//,如果不记得的话,也可以先使用除法/,然后再取整,如下: mid = int(n / 2) 2). 在Python中,\*运算符用途广泛,可以用于重复指定的字符和字符串,从而避免了使用循环结构; 3). Python中的range()函数,具有虎头蛇尾的特性(包含第一个,不包含最后一个),其完整的用法如下: range(start, stop[, step])start: 计数从start开始。默认是从0开始;stop: 计数到stop结束,但不包括stop;step:步长,默认为1。 所以,在倒序循环的时候,需要将步数设置为负数,同时要注意start和stop的值,确保临界值正确无误。 当输入\*和11,效果如下:  当输入#和9时,效果如下:  当输入$和13时,效果如下:  至此,整个程序就全部完成了,你也可以输入不同的符号和数字打印各种菱形效果。 ### 四.思考与总结 本题的分数为50分,代码在10行左右,涉及到的知识点包括: * 输入处理,主要是类型转换 * 循环语句,主要是for...in循环; * range()函数的特点及灵活运用; * 字符串运算,包括\*运算符和连接运算,; 题目难度一般,考查的都是基础知识点,难点在于如何找到菱形图案的规律并进行简化。 对于基础知识点,千万不可忽略,尤其是一些好用的编程技巧。比如本题中的整除运算符//、字符串重复运算符\*、字符串连接运算符+以及range()函数的细节,灵活运用这些小技巧,可以极大地提升编程效率。 寻找菱形图案的规律,对大部分同学来说,难度不大,关键在于如何将复杂的问题进行拆分,变成简单问题。 你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。 如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄 需要源码的,可以移步至"超平的编程课"gzh。