Python编程基础08:循环结构

文章目录


在这里插入图片描述

  • 跑道是一圈一圈的,可以看作是循环的

一、为什么要用循环

现在有一个任务,要求你输出一百遍“好好学习,天天向上!”,想一想,你会怎么做?

(一)老老实实的笨方法

print("第1遍写:好好学习,天天向上!")
print("第2遍写:好好学习,天天向上!")
print("第3遍写:好好学习,天天向上!")
print("第4遍写:好好学习,天天向上!")
……
print("第100遍写:好好学习,天天向上!")    

采用此方法,当然可以完成任务,但是显然很糟糕,如果要求你输出一万遍,那得有一万行打印语句,那样看起来岂不令人崩溃?

(二)采用循环结构的巧方法

1、采用for循环输出百遍口号

  • 编写程序 - 采用for循环输出百遍口号.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述
  • 你看,两行代码,就可以输出百行口号,是不是感觉挺爽?

2、采用while循环输出百遍口号

  • 编写程序 - 采用while循环输出百遍口号.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述
  • 你看,殊途同归,不一样的循环语句,一样的输出结果!

二、条件循环 - while循环

(一)语法格式

  • 一般格式
while 条件表达式:
	循环体
  • 具体格式
初始条件
while 循环条件:
	循环体
	[break|continue]
	更新条件

(二)执行情况

在这里插入图片描述

  • 当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假时,退出循环。
  • 现实生活中的例子来理解while循环的执行流程。在体育课上,体育老师要求同学们沿着环形操场跑圈,要求当听到老师吹的哨子声时就停下来。同学们每跑一圈,可能会请求一次老师吹哨子。如果老师吹哨子,则停下来,即循环结束,否则继续跑步,即执行循环。
  • 好友聚会,开怀畅饮,不醉不休。一杯接着一杯地喝下去,直到喝趴下,喝酒循环才结束。

(三)案例演示

任务1、永不消逝的电波 - 死循环

  • 编写程序 - 永不消逝的电波.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述
  • 循环永不结束,除非用户强制终止。

任务2、采用while循环计算1 + 2 + 3 + …… + 100的值

  • 这是一个非常经典的数学计算问题:公差为1的等差数列求和。
  • 编写程序 - 采用while计算1 + 2 + 3 + …… + 100的值.py
    在这里插入图片描述
  • 只要i <= 100成立,循环都会继续,直到i = 101,不满足条件了,循环才终止
  • 运行程序,查看结果
    在这里插入图片描述
  • 修改一下代码,输出循环结束后循环变量i的值
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述

课堂练习:采用while循环计算1 + 3 + 5 + …… + 99的值

  • 提示:有三种方法可以解决此问题。
    (1)修改循环的更新条件:i = i + 2
    (2)在循环结构里嵌套一个过滤器:if i % 2 == 1: sum = sum + i
    (3)修改循环条件:i <= 50,修改累加语句 sum = sum + 2 * i - 1
  • 运行程序,查看结果
    在这里插入图片描述

任务3、采用while循环打印水仙花数

水仙花数:是指等于其各位数字立方和的三位数。

153 = 1 3 + 5 3 + 3 3 153=1^3+5^3+3^3 153=13+53+33
370 = 3 3 + 7 3 + 0 3 370=3^3+7^3+0^3 370=33+73+03
371 = 3 3 + 7 3 + 1 3 371=3^3+7^3+1^3 371=33+73+13
407 = 4 3 + 0 3 + 7 3 407=4^3+0^3+7^3 407=43+03+73

分析问题,首先水仙花数是三位数,那么我们可以确定范围:100~999,这个我们可以通过循环结构来搞定:

n = 100
while n <= 999:
    n = n + 1

然后对于这个范围的每个数n,我们要去判断它是否等于其各位数字的立方和,这里的难点或关键在于如何分解一个三位数,得到它的每位数字。

假设我们已经把三位数n分解成百位数p3,十位数p2,个位数p1,
这样我们的筛选条件就可以写出来:n == p3 * p3 * p3 + p2 * p2 * p2 + p1 * p1 * p1。

如何拆分一个三位数n呢?

首先求n的个位数:n % 10
然后要将三位数变成两位数:n = n // 10
对于新的两位数n,又求它的个位数:n % 10
然后要将两位数变成一位数:n = n // 10

也就是说我们可以交替使用求余和整除运算将一个三位数拆分,得到它的个位数、十位数和百位数。当然这个分解方法可以推广到任何多位数的拆分。

  • 编写程序 - 采用while循环打印水仙花数.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述

任务4、采用while循环破解令狐大侠难题

  • 编写程序 - 采用while循环破解令狐大侠难题.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述

三、计数循环 - for循环

(一)语法格式

for 迭代变量 in 对象:
	循环体
  • for循环是一个依次重复执行的循环。通常适用于枚举或遍历序列,以及迭代对象中的元素。

(二)执行情况

在这里插入图片描述

  • 迭代变量用于保存读取出的值;对象为要遍历或迭代的对象,该对象可以是任何有序的序列对象,如字符串、列表和元组等;循环体为一组被重复执行的语句。

(三)案例演示

任务1、采用for循环计算1 + 2 + 3 + …… + 100的值

  • 编写程序 - 采用for循环计算1 + 2 + 3 + …… + 100的值.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述

任务2、采用for循环打印水仙花数

  • 编写程序 - 采用for循环打印水仙花数.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述

任务3、采用for循环破解令狐大侠难题

  • 编写程序 - 采用for循环破解令狐大侠难题.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述
  • 思考题:这个程序无论如何都要循环99次,有必要吗?其实,当找到满足条件的cups值,就应该终止循环,不必再浪费资源继续循环了。此时,就会用到循环的跳转语句。

四、跳转语句

(一)跳转概述

当循环条件一直满足时,程序将会一直执行下去。如果希望在中间离开循环,也就是for循环结束重复之前,或者while循环找到结束条件之前。

  • 使用continue语句直奔下次循环
  • 使用break语句完全中止整个循环

(二)break语句

1、在while循环中使用break语句

  • 语法格式
while 条件表达式1:
	执行代码
	if 条件表达式2:
		break
  • 执行情况
    在这里插入图片描述

2、在for循环中使用break语句

  • 语法格式
for 迭代变量 in 对象:
	if 条件表达式:
		break
  • 执行情况
    在这里插入图片描述

3、案例演示

任务1、采用for循环破解令狐大侠难题 - 完善版

  • 编写程序 - 采用for循环破解令狐大侠难题 - 完善版.py
    在这里插入图片描述
  • 运行程序,查看程序
    在这里插入图片描述
  • 修改程序,计算循环次数
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述
  • 修改【采用for循环破解令狐大侠难题.py】
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述

任务2、判断一个整数是否是素数

  • 概念:什么叫素数(Prime Number)?一个整数除了1和它本身之外没有其它因子,这个整数就叫素数,否则就叫合数,但是有一个特殊情况,1既不是素数,也不是合数。比如:2、3、5、7都是素数,它们除了1和本身都没有其它因子,但是6就是合数,除了1和6之外,还有2和3都是其因子(6 = 2 * 3)。

  • 方法:判断一个整数是不是素数的方法 - 比如我们考虑一个整数 n ( n ≥ 2 ) n(n\ge2) nn2,就要看从 2 2 2 n − 1 n-1 n1的每个数能否整除 n n n,如果能整除,那么 n n n就不是素数;如果从头到尾都不能整除,那么 n n n就是素数。

  • 编程思路:我们采用一个布尔型的标志变量is_prime_number来表示待判断的整数n是不是素数,如果is_prime_number = True表明是素数,如果is_prime_number = False表明不是素数。先假定待判断的整数n是素数,设置is_prime_number = True,一旦在循环里找到能整除n的真因子,说明n不是素数,立马设置is_prime_number = False,并跳出循环结果。循环之后就根据is_prime_number的真假来输出n是素数还是合数。(这个编程思路,有点类似于法院断案,先假定你是好人,只有找到犯罪证据,才能断定你是罪犯。)

  • 编写程序 - 判断一个整数是否是素数.py
    在这里插入图片描述

  • 运行程序,查看结果
    在这里插入图片描述

  • 其实该程序可以优化的,为了说明方便起见,我们考虑 n = 100 n = 100 n=100的情况:

2 * 50 = 100
4 * 25 = 100
5 * 20 = 100
10 * 10 = 100
20 * 5 = 100
25 * 4 = 100
50 * 2 = 100
  • 因子乘积是以100的平方根10的乘积(10 * 10)为中心对称的。于是循环范围就可以缩小,本来是从 2 2 2 99 99 99,现在可以缩小到从 2 2 2 100 \sqrt{100} 100

  • 根据刚才的分析,代码可以优化如下:
    在这里插入图片描述

  • 循环次数明显减少,因此这是一个更好的算法。

  • 运行程序,查看结果
    在这里插入图片描述

思考题:实现合数分解

  • 如果一个整数是合数,编程将其分解成素数乘积形式
  • 比如 45 = 3 × 3 × 5 , 24 = 2 × 2 × 2 × 3 … … 45=3×3×5,24=2\times2\times2\times3…… 45=3×3×524=2×2×2×3

(三)continue语句

1、在while循环中使用continue语句

  • 语法格式
while 条件表达式1:
	执行代码
	if 条件表达式2:
		continue
	执行代码
  • 执行情况
    在这里插入图片描述
  • 如果条件表达式2为True,跳过continue之后的执行代码部分,直奔下一次循环
  • 如果条件表达式2为False,执行continue之后的执行代码部分,才进入下一次循环

2、在for循环中使用continue语句

  • 语法格式
for 迭代变量 in 对象:
    执行代码
	if 条件表达式:
		continue
	执行代码
  • 执行情况
    在这里插入图片描述
  • 如果条件表达式为True,跳过continue之后的执行代码部分,直奔下一次循环
  • 如果条件表达式为False,执行continue之后的执行代码部分,才进入下一次循环

3、案例演示

任务1、计算1 + 3 + 5 + …… + 99的值

  • 之前我们已经使用for循环来完成过这个计算任务,步长是2
    在这里插入图片描述
  • 现在我们换种方式来处理,步长依然是1,在循环里嵌套一个选择结构,通过使用continue语句过滤掉偶数,然后累加的就是全部奇数。
  • 修改程序 - 计算1 + 3 + 5 + …… + 99的值.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述

任务2、逢七拍腿员工拓展小游戏

  • 场景模拟:宜宾五粮液酒类销售有限公司对2020年度新入职员工进行拓展训练,其中开展的一项小游戏叫做“逢七拍腿游戏”。游戏规则是每个员工从1开始依次数数,当数到尾数是7的数或7的倍数时,则该员工不报出该数,而是拍一下腿。凡是出错的员工将会受到小惩罚——做10个俯卧撑。
  • 假设在一次游戏中,参加活动的员工循环报数,从1数到99,每个人都没有出错,即无人受到惩罚。现在编写程序,在本次游戏中,计算新员工一共要拍多少次腿。
  • 编写程序 - 逢七拍腿员工拓展小游戏.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述
  • 不使用continue,代码如下所示
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述

五、循环嵌套

六、pass语句

(一)占位作用

在Python中还有一个pass语句,表示空语句。它不做任何事情,—般起到占位作用。

(二)案例演示

  • 在应用for循环输出1〜10之间(不包括10)的偶数时,在不是偶数时,应用pass语句占个位置,方便以后对不是偶数的数进行处理。
  • 编写程序 - 占位语句pass.py
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述

七、课后作业

任务1、完成猜数游戏

  • 游戏规则:程序产生一个[1, 100]之间的随机整数,用户输入整数进行猜测,如果猜对了,就会循环你是否要继续玩游戏;如果猜错了,程序会提示你是猜高了还是猜低了,然后让你继续输入整数进行猜测。
    在这里插入图片描述

任务2、计算阶乘之和

  • 计算 1! + 2! + 3! + … + 10! 的值
    在这里插入图片描述

任务3、用米粒填充国际象棋盘

国际象棋盘中,第1 格放1 粒米,第2 格放2 粒米,第3格放4 粒米,第4 格放8 粒米,第5 格放16粒米,……问:64个格子总共可以放多少粒米?
在这里插入图片描述
在这里插入图片描述

任务4、求20个学生的平均成绩

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/109645171