个人认为:编程就是一个把思维逻辑用计算机特定语言(譬如:Python)实现的过程,即编程的本质是思维,计算机语言是工具。
本篇的主题就是想通过解剖Python如何画多个同心圆的案例,尽量把自己对编程思维的理解准确地呈现出来,期望可以起到抛砖引玉的效果。
问1:需要引入Python哪个模块?
答:一般涉及到画圈都是要用到俗称“小海龟”的turtle模块,调用其里面的划线、画圈方法。
import turtle as tl # 引用turtle并命名为别名
问2:现实中画圈要用到笔的,turtle应该也有调用笔的方法吧?
答:有的,所以需要为其“笔”创建一个对象,犹如笔需要被手握。
t = tl.Pen() #将画笔创建一个对象,后续用它来划线、画圈
问3:笔有了,可以尝试来画个圈。会用到Python提供的什么方法呢?
答:圈的英文单词是circle,Python很人性化的用这个单词定义画圈方法。
t.circle(30) # 三个参数,此处只用到半径,并设半径为30
画圈案例
问4:上图的圈是默认的灰色,而且线条也比较细。是否可以自己设置线条颜色与粗细呢?
答:没问题的,Python贴心提供了对应的方法。考虑到要画同心圆,所以颜色尽量丰富些,用列表来定义用到的颜色吧。
tl.width(3) # 设置线条宽度tColorList = ['red','blue','black','yellow'] # 定义四种线条颜色t.color(tColorList[0]) # 选择red
设置圈的线条粗细与颜色案例
问5:尝试画第二圈,但它的圆心是否就是第一个圈的圆心呢?
答:是不是,先动手画出来再看。要使第二个圈包围第一个圈,当然要扩大半径的。
t.color(tColorList[1]) # 选择bluet.circle(50) # 第二个圈
第二个圈
问6:上图实现了第二个圈包围第一个圈,但圆心不在同一位置。此时考虑的当然是要移动笔了,使两个圈圆心同位置。Python是否有移动笔的功能?
答:有的,并且很贴心地用goto这个单词来命名方法。此时需要做的是第一个圈箭头位置向下移动20就能达到目的。把第一个圈箭头位置是做X轴与Y轴交叉点(原点),则只是向Y轴负轴移动20。
t.goto(0,-20) # 第一个圈箭头位置向下移动20
两个同心圆案例
问7:找规律。相邻的两个圈半径相差20,则需要在上一个圈箭头位置向Y轴负轴方向移动20?
答:我们可以再画3个圈验证下。
t.color(tColorList[2]) # 选择blackt.goto(0,-40) # 第一个圈箭头位置向下移动40t.circle(70) # 第三个圈t.color(tColorList[3]) # 选择yellowt.goto(0,-60) # 第一个圈箭头位置向下移动60t.circle(90) # 第四个圈t.color(tColorList[0]) # 选择bluet.goto(0,-80) # 第一个圈箭头位置向下移动80t.circle(110) # 第五个圈
找规律案例
结论:存在规律,即每增加一个同心圈则离原点往Y轴负轴方向移动20。
问8:看上图可以发现,移动画笔会留下一条轨迹(将所有圈连接起来的线)。是否存在控制移动画笔时不划线呢?
答:Python的强大在于真正与现实生活逻辑的吻合度特别高,提供了提起画笔再移动,到达目的地后放下画笔继续画圈功能。代码示例(其他圈类似):
t.color(tColorList[1]) # 选择bluet.penup() # 提起笔t.goto(0,-20) # 第一个圈箭头位置向下移动20t.pendown() # 放下笔t.circle(50) # 第二个圈
去掉移动画笔的痕迹案例
问9:规律也找到了,但如果要画的同心圈个数成千上百,我们不可能每个圈用四段代码。所以,必须要引入循环语句。该如何设置变量?如何控制结束循环条件?如何设置颜色?
答:采用For循环的方式来实现。
import turtle as tl # 引用turtle并命名为别名t = tl.Pen() #将画笔创建一个对象,后续用它来划线、画圈t.width(3) # 设置线条宽度\tColorList = ['red','blue','black','yellow'] # 定义四种线条颜色\for i in range(20): # 画20个同心圈t.color(tColorList[i%4]) # 设置线条颜色 t.penup() # 提起笔 t.goto(0,-20*i) # 第一个圈箭头位置向下移动-20*i t.pendown() # 放下笔 t.circle(30+20*i) # 第i+1个圈 i += 1 # 控制循环趋近结束条件
循环画多个同心圈的效果图
【注】:改变range()的参数就能改变同心圈的个数。
问10:如果自己执行过这段代码,就会发现一个效率问题,即随着通圈的个数增加,程序执行的耗时太长。是否可以提升执行效率呢?
答:调用Python的一个方法speed(),上例中For循环前增加下面一段代码,立马解决该问题。
t.speed(0) # 设置速度,0表示最快
同心圈最终效果图
总结
个人认为编程思维的最重要的两点:
1、要与问问的观念,并要善于问问题;
2、问题间逐次递进且逻辑关联性强。
结语
编程语言的学习就是一个多练习的过程。在不停地敲代码过程中理解Python精义,在理解的过程中又用敲代码的方式来解答与验证自己的疑问点,逐渐巩固自己对Python这门语言的理解,直至掌握,无捷径可走。思维是编程的基础,也是可以通过编程提高思维能力。