Think Python Exercise 4.0

  1. 写一个名为 square 的函数,接受一个名为 t 的形参,t 是一个海龟。这个函数应用这只海龟画一个正方形。

写一个函数调用,将 bob 作为实参传给 square ,然后再重新运行程序。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import turtle

def square(t):
	for i in range(4):
		t.fd(100)
		t.lt(90)

bob = turtle.Turtle()

square(bob)

turtle.mainloop()
  1. square 增加另一个名为 length 的形参。修改函数体,使得正方形边的长度是 length ,然后修改函数调用,提供第二个实参。 重新运行程序。用一系列 length 值测试你的程序。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import turtle

def square(t,length):
	for i in range(4):
		t.fd(length)
		t.lt(90)

bob = turtle.Turtle()

square(bob,100)
square(bob,120)
square(bob,150)
square(bob,200)

turtle.mainloop()
  1. 复制 square ,并将函数改名为 polygon 。增加另外一个名为 n 的形参并修改函数体,让它画一个正n边形(n-sided regular polygon)。提示:正n边形的外角是$360/n$度。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import turtle

def polygon(t,length,n):
	for i in range(n):
		t.fd(length)
		t.lt(360/n)

bob = turtle.Turtle()

polygon(bob,100,6)
polygon(bob,100,8)
polygon(bob,100,15)

turtle.mainloop()

看了答案后,觉得把360/n放到循环外面比较好,这样的话只需要计算一次。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import turtle

def polygon(t,length,n):
    angle = 360 / n
	for i in range(n):
		t.fd(length)
		t.lt(angle)

bob = turtle.Turtle()

polygon(bob,100,6)
polygon(bob,100,8)
polygon(bob,100,15)

turtle.mainloop()
  1. 编写一个名为 circle 的函数,它接受一个海龟t和半径r作为形参, 然后以合适的边长和边数调用 polygon ,画一个近似圆形。 用一系列r值测试你的函数。

提示:算出圆的周长,并确保 length * n = circumference

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import turtle
import math

def polygon(t,length,n):
	for i in range(n):
		t.fd(length)
		t.lt(360/n)

def circle(t,r):
	"""t是一只乌龟。r是所要画的圆的半径。
	根据公式$2 \pi r / n$确定用于近似圆的多边形的边长,n是多边形的边数。
	"""
	circumference = 2 * math.pi * r #周长
	n = 200 #多边形边数,我想不到选多少边数合适,直接设200,画一个200边形
	length = circumference / n
	polygon(t,length,n)


bob = turtle.Turtle()

circle(bob,150) #半径r设为150

turtle.mainloop()

答案是这样来确定n的值(多边形的边数)的:周长除以3,取整后加1,即n = int(circumference/3)+1,也就是近似为周长的三分之一,圆的半径的两倍。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import turtle
import math

def polygon(t,length,n):
    angle = 360 / n
	for i in range(n):
		t.fd(length)
		t.lt(angle)

def circle(t,r):
	"""t是一只乌龟。r是所要画的圆的半径。
	根据公式$2 \pi r / n$确定用于近似圆的多边形的边长,n是多边形的边数。
	"""
	circumference = 2 * math.pi * r #周长
	n = int(circumference/3)+1 #改的是这句
	length = circumference / n
	polygon(t,length,n)


bob = turtle.Turtle()

circle(bob,150) #半径r设为150

turtle.mainloop()
  1. 完成一个更泛化(general)的 circle 函数,称其为 arc ,接受一个额外的参数 angle ,确定画多完整的圆。angle 的单位是度,因此当 angle=360 时, arc 应该画一个完整的圆。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import turtle
import math

def polyline(t,length,n,m):
	"""n是多边形的边数,m是指画出多边形的前多少条边
	n和m必须为整数。
	"""
	for i in range(m):
		t.fd(length)
		t.lt(360/n)

def arc(t,r,angle):
    """angle取值范围是1~360,度数。
    画出圆的一部分。
    """
    circumference = 2 * math.pi * r #周长
    n = 200 #多边形边数,我想不到选多少边数合适,直接设200
    length = circumference / n #多边形边长
    m = int(n * angle / 360) # 画出多边形的前m条边
    polyline(t,length,n,m)

bob = turtle.Turtle()

arc(bob,150,30)
arc(bob,100,150)
arc(bob,150,270)

turtle.mainloop()

我是先算出来圆的周长,然后算出用于近似这个圆的多边形的边数,然后再算出近似圆的一部分需要的多边形的边数;

答案是先算圆的一部分对应的长度,根据这个长度得到用边数为n的多边形去近似圆,然后得到一边的长度,以及多边形的外角的角度。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import turtle
import math

def polyline(t,length,n,angle):
	for i in range(n):
		t.fd(length)
		t.lt(angle)

def arc(t,r,angle):
    """angle取值范围是1~360,度数。
    画出圆的一部分。
    """
    arc_length = 2 * math.pi * r * angle / 360

    n = int(arc_length / 3) + 1
    step_length = arc_length / n
    step_angle = angle / n
    polyline(t,step_length,n,step_angle)

bob = turtle.Turtle()

arc(bob,150,30)
arc(bob,100,150)
arc(bob,150,270)

turtle.mainloop()

根据这一题的代码,可以重写第四题的circle函数。circle函数可以看作是arc函数的一个特例。

1
2
def circle(t,r):
	arc(t,r,360)