
3.3 循环
3.3.1 阶乘运算程序
阶乘是数学里的一种术语,阶乘运算是指从1乘以2乘以3乘以4一直乘到所要求的数,在Python程序设计中,实现阶乘运算过程如下。

在上述例子中,使用for循环语句将range函数生成的序列中的数值累积相乘,实现阶乘运算的效果。range函数是Python提供的一个内置函数,它可以生成一个数字序列,for语句在执行时,循环计时器变量i被设置为1,然后执行循环语句,i依次被设置为从1到n+1之间的所有值,每设置一个新值都会执行一次循环语句,当i等于n+1时,循环结束。
3.3.2 for循环基本结构
Python中的for循环可以遍历任何序列的项目,如一个列表或者一个字符串。for循环的基本格式如下。

可以使用for循环将序列中的字母依次显示,具体实例如下。


上面实例中,for循环将“Python”字符串中的字母依次显示。
3.3.3 计算1~100奇数之和
在整数中,能被2整除的数是偶数,不能被2整除的数是奇数。接下来,我们开发一个计算1~100奇数之和的程序,使用PyCharm创建100以内所有奇数之和项目,项目名称为odd_sum,同时创建计算器程序文件odd_sum.py,操作步骤如下。
1)单击“File”→“New Project”命令创建odd_sum项目,如图3-9所示。

图3-9 使用PyCharm新建项目
2)配置新项目名称为odd_sum,项目解释器使用的虚拟环境路径为H:\python,如图3-10所示。

图3-10 配置odd_sum虚拟环境
3)odd_sum项目创建成功,如图3-11所示。

图3-11 odd_sum项目创建成功
在创建的odd_sum.py程序文件中输入程序,代码内容如下。

上面的代码运行结果,如图3-12所示。

图3-12 odd_sum项目运行结果
3.3.4 while循环基本结构
For循环遍历指定的序列,而while循环不断运行,直到指定的条件不满足为止。while循环是判断表达式为真时执行循环体,也称为“当型循环”,如果判断表达式一开始就为假,则不会执行循环体。while循环的基本结构如下。

当判断表达式为True时,条件满足,程序执行循环语句,其执行流程如图3-13所示。

图3-13 while语句循环流程图
在while循环中,同样需要注意冒号和缩进。另外,在Python编程语言中,没有do…while循环。下面通过循环从1数到5并输出。

在上例中,程序初始将number设置为1,指定从1开始计数。接下来的while循环被设置为只要number小于等于5,就继续运行这个循环。循环中的print函数输出打印number的值,再使用number+=1将其值加1。
3.3.5 range函数
Python提供range()函数能轻松地生成一系列的数字,它一般用在for循环中。range()函数返回的是一个可迭代对象(类型是对象),而不是列表类型,所以打印的时候不会打印列表,它的基本格式如下。

参数说明:
① start:计数从start开始,默认是从0开始。例如range(5)等价于range(0, 5)。
② stop:计数到stop结束,但不包括stop。例如range(0, 5)是[0, 1, 2, 3, 4],不包含5。
③ step:步长,默认为1。例如range(0, 5) 等价于range(0, 5, 1)。
在3.3.4的示例中通过while语句输出1~5的数值,下面通过range()函数输出1~5的数值。


上述的代码好像应该打印数字1~6,但是它实际上不会打印6,因为该函数在输出时不包括后面的数字6。
如果想要创建数字列表,可以使用list()函数将range()的结果直接转换为列表。list()函数是对象迭代器,可以把range()返回的可迭代对象转换为一个列表,返回的变量类型为列表。如果将range()作为list()的参数,输出的结果将是一个数字列表。
具体操作如下。

上面的示例中,使用type()函数查看number变量的类型,结果是list列表类型。
3.3.6 break、continue和pass
1.break语句
在前面的内容中,介绍了for循环和while循环,但如果想要立即退出循环,不再运行循环中余下的代码,并且也不管判断表达式结果如何,可以使用break语句。break语句用于控制程序流程,可以使用它来控制哪些代码行执行,哪些代码行不执行,从而使程序按照程序员的要求执行代码。
break语句可用在while和for循环中。如果使用嵌套循环,break语句将停止执行最深层的循环,并开始执行上一层循环的下一行代码。例如,使用break语句结束for循环。


Break语句终止本次循环,比如在本例中有两个for循环,当在第2个for循环里写了一个break,满足条件,只会终止第2个for里面的循环,在本例中遇到i > 2的时候第2层的for就不循环了,程序会跳到上一层for循环继续往下走。所有程序的运行中当i等于3或4时,将不会执行第2层for循环的print语句。
2.continue语句
如果需要返回到循环开头,并根据判断表达式的结果决定是否继续执行循环,可以使用continue语句。它不像break语句那样不再执行余下的代码并退出整个循环,continue语句的作用是用来结束本次循环,紧接着执行下一次的循环。接下来通过一个实例来演示continue语句的使用,具体代码如下所示。

在本例中,当i的值为偶数时,终止本次循环,不再输出i的值,接着执行下一次循环,因此i为0、2、4时将不被打印出来。
注意:
1)break/continue语句只能用于循环中,不能单独使用。
2)break/continue语句在嵌套循环中,只对最近的一层循环起作用。
3.pass语句
在Python语言中,pass语句就是空语句,它的目的是为了保持程序结构的完整性,它本身不做任何事情,一般用作占位语句。pass语句的使用,如下所示。

在上例中,当程序执行pass语句时,由于pass语句是空语句,程序会忽视这条语句,按顺序依次执行下面的语句。程序运行结果,如下所示。

3.3.7 循环中的else语句
前面在学习if语句的时候,会在if条件判断语句之外用到else语句。其实,除了判断语句,在Python中while循环和for循环同样可以使用else语句。在循环结构中使用时,else语句只在所有循环完成后执行,也就是说,break语句也会跳过else语句块,下面通过实例演示,新建一个py文件,具体代码如下。

在上面的实例中,else语句会在while循环终止后执行,也就是说,当number的值等于4的时候,程序会执行else语句。下面再举例说明使用了break语句后的结果。

因为使用了break语句,while循环未完成就被终止了,也就是说while的else语句被跳过了。