![Python程序设计案例教程](https://wfqqreader-1252317822.image.myqcloud.com/cover/975/40680975/b_40680975.jpg)
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语句的语法格式如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/59_02.jpg?sign=1739260395-PwzkMOChgqCil5CQGtmhfPvBlVXQGG3Y-0-41536aae3f1daddca57b8fe4906cf452)
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,循环结束。
代码如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/60_01.jpg?sign=1739260395-XbRx828kqwH8M5Qvt6rRI4j2oE5gq01i-0-7f1914ee8ac9a47ef0318d14d0b13780)
方法二:方法二和方法一的不同在于while后的条件不同,方法二设置循环条件为True,即该循环为无限循环,本例要求输出5遍,因此还需要加入一个if判断语句和break语句,当计数器为6时,不再输出,跳出循环。
代码如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/60_02.jpg?sign=1739260395-5FyUQnctCVdSkCbMWlg5BBDmBy2P99jJ-0-e355e295be1f252879dd0bd72afdc7b6)
注意:在方法一中,计数器加1的语句是在while循环体内,要注意代码的缩进格式,如果将其写在循环体外,会导致循环持续执行,无限循环。当出现无限循环时,可以按〈Ctrl+C〉快捷键中断循环。
3.2.2.2 for循环语句
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/60_03.jpg?sign=1739260395-dVs637E4iS8uZSRWT5v2hFbsEJgZIzsU-0-39c7e01dd0f8bf7a355e9fdbbb156c60)
5 for循环语句
Python中另一个循环结构语句就是for循环语句。和Java、C++等语言中的for循环语句不同,Python中的for循环语句可以遍历如列表、元组、字符串等序列成员(列表、元组、字符串也称为序列)。
for循环语句的语法格式如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/60_04.jpg?sign=1739260395-FDnSAHSeI0ouorzds0BBAbZZg7Ey8dGi-0-6eece947b320ef0b0f30abaf405d3bae)
在for循环中,循环变量遍历序列中的每一个值时,循环体中的语句块就执行一次,直到遍历完整个序列。
考虑到数值范围经常变化,Python提供了一个内置range()函数,它可以生成一个数字序列。
range()函数的语法格式如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/60_05.jpg?sign=1739260395-FdyESykrTFhjPCOVPO9riv3A2D7WyBKZ-0-c2a05c17de9d53c7d47cf7f59fb195f2)
参数说明:
● 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遍后退出循环。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/61_01.jpg?sign=1739260395-ek2tqxU0Kc1Rl2pMC5DRmfWmSTPK7n6D-0-5632730ca23f120a5a22708b4a97d0e6)
3.2.2.3 break语句、continue语句、else语句及pass空语句
Python中有两个辅助控制程序循环的语句:break语句和continue语句。
1.break语句
break语句用来终止整个循环,当循环条件没有满足False条件或者序列还没被完全递归完,也会停止执行循环语句。
例如:
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/61_02.jpg?sign=1739260395-xECiPsK4kxAURoULUYp4xTqzMrcVMZ2i-0-894ce982e80686ff3dc75cbe58c02b13)
程序的运行结果为输出3次“Hello, Python!”,也就是说,在循环变量等于3的时候,break语句会终止整个循环,不再执行输出操作。
2.continue语句
continue语句用来跳过当前循环的剩余语句,然后继续进行下一轮循环。
例如:
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/61_03.jpg?sign=1739260395-ww0us3vxVcshUyOz7YXVwxc3XnLvqmRn-0-059f48c8f5932e91fc16993e26cf403c)
程序的运行结果为输出4次“Hello, Python!”,即程序仅在循环变量等于3的时候,跳过当前循环,紧接着执行下一次的循环。
在一些情况下很容易将break语句与continue语句弄混淆,因为break语句与continue语句都有结束循环的作用。需要注意的是,break语句是结束整个循环,不再判断执行循环的条件是否成立;continue语句则只结束本次循环,而不是终止整个循环语句的执行,在实际的编程中要注意两个语句的区别。
3.else语句
while循环语句和for循环语句中都可以有else子句,语法格式分别如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/62_01.jpg?sign=1739260395-IqbiXNdLJNxWj0L0VI6YuS75wSburBC6-0-6755d711925de6e07c1b6e02b1ca7928)
循环正常结束时才执行else分支中的语句。
【例3-8】判断一个整数是否为素数。
代码如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/62_02.jpg?sign=1739260395-ENIb91GJaLdaEOgYhc4SJDkITbKYze1J-0-abe5439b274e53d9d4eb76c87a339e82)
如果正常结束循环,说明n不能被中的任何一个整数整除,所以为素数。
4.pass空语句
pass为空语句,它不做任何事情,只是为了保持程序结构的完整性,只起到占位的作用。
例如:
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/62_04.jpg?sign=1739260395-FP387oLu6fM3c3PgDyF2qFxAWOiSv3uC-0-428e85cf554986556faba5aba38052a3)
以上代码没有任何输出,pass语句只起到占位的作用。
3.2.3 案例实现
求100以内所有奇数的和,本案例的解法也较多。在学习了循环结构之后,可使用while循环语句和for循环语句分别编程,同时,也可使用Python内置的sum()求和函数、等差数列求和公式来实现。
方法一基本思路:本案例可以通过while循环语句实现。首先设置变量sum=0(表示和),i=1(表示当前数字,从1开始即可),步长设为2,通过while循环累加,最后输出结果。
代码如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/63_01.jpg?sign=1739260395-gjiIMH91bXC9xfE74M4k7UK0UYTLGqvu-0-b0d779dfba3087146e5639dc0b2536f4)
方法二基本思路:本案例也可以通过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以内的所有奇数筛选出来,并相加。
代码如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/63_02.jpg?sign=1739260395-KjyXMpv28YiGWwinCVWmwlk9Qb15DiI2-0-e2c79eacb182a0c7746842a3416e1620)
或者
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/63_03.jpg?sign=1739260395-kgAgnMANCwpK0Qe7DtP2FqINd0qMc7Vd-0-0621c81faa1f95ad0f2508e8232d672e)
方法三基本思路:本案例也可以使用内置的sum()函数来实现,函数的参数为1~100的奇数序列。
代码如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/63_04.jpg?sign=1739260395-M3XvEeJOxyRzTVa7oeXDh2ft9UEA8zGA-0-def12bd9bdc608b66fc534b2ac85f9e2)
方法四基本思路:本案例也可以通过等差数列求和公式来实现,而且一行代码就可实现更加简单。
代码如下。
![](https://epubservercos.yuewen.com/DDC401/21122066208960506/epubprivate/OEBPS/Images/63_05.jpg?sign=1739260395-10cy9tF6jKfIh52MHQs5pit1tHYttQqU-0-18c70d5e4f9e03916de3d43eb0083d82)