在学习python列表的过程中,书1上第30页提到了一个案例:画五彩圆。
下面是示例代码:
import turtle
t = turtle.Pen()
colors = ['orange', 'pink', 'green', 'blue', 'violet']
for x in range(20):
t.pencolor(colors[x % 5])
t.circle(x)
t.right(72)
这引起了我的思考:为什么要用模5这样的形式?为什么不用最容易想到的方法:画一个圆,一个圆画完之后换颜色画下一个圆?
于是我写了如下的代码作对比:
i = 0
for i in range(5):
t.pencolor(colors[i])
for x in range(20):
t.circle(x)
t.right(72)
i += 1
分别运行这两段程序后,我发现我的代码画出来的图要比示例代码画出来的图线条之间更密集。于是我分析了一下这两段代码的执行逻辑的区别。
示例代码的逻辑为:
- 示例代码画圆的半径从0开始。当x为0时,选用颜色列表里的第一个元素(即color[0]),以半径为0画圆。接着画笔转向,为下一次循环做准备。
- 第二次循环x的值变为1,选用颜色列表里的第二个元素(即color[1]),以半径为1画圆。接着画笔转向。
- 依次类推,x为2、3、4时,分别选用颜色列表里第3、4、5个元素作为颜色,并分别以x的值为半径画圆
- 当x变为5时,由于5模5与0模5的值相同,都为1,因此此时又选用了颜色列表的第一个颜色,并以x为5继续画圆。
此时便可以看出示例代码线条更疏松的原因了。我们发现当x取5时,才会再选回颜色列表中的第一个颜色。
以此类推:
第一个颜色画圆时的半径x分别为0、5、10、15…(模5为0的所有取值);
第二个颜色画圆时的半径x分别为1、6、11…(模5为1的所有取值);
第三个颜色画圆时的半径x分别为2、7、12…(模5为2的所有取值);
第四个颜色画圆时的半径x分别为3、3、13…(模5为3的所有取值);
第五个颜色画圆时的半径x分别为4、9、14…(模5为4的所有取值)。
也就是说,对于一个特定的元素来说,它所画的圆的半径均相差5个单位。而采用我的代码,每个圆之间只差1个单位(因为一个颜色会从1到20依次为半径画圆之后才会换下一个颜色),从而导致了我写的代码比示例代码画出来的圆之间更加密集。
除此之外,很显然示例代码的五个元素画出来的圆大小并不统一,(因为就没过一个圆的半径是相等的呀!!)而我写的这个代码每个颜色画出来的圆的集合是相等的。
总结
用我浅薄知识分析了一下:
- 首先我写的这段代码用了两层循环,时间复杂度比示例代码要大;
- 代码示例无法使每个颜色画出来的圆的集合相等;
- 应该还会有既能保证大小相等,有更简便的算法,但是由于本人目前水平不够不知道如何实现,希望在不久的将来可以callback一下。
Python+Excel职场办公数据分析 ↩︎