增量式开发
面对复杂的程序,可以采用增量式开发
增量式开发的目标是通过每次只增加和测试少量代码,来避免长时间的调试
这种开发而关键在于
1.从一个能运行的程序开始,每次只增加少量改动
2.用临时变量储存中间值,便于检查
3.删除脚手架代码
组合
写一个函数,接受两个点作为参数,分别是圆心和圆周上一点,然后计算圆的面积
圆心坐标xc,yc 圆周上的点的坐标存储在xp和yp中
第一步是计算两点距离,也就是半径
radius = diatance(xc,yc,xp,yp)
用得到的半径计算圆的面积
result = area(radius)
将这些步骤封住在一个函数里
def circle_area(xc,yc,xp,yp):
radius = distance(xc,yx,xp,yp)
result = area(radius)
return result
临时变量radius和result作为中间变量,在函数调试的过程中很有用,但是如果确定可以正常运行,就可以将他们合并,使程序更加简洁
def circle_area(xc,yc,xp,yp):
return area(distance(xc,yc,xp,yp))
布尔函数
函数可以返回布尔值,对于隐藏函数内部的复杂测试代码非常方便
def is_divisible(x,y):
if x%y ==0:
return True
else:
return False
==运算符的返回值就是一个bool值,可以通过直接返回判断运算的结果,让代码变得更简单
def is_divisible(x,y):
return x%y==0
使用if判断语句写条件的时候,当条件返回值是bool型变量,无需加判断
再谈递归
计算一些递归定义的数学函数。递归定义类似循环定义,因为定义中包含一个对已经定义事物的引用
类似阶乘
如果可以递归定义某样东西,就可以通过程序计算他,第一步是先决定有哪些形参,阶乘很明显输入是一个整型数
def factorial(n):
if n==0:
return 1
#0的阶乘是1,与其他数不同
else:
recurse = factorial(n-1)
result = n*recurse
return result
先是不断地递归,直到n=0不再进行递归调用,然后将返回的值,再向上层传递,传递给recurse,进行向上传递的阶乘运算
信仰之跃
当遇到一个函数调用的时候,不再去跟踪执行流程,而是假设这个函数正确运行并且返回了正确的结果
递归程序也可以这样理解,当遇到递归调用时,不用顺着执行流程,假设每次递归调用能够正确工作,假设函数可以正常得到前n-1的阶乘,那么能否正常得到n的阶乘
再举一例
除了阶乘外,使用递归定义的最常见的数学函数就是fibonacci(斐波那契数列)
fibonacci(0) = 0
fibonacci(1) = 1
fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)
用代码来表示
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)
通过假设可以很好地验证这个递归写法的正确性
检查类型
如果阶乘函数输入1.5会出现无限循环,因为在不断减1的递归中,n永远不会等于0,所以递归调用永远不会停止
有两个方法
第一泛化factorial函数,使其能够处理浮点数
第二用factorial检查实参的类型
使用内建函数isinstance来验证实参的类型,同时确保是正数
def factorial(n):
if not isinstance(n,int):
print('not int')
return None
elif n<0:
print('negative integars')
return None
elif n == 0:
return 1
else:
return n*factorial(n-1)
调试
将一个大函数分解为较小的函数为调试生成了自然的检查点,如果一个函数的运行没有按照预期,有三个可能
1.该函数获得的实参有问题,违反先决条件
2.该函数的问题,违反后置条件
3.返回值或者它的使用方法有问题
通过在函数开头和return前添加print,来显示执行流程
迭代
即重复运行某个代码块的能力,在递归中也利用了递归实现了迭代,在for循环中也可以实现迭代,接下来使用while语句实现迭代
重新赋值
多同一变量进行多次赋值是合法的,新的赋值会使得已有的变量指向新的值
注意赋值与相等的区别
更新变量
重新赋值的一个常见方式是更新,更新操作中变量的新值会取代旧值
更新变量一定要先确定变量存在
要先对它进行初始化
while语句
def countdown(n):
while n>0:
print(n)
n = n-1
print('Blastoff')
while流程
1.判断条件为真还是假
2.如果为假,退出while语句,然后执行接下来的语句
3.如果为真,则运行while语句体,运行后返回第一步
重点改变量的值,不要产生无限循环
break
有些时候循环执行到一半才结束循环,这种情况下,你可以使用break语句来跳出循环
while True:
line = input('>')
if line == done:
break
print(line)
print('Done')
循环条件是True,所以循环会一直执行直到碰到break