xuzhengfu / pilot

进入编程世界的第一课
1 stars 0 forks source link

p1-5-structure-4 第五章 程序的基本结构(四):循环 #23

Open xuzhengfu opened 4 years ago

xuzhengfu commented 4 years ago

1. 了解 循环的基本概念

循环也是一种常见结构,它代表了一种常见模式:批处理。

计算机特别擅长的就是重复劳动,不知疲倦而且不走样,我们的程序经常是一次处理一组数据,对其中的每个数据做一些操作,然后下一个,然后下一个…… 直到这组数据都处理完,这就是循环的基本概念了。

循环可以用下面的逻辑来表述:

  1. 从一组数据 S 中取出下一个数据 x => x 是一个变量,这对应一个赋值语句;
  2. 对 x 执行若干操作 => 这对应一个代码段,里面可以有各种操作符和函数;
  3. 如果 S 中还有未取出的数据,则回到第 1 步继续 => 这对应一个逻辑判断 if...else,但这个 “回到第 1 步” 是什么呢?
  4. 结束。

我们前面介绍的 值与变量、操作符与函数、逻辑判断 与 if...else 分支,已经构成了相当完整的程序 “写作工具”,可以从理论上证明这套写作工具能写出任何我们想要的程序(只要是能用计算机解答的问题),不过有些逻辑表述起来会有些麻烦,或者不那么易懂,所以一般的编程语言会针对这些问题再提供一些附加的 “写作工具”,这一章的 循环 和下一章的 异常处理 都是这种性质。

最早的一批编程语言对这个操作的实现真的就是按照 “回到第 1 步” 的字面意思做的,就是使用 goto 指令的跳转语句,这个语句让计算机跳到指定的一行执行,这样我们就可以复用上面的第 1 和第 2 步,不断的循环执行它们。不过后来 goto 语句闯了祸,被人类封印了,说白了就是 goto 太自由太强大了,可以在程序中任意的指定下一个执行的语句,当程序变大变复杂时导致程序的执行顺序非常难以预测,程序就很容易出错。这段历史非常深刻的改变了编程世界的方方面面,我们后面介绍 结构化编程 和 面向对象 时还会讲到这个故事。

人们转而使用一种 “有限制的跳转” 来实现循环,Python 支持两种形式的循环语句,分别是 for 循环 和 while 循环。

2. 了解 for 循环

Python 的 for 循环可以对一组数据做循环,比如给出一个列表,可以针对列表里每个元素按顺序循环一遍。

primes = [2, 3, 5, 7]
for prime in primes:
    print(prime)
  1. for prime in primes 的意思是,从 primes 中取出下一个元素,将其赋值给 prime(这个变量叫做“循环变量”),然后运行下面缩进的代码段;
  2. 在 for 语句最后冒号下面缩进的代码段,叫做“循环体”,是循环中反复执行的片段,这里我们简单地调用 print() 函数打印循环变量 prime 的值;
  3. 循环体执行完毕就回到第1步执行 for 那一行,直到 primes 中取不出下一个元素,即列表循环完毕,整个循环结束。

Python 提供有一个内置函数 range() 可以构造任何 整数等差数列,经常拿来和 for 循环一起用。

在官方手册中 range() 函数的参数是这么定义的:

range(stop)
range(start, stop[, step])

上面的文档说明 range() 这个函数有两个版本:第一个接受一个参数;第二个接受三个参数,其中最后一个有缺省值,所以可以不提供(方括号括起来的部分表示有缺省值、可提供可不提供的参数,这个方括号和上面表示列表的不是一回事哦):

第一个版本中,唯一的参数是 range() 要构造的数列的上限,range(stop) 会输出从 0 到 stop-1 的 整数列; 第二个版本中,前两个参数分别是 range() 要构造的数列的下限和上限,range(start, stop) 会输出从 start 到 stop-1 的 整数列;如果还提供了第三个参数 step,这是等差数列的公差,range(start, stop, step) 会输出 [start, start+step, start+step*2,...] 这样一列整数,最大不超过 stop-1。

range() 输出的是一个 “迭代器(iterator)”,是 Python 非常有特色也非常强大的工具,可惜目前我们还不容易搞清楚这个东西,我们把它放在第四部分中,学完迭代器顺便还能知道 for 循环的本质是什么。

for 可以循环的东西远不止列表,我们在第四部分介绍迭代器的时候会再回来讨论 for 循环。

3. 了解 while 循环

while 循环是更一般化的一种循环结构,基本上就是我们在本章开头描述的 “只要某条件成立就继续循环,否则结束循环” 的逻辑,那个使得循环继续的条件叫做 “循环条件”。

和 for 循环不一样,while 的循环条件非常自由,完全由我们的代码来控制,这样的好处是可以处理各种情况的循环,坏处是,有可能玩砸掉。

count = 0
while count < 5:
    print(count)
    count += 1

试想上面的循环,如果我们在循环体里没有给 count 执行 +1,那么 count 的值就永远也不会达到和超过 5,这个循环就会无限进行下去,直到这个页面挂掉。所以在写 while 循环时要特别小心的检查,确保循环条件是会终止的,避免出现无限循环的情况。

4. 了解 break 和 continue

在 for 和 while 的循环体里可以执行 breakcontinue 两个命令:

break 直接终止整个循环,跳到循环体之后的代码执行; continue 跳过本次循环余下的代码,直接回到 for(取下一个元素)或者 while(进行循环条件检查)。 这两个命令一般用于特定边界情况的处理。

小结

  1. 循环就是反复执行一组特定操作,也是程序中常见的结构;
  2. Python 中的 for 循环可以针对一组数据进行循环,而 while 则是根据循环条件成立与否来决定循环是否继续;
  3. 可以使用 continue 和 break 语句来改变循环的执行流程。

Logging

2020-02-21 01:11:03 initialize