1.polypon(bob,n=7,length=70) #增加可读性
2.写函数接口的时候,为了保持整洁(clean)。接口的参数,尽可能只和功能有关系,内部的尽可能想办法写在里面
e.g.用turtle用多边形画圆,涉及到n,可以用圆的周长来 n = int(2*pi*r/3)+1
当你发现一个接口很难解释的时候,很有可能有改进的空间
3.重构
重新组织函数,改善接口,提高复用率。
情景:当你发现有类似代码出现的时候
4.键盘输入
python2 raw_input
python3 input
>>>text = input('what ... is your name?\n')
what ... is your name?[输出提示]
yan guoxing [键入名称给text]
5.调试的时候,由于空格和制表符都看不到,所以比较难发现。
6.遇到return的话,直接不执行剩余的代码(dead code)
尽量保证每个可能执行的路径上都遇到return,调试的时候方便。
7.增量开发 (只增加测试一小部分代码) 保证可以正常返回,return 0.0,中间添加print
def distance(x1,y1,x2,y2):
dx , dy = x2-x1 , y2-y1
print "dx is",dx
return 0.0
8.调试的常规操作
在def的刚开始加入print,验证获得的实参没有问题【前置条件没有达到】
在return前,print,函数本身有问题【后置条件没有达到】
函数的返回值有问题,调用方式不正确
9.while True 然后if break,这种的更用
while Ture:
line = input_raw('> ')
if line == 'done':
break
print line
print 'done'
10.调试的trick,考虑哪个地方出错的概率大,哪些地方容易加上一个检查,选择一个你认为在其前后发生错误概率相差不多的一个地方进行检查,千万不要盲目的逐行查看。当然也可以运行的时候加断点,运行到下一个断点处。但这个也容易陷入糊涂。调试的能力主要还是看出来的,不是用断点试出来的,先加print然后不行断点验证最好。
11.如果你的import了自己的模块,然后之后做了修改,需要重启,或者reload。
12.针对可能无限循环( maximu recursion depth exceeded)的地方,循环前后各自加print语句.
13.无限递归的情况,要确保自己有基准情形,然后在函数的开头加print语句,观察参数有没有向基准情形靠近。
14.对于菜鸟,可以在自己每个函数的开头加入print "进入**函数"的提示,就可以很显眼的知道执行的流程
15.对于字符串的操作,总是a = b.strip().split(' '),a = ' '.join(b),但是对于列表一般都是无返回值的,如a = a.sort(),必须是 a.sort()
16.对于一个东西,你既想对他进行改变,还想用它原来的值,用[:]。
t=[1,2,3]
t2=t[:]
t2.sort()
>>>t
[1,2,3]
>>>t2
[3,2,1]