【Think Python】Python笔记(七)迭代

  • 迭代:即重复运行某个代码块的能力;之前的介绍中已经有两种方法实现迭代:递归和for循环;
  • 接下来介绍另一种方法:while循环;

(一)重新赋值

  • 对变量多次赋值是合法的;
  • 给变量赋值非常有用,但是需要小心;对变量的频繁赋值,会造成代码可读性的下降,不容易调试;
  • =与数学中的符号并不是相同的:
  1. 数学上,相等是一种对称关系,但是赋值并不是一个对称的关系;
  2. 数学中的相等命题,不是对就是错,但是在python中,赋值可以使得两个变量相等,但是这两个变量并不一定必须保持这个关系;

(二)更新变量

变量赋值中一种常见的形式是更新:

x = x + 1
  • 试图更新一个不存在的变量会出现错误;
  • 所以在更新之前需要进行初始化;

(三)while语句

计算机经常被用来自动处理重复性的任务。计算机很擅长无纰漏地重复相同或者相似的任务, 而人类在这方面做的不好。在计算机程序中,重复也被称为迭代(iteration)

def countdown(n):
    while n > 0:
        print(n)
        n = n -1
    print('Blastoff')
  • while语句的执行过程:

    • 判断条件是真还是假;
    • 如果为false,退出while循环,执行接下来的句子;
    • 如果为true,运行while循环语句的主题,运行结束返回第一步;
  • 循环主体应该改变一个或者多个变量的值,这样才能让条件判断最终为false,否则,循环将得不到终止;

(四)break

break可以跳出一层循环;

while循环的这种写法很常见,因为你可以在循环的任何地方判断条件 (而不只是在循环开始),而且你可以积极地表达终止条件(“当出现这个情况是终止”), 而不是消极地表示(“继续运行直到出现这个情况”)

(五)平方根

循环常用于计算数值的程序中,这种程序一般从一个概略的值开始,迭代地进行计算;

牛顿法计算平方根

这个方法,可以用来计算a的平方根

>>> a = 4
>>> x = 3
>>> y = (x + a/x) / 2
>>> y
2.166666666667

可以看出第一次计算已经比较接近4的平方根,即2,再次计算

>>> x = y
>>> y = (x + a/x) / 2
>>> y
2.00641025641

可以看出,随着迭代的次数增加,越来越接近真实的值;

  • 一般来说,我们并不知道应该计算几次才能得到正确的答案,但是当估计值不再变化的时候,就获得了正确答案
    • x == y的时候,可以停止计算;
    • 但是直接让两个浮点数相等是比较危险的,因为浮点数只能大约表示,有些现实中的数字是不能用浮点数精确表示的,所以需要有一个决定其精度的epsilon来作为阈值;
while True:
    print(x)
    y = (x + a/x) / 2
    if abs(y - x) < epsilon:
        break
    x = y

(六)算法(Algorithm)

算法是什么:

什么不是算法:
  • 在学习一位数乘法时, 可能背出了乘法表。实际上,你只是记住了100个确切的答案。这种知识并不是算法性的;
什么是算法:
  • 如果你比较 “懒”,你可能就会找到一些诀窍。比如说为了计算 n 和 9 的乘积,你可以把 n−1 作为乘积的第一位数,再把 10−n 作为第二位数,从而得到它们的乘积。这个诀窍是将任意个位数 与 9 相乘的 **普遍解法 **。这就是一种算法;
  • 算法的特点之一 就是不需要过多的脑力计算。算法是一个机械的过程,每一步都是依据一组简单的规则跟着上一步来执行的;
  • 执行算法很是乏味,但是设计算法是何有挑战性的,是计算机科学的核心;

(七)调试

当你开始写更为复杂的程序时,你会发现大部分时间都花费在调试上。更多的 代码意味着更高的出错概率,并且会有更多隐藏bug的地方;

  • 减少调试时间的一个方法是对分调试,即:

    • 如果程序有100行,你一次检查一行,就需要100步;
    • 试着将问题拆为两半。在代码中间部分或者附近的地方,寻找一个可以检查的中间值。加上一行 print 语句(或是其他具有可验证效果的代码),然后运行程序;
    • 判断出错的地方在上半部分还是下半部分;随后进行类似的操作;
    • 这样每次可以排除一半的代码;对于100行的代码,最多需要6步即可定位响应出错的行;
  • 在实践中,可能并不能很好的确定程序的 “中间部分” 是什么,也有可能并不是那么好检查。 计算行数并且取其中间行是没有意义的。相反,多考虑下程序中哪些地方比较容易出问题,或者 哪些地方比较容易进行检查。然后选定一个检查点,在这个断点前后出现bug的概率差不多;====

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章