重构
当我们书写circle时,可以复用polygon,因为多边形和圆形非常相似,但是arc(弧形)就会有所不同
因为前者计算运用了中心角360,但是弧度并不是
第一种代替方案:
是在arc函数中直接书写出画图的运算,不使用函数
def arc(t,n,angle):
arc_length = 2*math.pi*r*angle/360
n = int(arc_length/3) + 1
#n要取整数
step_length = arc_length/n
step_angle = angle/n
for i in range(n):
t.fd(step_length)
t.lt(step_angle)
这个函数后半部分跟polygon重合程度较高,所以单独创造一个更通用的函数,相对于polygon增加一个形参,创建polyline
def polyline(t,n,length,angle):
for i in range(n):
t.fd(length)
t.lt(angle)
想要保留原函数的接口,又想要更加通用的函数,所以将其内部变为更小的单元组成
利用新写的polyline重写polygon和arc
def polygon(t,n,length):
angle = 360.0/n
polyline(t,n,length,angle)
def arc(t,r,angle):
arc_length = 2*math.pi*r*angle/360
n = int(arc_length/3)+1
step_length = arc_length/n
step_angle = float(angle)/n
polyline(t,n,step_length,step_angle)
#最后用arc重写circle
def circle(t,r):
arc(t,r,360)
重新整理一个程序以改进函数接口的促进代码复用的这个过程,被称作重构。在书写过程中,发现arc和polygon的代码有高重合度的部分,所以我们把它单独挑出来写成一个函数
开发方案
开发计划是一种编写程序的过程,我们在这个例子中使用了封装和泛化
1.从没有函数但是能正常运行开始
2.挑选重合的部分转化为函数
3.通过适当的增加形参,泛化该函数
4.寻找适当的部分重构函数,将函数变为更小的单元
重点在于一边编程一边设计,简化自己的程序
文档字符串
文档字符串是位于函数开始位置的一个字符串,解释了函数的接口(多行注释)
按照惯例,所有的文档字符串都是三重引号的字符串,也被称为多行字符串,因为三重引导允许字符串超过一行
用于解释函数的关键信息
文档字符串是接口设计中重要的一部分,一个良好的接口应该很好解释,不然需要重新设计
调试
接口像是函数和调用者之间的合同,调用者同意提供合适的参数,函数同意完成相应的工作
例:polyline函数需要四个实参,t必须是一个Turtle,n必须是一个整型数,length应该是一个正数,angle必须是一个数,单位是度数
这些要求被称为先决条件,因为在函数执行前就成立了。函数结束时的条件是后置条件,后置条件包括函数预期的效果以及任何其他附带效果
先决条件不满足是调用一方bug
后置条件不满足是函数内部bug
条件和递归
能够根据程序的状态执行不同命令的if语句
首先介绍两个新的运算符:地板除(floor division)和求余(modulus)
地板除和求余
地板除运算符先做除法,然后将结果保留到正数
求余运算符
会将两个数相除,然后返回余数
hours = minutes//60
#求余
remainder = minutes%60
求余常用于判断能否整除,或者用于提取个位或十位的数字
布尔表达式
返回值是真或者假
如果为真是True,假是False
(与C++不同,c++本质是0或1,返回值也是0或1)
true和false是bool类型的特殊值,并不是字符串
关系运算符
逻辑运算符
有三个逻辑运算符:and,or和not。
在python中任何非0的数字都被解释为真
有条件的执行
最简单的形式是if语句
if x>0:
print(x)
if之后的布尔表达式被称为条件语句,如果为真,缩进的语句会被执行,如果为假,那么会跳过
if语句也是由一个句头跟着一个缩进的语句体,类似的语句被称为复合语句
有时一条语句都没有的语句体也是有用的,这种情况下可以使用pass,这样程序就什么都不会做
if x<0:
pass
二选一执行
if语句的第二种形式是二选一执行
这些选择被称为分支
if x%2 == 0:
print(1)
else:
print(0)