记录day3

空调一如既往的吵,好吵

今天在做turtle的模块的联系,做了一个多边形的函数,虽说没任何含金量,但觉得还是重在要分享记录吧。

一个多边形的函数

 1 import turtle
 2 
 3 def square(t, length):
 4     for i in range(4):
 5         t.fd(length)
 6         t.lt(90)
 7         
 8 def polygon(turtle, length, numOfSide):
 9     degree = 360 / numOfSide # 根据几边形决定每次转动的角度
10     for i in range(numOfSide):
11         turtle.fd(length)
12         turtle.lt(degree)
13         
14 bob = turtle.Turtle()
15 polygon(turtle = bob, numOfSide = 9, length = 100)
16 turtle.mainloop()

 一个不是很准确的圆

 1 import turtle
 2 
 3 def square(t, length):
 4     for i in range(4):
 5         t.fd(length)
 6         t.lt(90)
 7         
 8 def polygon(turtle, length, numOfSide):
 9     degree = 360 / numOfSide # 根据几边形决定每次转动的角度
10     for i in range(numOfSide):
11         turtle.fd(length)
12         turtle.lt(degree)
13         
14         
15 def circle(turtle, radius):
16     '''
17     由于不能精确算出一个半径对应几边形,但是一个基本的逻辑是半径越大,边数也要越大
18     还有一个问题就是,我也无法精确算出每一步到底改走多远,一般来说半径越大,边数越大,移动举例要越小
19     '''
20     numOfSide = radius
21     length = 1000 / numOfSide
22     polygon(turtle, length, numOfSide)
23     
24     
25     
26 bob = turtle.Turtle()
27 # polygon(turtle = bob, numOfSide = 9, length = 100)
28 circle(bob, 200)
29 turtle.mainloop()

 再补一个也不是很精确的弧形

 1 import turtle
 2 
 3 def square(t, length):
 4     for i in range(4):
 5         t.fd(length)
 6         t.lt(90)
 7         
 8 def polygon(turtle, length, numOfSide):
 9     degree = 360 / numOfSide # 根据几边形决定每次转动的角度
10     for i in range(numOfSide):
11         turtle.fd(length)
12         turtle.lt(degree)
13         
14         
15 def circle(turtle, radius):
16     '''
17     由于不能精确算出一个半径对应几边形,但是一个基本的逻辑是半径越大,边数也要越大
18     还有一个问题就是,我也无法精确算出每一步到底改走多远,一般来说半径越大,边数越大,移动举例要越小
19     '''
20     numOfSide = radius
21     length = 1000 / numOfSide
22     polygon(turtle, length, numOfSide)
23     
24 def arc(turtle, radius, angle):
25     '''
26     先说一下这个函数不能以circle函数为基础做,只能以polygon的基础来做
27     为什么呢?
    事实上polygon也不可以
28 circle函数里面并没有可以调节不封闭的选项 29 ''' 30 numOfSide = radius 31 length = 1000 / numOfSide 32 x = int(angle / 360 * numOfSide) 33 degree = 360 / numOfSide # 根据几边形决定每次转动的角度 34 for i in range(x): 35 turtle.fd(length) 36 turtle.lt(degree) 37 38 39 40 bob = turtle.Turtle() 41 # polygon(turtle = bob, numOfSide = 9, length = 100) 42 # circle(bob, 200) 43 arc(bob, 200, 180) 44 turtle.mainloop()

 接下去看了答案,心都痛了,董数学还是好,可以知道圆的周长可以推出每步走多长。

就只贴下对arc的修改就好了,书中说到的接口概念很是科学,不要给接口调用者他搞不清怎么回事的参数,尽量提供干净的接口

 1 def arc(turtle, radius, angle):
 2     '''
 3     先说一下这个函数不能以circle函数为基础做,只能以polygon的基础来做
 4     为什么呢?
 5     circle函数里面并没有可以调节不封闭的选项
 6     '''
 7     zhouChang = 2 * math.pi * radius
 8     numOfSide = radius
 9     length = zhouChang / numOfSide
10     x = int(angle / 360 * numOfSide)
11     degree = 360 / numOfSide # 根据几边形决定每次转动的角度
12     for i in range(x):
13         turtle.fd(length)
14         turtle.lt(degree)

对于重构的描述也是很精彩啊,我们观察到,如果做arc函数,必须以修改polygon函数,我们发现自己写的代码和polygon其实很多相似,为什么不把这2部分提炼出来,重新写一个更通用的函数polyline呢?

1 def polyline(turtle, length, numOfSide, lines):
2     degree = 360 / numOfSide # 根据几边形决定每次转动的角度
3     for i in range(lines):
4         turtle.fd(length)
5         turtle.lt(degree)

暂时跳过这节的作业,实在是噩梦般的会议,等周末来补吧。

posted @ 2017-06-14 22:40  onhacker  阅读(122)  评论(0)    收藏  举报