《Think Python 2e》学习精粹(七): 迭代
- 迭代:即重复运行某个代码块,有利用递归进行迭代、利用 for 循环进行迭代、利用 while 语句实现迭代等迭代方式;
1、重新赋值
- 对同一变量进行多次赋值是合法的,新的赋值会使得已有的变量指向新的值(同时不再指向旧的值);
>>> x = 5
>>> x
5
>>> x = 7
>>> x
7
- 给变量重新赋值非常有用,但是需要小心使用,对变量频繁重新赋值会使代码难于阅读,不易调试;
2、更新变量
- 重新赋值的一个常见方式是 更新 (update),更新操作中变量的新值会取决于旧值;
>>> x = x + 1
- 如果试图去更新一个不存在的变量,则会返回一个错误,这是因为 Python 是先求式子右边的值,然后再把所求的值赋给 x ;
>>> x = x + 1
NameError: name 'x' is not defined
- 在更新变量之前,须先 初始化(initialize)这个变量,通常是通过一个简单的赋值实现;
>>> x = 0
>>> x = x + 1
- 通过加1来更新变量叫做 递增(increment),减1叫做 递减(decrement);
3、while 语句
- while 语句的执行流程如下,这种形式的流程叫做循环(loop):
- 首先判断条件为真还是为假;
- 如果为假,退出 while 语句,然后执行接下来的语句;
- 如果条件为真,则运行 while 语句体,运行完再返回第一步;
- 循环主体应该改变一个或多个变量的值,这样的话才能让条件判断最终变为假, 从而终止循环;
4、break
- 有些时候循环执行到一半才知道循环该结束了这种情况下,可以使用 break 语句来跳出循环;
while True:
line = input('> ')
if line == 'done':
break
print(line)
print('Done!')
5、平方根
- 循环常用于计算数值的程序中,这类程序一般从一个大概的值开始,然后迭代式地进行改进;
- 牛顿法 (Newton’s method) 是计算平方根的一种方法,想求 a 的平方根,从任意一个估算值 x 开始,利用下面的公式计算出更为较为精确的估算值:
while True:
print(x)
y = (x + a/x) / 2
if y == x:
break
x = y
- 检查两个浮点数是否相等比较危险,与其检查两个浮点数是否完全相等,计算二者之差的绝对值或数量级更为安全;
if abs(y-x) < epsilon:
break
6、算法
- 算法:牛顿法就是一个 算法 (Algorithm)示例,是解决一类问题的计算机制 (牛顿法是计算平方根);
- 算法是一个机械的过程,每一步都是依据一组简单的规则跟着上一步来执行的;
- 执行算法的过程是很乏味的,但是设计算法就比较有趣了,是计算机科学的核心;
- 理解自然语言等一些人类下意识能做的事情,目前还没有算法;
7、调试
- “对分调试”法:
- 将问题拆为两半;
- 在代码中间部分或者附近的地方即中间点,添加打印可以检查的值的 print 语句(或其他具有可验证效果的代码),然后运行程序;
- 如果中间点检查出错了,那么就说明程序的前半部分存在问题,如果没问题,则说明是后半部分出错了;
- 每次这样检查,就可以将需要搜索的代码行数减少一半,100行的程序经过6步之后,理论上将找到出错的代码行;
- 确定程序的 “中间部分” :
- 计算行数并且取其中间行是没有意义的;
- 多考虑程序中哪些地方比较容易出问题,或者哪些地方比较容易进行检查;
- 选定一个检查点(断点),这个断点前后出现bug的概率差不多。