- Python程序设计案例教程
- 张宗霞主编
- 2270字
- 2021-09-17 17:22:58
3.2 案例7:求100以内所有奇数的和
3.2.1 案例描述
求100以内所有奇数的和,即1+3+5+…+99。
分析:100以内所有的奇数为1、3、5……直到99,求和很容易想到将这50个数一个一个加起来,反复执行相加的操作直到99,但需要加49次,非常麻烦。这时,需要一个循环结构完成在给定的条件下反复执行某些语句。对于本案例来说,就是判断出1~100以内的奇数,并相加。循环语句就是本节要学习的重点知识。
3.2.2 相关知识
3.2.2.1 while循环语句
和C语言不同,Python中没有do…while…语句,Python中while语句的语法格式如下。

while循环语句中的判断条件可以是任何表达式,结果为真(True)或假(False),任何非零或非空(null)的值均为True。语句块可以是单条语句或多条语句。首先判断条件是否为真,再往下执行,只要给定条件为真(True),while循环语句将重复执行这条语句,直到判断条件为假(False)时,循环结束。当条件为永真时,while循环语句为无限循环。
【例3-6】输出5遍“Hello,Python!”。
分析:输出5遍“Hello,Python!”,可以用5个print()函数来实现,在学习了while循环语句后,可以使用该循环语句来实现。
方法一:首先定义一个计数器i并赋值为1,while的判断条件为i<=5,当条件满足时执行输出语句,并将计数器i执行加1操作,直至i>5,循环结束。
代码如下。

方法二:方法二和方法一的不同在于while后的条件不同,方法二设置循环条件为True,即该循环为无限循环,本例要求输出5遍,因此还需要加入一个if判断语句和break语句,当计数器为6时,不再输出,跳出循环。
代码如下。

注意:在方法一中,计数器加1的语句是在while循环体内,要注意代码的缩进格式,如果将其写在循环体外,会导致循环持续执行,无限循环。当出现无限循环时,可以按〈Ctrl+C〉快捷键中断循环。
3.2.2.2 for循环语句

5 for循环语句
Python中另一个循环结构语句就是for循环语句。和Java、C++等语言中的for循环语句不同,Python中的for循环语句可以遍历如列表、元组、字符串等序列成员(列表、元组、字符串也称为序列)。
for循环语句的语法格式如下。

在for循环中,循环变量遍历序列中的每一个值时,循环体中的语句块就执行一次,直到遍历完整个序列。
考虑到数值范围经常变化,Python提供了一个内置range()函数,它可以生成一个数字序列。
range()函数的语法格式如下。

参数说明:
● start为计数从start开始,缺省时默认从0开始。例如,range(5)等价于range(0,5)。
● end为计数到end结束,但不包括end。例如,range(0,5)是指0,1,2,3,4数字序列,不包含5。
● step为步长,缺省时默认为1。例如,range(0,5)等价于range(0,5,1)
其中,参数step也可为负数,当step参数为负数时,start的值大于end的值,range()函数生成一个从大到小的数字序列。例如,range(5,1,-1)是指5,4,3,2数字序列。
注意:
1)range()函数生成的是一个左闭右开的等差数字序列。
2)range()函数接收的参数必须是整数,可以是负数,但不能是浮点数等其他类型。
3)range()函数是不可变的序列类型,可以进行判断元素、查找元素、切片等操作,但不能修改元素。
4)range()函数生成的是可迭代对象,但不是迭代器。
【例3-7】输出5遍“Hello,Python!”。
分析:输出5遍“Hello,Python!”,也可以用for循环语句和range()函数来编写且更加简单。序列设置为range(5)、range(0,5)、range(0,5,1)都可以,循环变量i遍历序列中的每一个值时,循环语句就输出一次,输出5遍后退出循环。

3.2.2.3 break语句、continue语句、else语句及pass空语句
Python中有两个辅助控制程序循环的语句:break语句和continue语句。
1.break语句
break语句用来终止整个循环,当循环条件没有满足False条件或者序列还没被完全递归完,也会停止执行循环语句。
例如:

程序的运行结果为输出3次“Hello, Python!”,也就是说,在循环变量等于3的时候,break语句会终止整个循环,不再执行输出操作。
2.continue语句
continue语句用来跳过当前循环的剩余语句,然后继续进行下一轮循环。
例如:

程序的运行结果为输出4次“Hello, Python!”,即程序仅在循环变量等于3的时候,跳过当前循环,紧接着执行下一次的循环。
在一些情况下很容易将break语句与continue语句弄混淆,因为break语句与continue语句都有结束循环的作用。需要注意的是,break语句是结束整个循环,不再判断执行循环的条件是否成立;continue语句则只结束本次循环,而不是终止整个循环语句的执行,在实际的编程中要注意两个语句的区别。
3.else语句
while循环语句和for循环语句中都可以有else子句,语法格式分别如下。

循环正常结束时才执行else分支中的语句。
【例3-8】判断一个整数是否为素数。
代码如下。

如果正常结束循环,说明n不能被中的任何一个整数整除,所以为素数。
4.pass空语句
pass为空语句,它不做任何事情,只是为了保持程序结构的完整性,只起到占位的作用。
例如:

以上代码没有任何输出,pass语句只起到占位的作用。
3.2.3 案例实现
求100以内所有奇数的和,本案例的解法也较多。在学习了循环结构之后,可使用while循环语句和for循环语句分别编程,同时,也可使用Python内置的sum()求和函数、等差数列求和公式来实现。
方法一基本思路:本案例可以通过while循环语句实现。首先设置变量sum=0(表示和),i=1(表示当前数字,从1开始即可),步长设为2,通过while循环累加,最后输出结果。
代码如下。

方法二基本思路:本案例也可以通过for循环语句实现。只要善于思考,使用for循环语句编写也有很多种方法,可以在for循环中加入if条件判断,也可直接利用range()函数。
若利用range()函数,首先设置变量sum=0(表示和),range(1,101,2)函数从1开始直到101(左闭右开,不包含101),也可从大到小生成奇数序列将range()函数写成range(99,0,-2),此时要注意结束位end参数为0,步长step为-2。
若在for循环中加入if条件判断,满足条件除以2后的余数为1,将1~100以内的所有奇数筛选出来,并相加。
代码如下。

或者

方法三基本思路:本案例也可以使用内置的sum()函数来实现,函数的参数为1~100的奇数序列。
代码如下。

方法四基本思路:本案例也可以通过等差数列求和公式来实现,而且一行代码就可实现更加简单。
代码如下。
