一、为什么要用循环

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

(一)老老实实的笨方法

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)

    n(n≥2),就要看从

    2

    2

    2到

    n

    1

    n-1

    n−1的每个数能否整除

    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 到 99,现在可以缩小到从 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×5,24=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,代码如下所示
  • 运行程序,查看结果

五、循环嵌套

(一)循环嵌套概述

嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构。注意必须是包含关系,不能出现交叉。while循环、for循环语句都可以进行循环嵌套,并且它们之间也可以互相嵌套。在实际开发时,最常用的是for循环嵌套。

(二)循环嵌套类型

1、for循环嵌套for循环

for 迭代变量1 in 对象1:
for 迭代变量2 in 对象2:
循环体2
循环体1

2、while循环嵌套while循环

while 条件表达式1:
while 条件表达式2:
循环体2
循环体1

3、for循环嵌套while循环

for 迭代变量 in 对象:
while 条件表达式:
循环体2
循环体1

4、while循环嵌套for循环

while 条件表达式1:
for 迭代变量 in 对象:
循环体2
循环体1

(三)执行情况

  • 在双重循环嵌套中,外层循环每执行一轮,都要执行完内层循环中的整个循环,然后执行外层循环第二轮,接着再执行完内层循环中的整个循环,以此类推,直至外层循环的循环条件不成立,才会跳出整个嵌套循环。如果外循环有 m m m次,内循环有 n n n次,那么内循环里的操作会执行 m × n m\times n m×n次。

(四)循环嵌套案例演示

任务1、打印规则的字符图形

(1)打印字符矩形

  • 编写程序 - 打印字符矩形.py
  • 运行程序,查看结果
  • 修改内循环里的打印语句,设置end属性为空字符串
  • 运行程序,查看结果
  • 每次内循环完毕都要换行,需要添加一个空打印语句,注意要对齐第二个for
  • 运行程序,查看结果

(2)打印字符平行四边形

  • 向右倾斜的平行四边形
  • 向左倾斜的平行四边形
  • 针对向右倾斜的平行四边形,我们来研究一下每行前导空格数与当前行数的关系,这对我们编写程序至关重要。假设总行数 row = 10,我们可以发现一个规律:第i行的前导空格数等于总行数减去当前行数,即 spaces = row - i = 10 - i。
i = 1    spaces = 9      1 + 9 = 10
i = 2 spaces = 8 2 + 8 = 10
……
i = i spaces = 10 - i i + (10 - i) = 10
……
i = 8 spaces = 2 8 + 2 = 10
i = 9 spaces = 1 9 + 1 = 10
i = 10 spaces = 0 10 + 0 = 10
  • 编写程序 - 打印字符平行四边形.py
  • 运行程序,查看结果

课堂练习:打印字符直角三角形

挑战练习:打印字符实心钻石

  • 实心钻石,其实由一个正立的等腰三角形和一个倒立的等腰三角形组合而成,也就是一个菱形。

挑战练习:打印字符空心钻石

任务2、打印乘法九九表

  • 作为启蒙教材,我们都背过九九乘法表:一一得一、一二得二、……、九九八十一。而古代是从"九九八十一"开始,因此称"九九表"。九九表的使用,对于完成乘法是大有帮助的。齐桓公纳贤的故事说明,到公元前7世纪时,九九歌诀已不稀罕。也许有人认为这种成绩不值一提。但在古代埃及作乘法却要用倍乘的方式呢。举个例子说明:比如计算23×13,就需要从23开始,加倍得到23×2,23×4,23×8,然后注意到13=1+4+8,于是23+23×4+23×8加起来的结果就是23×13。通过对比,不难看出使用九九表的优越性了。
  • 编写程序 - 打印乘法九九表.py
  • 运行程序,查看结果
  • 注意,内循环 - for j in range(1, i + 1): 不是 for j in range(1, 10):

任务3、解决百钱买百鸡问题

我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?

翻译过来,意思是公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?

需要定义三个整型变量cock, hen, chick,分别代表公鸡、母鸡和小鸡的购买数量。
有两方面的条件:关于钱的条件与关于鸡的条件

  • 钱的条件:

    c

    o

    c

    k

    ×

    5

    +

    h

    e

    n

    ×

    3

    +

    c

    h

    i

    c

    k

    3

    =

    100

    cock \times5+hen\times3+\displaystyle\frac{chick}{3}=100

    cock×5+hen×3+3chick​=100

  • 鸡的条件:

    c

    o

    c

    k

    +

    h

    e

    n

    +

    c

    h

    i

    c

    k

    =

    100

    cock+hen+chick=100

    cock+hen+chick=100

(1)采用三重循环求解百钱买百鸡问题

cock:0 ~ 20
hen:0 ~ 34
chick:0 ~ 100
  • 编写程序 - 采用三重循环求解百钱买百鸡问题
  • 运行程序,查看结果
  • 验证四种购买方案是否正确
    – 方案1:

    0

    +

    25

    +

    75

    =

    100

    ,

    0

    ×

    5

    +

    25

    ×

    3

    +

    75

    3

    =

    75

    +

    25

    =

    100

    0+25+75=100, 0\times5+25\times3+\displaystyle\frac{75}{3}=75+25=100

    0+25+75=100,0×5+25×3+375​=75+25=100
    – 方案2:

    4

    +

    18

    +

    78

    =

    100

    ,

    4

    ×

    5

    +

    18

    ×

    3

    +

    78

    3

    =

    20

    +

    54

    +

    26

    =

    100

    4+18+78=100, 4\times5+18\times3+\displaystyle\frac{78}{3}=20+54+26=100

    4+18+78=100,4×5+18×3+378​=20+54+26=100
    – 方案3:

    8

    +

    11

    +

    81

    =

    100

    ,

    8

    ×

    5

    +

    11

    ×

    3

    +

    81

    3

    =

    40

    +

    33

    +

    27

    =

    100

    8+11+81=100, 8\times5+11\times3+\displaystyle\frac{81}{3}=40+33+27=100

    8+11+81=100,8×5+11×3+381​=40+33+27=100
    – 方案4:

    12

    +

    4

    +

    84

    =

    100

    ,

    12

    ×

    5

    +

    4

    ×

    3

    +

    84

    3

    =

    60

    +

    12

    +

    28

    =

    100

    12+4+84=100, 12\times5+4\times3+\displaystyle\frac{84}{3}=60+12+28=100

    12+4+84=100,12×5+4×3+384​=60+12+28=100

  • 采用三重循环固然可以解决百钱买百鸡问题,但是最内层循环里的基本操作次数 =

    21

    ×

    35

    ×

    101

    =

    74

    ,

    235

    21\times 35 \times 101=74,235

    21×35×101=74,235,时间复杂度就比较高了,我们应该优化解决问题的算法。下面,我们降维处理,采用双重循环来解决此问题。

(2)采用双重循环求解百钱买百鸡问题

  • 知道公鸡与母鸡购买数量,那么小鸡购买数量:chick = 100 - cock - hen
  • 编写程序 - 采用双重循环求解百钱买百鸡问题.py
  • 运行程序,查看结果
  • 采用双重循环解决百钱买百鸡问题,内层循环里的基本操作次数 =

    21

    ×

    35

    =

    735

    21\times 35=735

    21×35=735,跟三重循环算法相比,时间复杂度就大大降低了,因此双重循环算法是一个更好的算法。

六、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个学生的平均成绩

  • 要求每个学生成绩在[0, 100]范围内,输入不正确,提示用户重新输入,直到输入正确为止

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

    想要获取更多Python学习资料可以加QQ:2955637827私聊或加Q群630390733大家一起来学习讨论吧!
     

Python编程基础:循环结构的更多相关文章

  1. python分支和循环结构

    本文收录在Python从入门到精通系列文章系列 1. 分支结构 1.1 应用场景 迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构.然而仅有顺序结构并不能解决 ...

  2. 【搬砖】安卓入门(3)- Java开发编程基础--循环控制语句

    04.01_Java语言基础(循环结构概述和for语句的格式及其使用) A:循环结构的分类 for(初始化表达式;条件表达式;循环后的操作表达式) { 循环体; } 复制代码 B:循环结构for语句的 ...

  3. [Java基础]循环结构3

    [Java基础]循环结构3 break 与 continue 中断循环... /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:BreakTest.java 编写时间:2016/6 ...

  4. [java基础]循环结构2

    [java基础]循环结构2 写了几个循环结构练习~记录一下~~ 1:99乘法表 /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:GameForFor.java 编写时间:2016 ...

  5. [java基础]循环结构1

    [java基础]循环结构1 循环结构:for循环,while循环,do_while循环在,增强型for循环 /** 文件路径:G:\JavaByHands\循环语句\ 文件名称:WhileTest.j ...

  6. python 编程基础练习 第一天

    python 编程基础练习 第一天: 需求: 1.计算2的38次方,180*0.7输出(精度显示正常), x的y次方,数字倒序输出即345876输出678543,方法越多越好. 2.字符串处理: 1) ...

  7. C语言入门7-程序设计方法基础-循环结构

    程序设计方法基础-循环结构 循环三要素: 初值   循环判断条件   步长(循环增量) 循环结构在有些书籍上也称为重复结构,  即反复执行某一部分的操作. 循环三要素: 初值   循环判断条件   步 ...

  8. Python编程基础[条件语句if 循环语句 for,while](二)

    ython条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: if 判断条件: 执行语句……else: 执行语句…… x= ...

  9. Python编程基础(一)

    1.Python中的变量赋值不需要类型声明 2.等号(=)用来给变量赋值 3.字符串拼接用  “+”  号 temp=‘123’ print('temp的值是%s'%temp) #整数和字符创的转换, ...

随机推荐

  1. Math对象-JavaScript

    Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法.Math 不是一个函数对象. Math 用于 Number 类型. Math 的所有属性与方法都是静态的. 属性 Math.E 欧拉常数 ...

  2. GAN和GAN的改进

    GAN 原始GAN中判别器要最小化如下损失函数,尽可能把真实样本分为正例,生成样本分为负例: 其中是真实样本分布,是由生成器产生的样本分布. 第一个式子我们不看梯度符号的话即为判别器的损失函数,log ...

  3. 7-1 Hashing

    The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...

  4. sqli-labs-master less01

    注:如未接触过sql注入,建议观看前期知识点文章 https://www.cnblogs.com/yyd-sun/p/12256407.html 第一关步骤 一.判断注入类型(数字/字符) (1).h ...

  5. Python超全干货:【二叉树】基础知识大全

    概念 二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree) 二叉树的链式存储: ...

  6. PyQt学习随笔:Qt Designer调用帮助时报错找不到assistant.exe文件的解决办法

    老猿是按照<第15.5节 PyQt5安装与配置>步骤安装的PyQt及相关工具,但最近在Qt Designer中点击帮助相关菜单时报错找不到assistant.exe文件,如图: 按照报错信 ...

  7. spring整合mybatis01

    title: spring整合mybatis01 date: 2020-03-09 19:47:40 tags:整合的第一种方式 spring整合mybatis 1.mybatis回顾 mybatis ...

  8. python+request+unittest+HTMLTestRunner

    https://www.imooc.com/article/details/id/20813 https://www.cnblogs.com/fennudexiaoniao/p/7771931.htm ...

  9. 动态svg图片简单制作

    一.简介 #topics #no-box-shadow-img { box-shadow: none } 博主头像 svg图片格式不同于其它图片格式,svg图片本质上是一个xml文件,它内部是标记语言 ...

  10. 半夜删你代码队 Day3冲刺

    一.每日站立式会议 1.站立式会议 成员 昨日完成工作 今日计划工作 遇到的困难 陈惠霖 了解相关网页设计 了解相关网页设计 无 侯晓龙 写了第一个例子 尝试写第一个实例子 无 周楚池 学习 与余金龙 ...