think python学习笔记(6)

增量式开发
面对复杂的程序,可以采用增量式开发
增量式开发的目标是通过每次只增加和测试少量代码,来避免长时间的调试
这种开发而关键在于
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值