欢迎回到今天的 Python 课堂。
老样子,咱们先复习复习上一节的内容。
在上一节课中,我们重点学习了列表的概念,以及如何使用索引、切片和增改操作对列表进行取值和修改。
还学习了类似于列表的元组。元组与列表不同的是,列表用中括号[]表示,而元组则用小括号()表示。
元组和其他数据结构不同之处在于一旦创建,就无法修改。
列表和元组都属于序列这一数据类型,即多个数据以一列的形式排列。
字符串也是序列类型之一,除了列表和元组。
在今天的学习开始之前,我们需要先回顾一下本节可能会涉及到的知识。
单选题:
请你选出以下选项中错误的一项:
A.元组不能被转换成列表
B.列表、字符串、元组都为序列类型
C.列表里的索引是从0开始计数
D.format() 括号中的标识和替换字段的标识要对应
解析:可以使用 list() 函数将元组转换为列表类型
答案:A
代码题:
程序设计:今天我上课比较匆忙,不知道书包里有没有电脑,请设计一个程序帮我判断:
1)如果"电脑"在书包里面,就显示"可以好好上课了";否则显示"赶紧回宿舍拿电脑";
2)已知:书包 bag = ['电脑', '笔']
# 创建列表bag
bag = ['电脑', '笔']
# 条件判断:如果'电脑'在列表bag中
# print打印对应语句
# 否则:
# print打印对应语句
答案:
# 创建列表bag
bag = ['电脑', '笔']
# 条件判断:如果'电脑'在列表bag中
if '电脑' in bag:
# print打印对应语句
print('可以好好上课了')
# 否则:
else:
# print打印对应语句
print('赶紧回宿舍拿电脑')
接下来,一起来看看本节课的学习内容吧。
在前面的学习中,我们已经知道控制流包括顺序结构、分支结构和循环结构。
你已经很熟悉顺序结构和分支结构了,接下来将重点讲解循环结构。
今天的重难点也是循环控制的语法。
先来了解一下 for 循环语句吧。
1.for 循环语句
当需要反复执行某些代码时,可以用循环处理,还能简化代码。
我们先来运行下面的代码,了解一下 for 循环语句:
for i in ['python', '吉他', '六级']:
print(i)
运行完程序后,终端显示了 'python', '吉他', '六级'。
你会发现,for循环语句根据in后的列表,将print()打印语句重复执行了三次,打印出python,吉他,六级。
也许你会说,这里不就两句打印语句的事就解决了吗,不需要用 for 循环吧?
name_list = ['python', '吉他', '六级']
print(name_list[0])
print(name_list[1])
print(name_list[2])
但如果列表里不止三个元素呢?当要处理 100 个或更多的元素时,依次打印,程序将显得非常冗余。
而使用 for 循环语句,只需要三行代码,即可完成该重复性操作:
当你碰到重复的工作时,是否会用 for 循环语句来减轻你的工作量?
听起来有点难?
不慌,我们先从 for 循环语句的组成部分学习吧。
1.1 for 循环语句的组成要素
根据上面的 for 循环语句,我们来分析一下它的组成部分:
for i in ['Python', 'OpenCV']:
print(i)
观察代码,这个 for 循环语句包含了七个要素,如下图所示:
要素①关键字 "for" 和要素③关键字 "in"是固定写法。
要素②循环变量和要素④可迭代对象是什么呢?
可迭代对象可以理解为一个"盒子",可以被程序一次一次地取出数据。就像我们学过的序列,即字符串、元组和列表都可以叫做可迭代对象。
循环变量,是用来接收 for 循环语句遍历(即一次次取出)可迭代对象里的数据。
循环变量的名字不一定是 i,只是我觉得方便才起的一个名字,你也可以把 i 改为更容易理解的变量名,比如 name、person 等符合语法的变量名。
要素⑤英文冒号":",与条件判断语句的语法类似,for 循环语句首行末尾也是需要一个英文冒号":",
要素⑥缩进,冒号下的语句前有缩进,缩进是一个 Tab 或四个空格。
要素⑦循环体,可以理解为 for 循环语句下的一个代码块。正常情况下,每循环一次,这个代码块都会被执行一次,所以也叫为循环体。
下面请你根据我们 for 循环语句的几个要素,尝试写一个 for 循环语句吧:
number = '12345'
# for 循环语句,遍历变量 number 并打印出每一个数字
你也可以参考一下我的答案:
number = '12345'
# for 循环语句,遍历变量 number 并打印出每一个数字
for n in number:
print(n)
刚才我们手动创建了'12345'的字符串来计数,其实还有更简单的办法。
下面有请,常与 for 循环配合使用的range()函数。
range()函数是个“计数达人”,与for循环搭配,能控制循环的次数。
下面这段代码,我们在括号()
中输入不同的数字,看看range()函数能实现什么样的计数效果吧。
请在下面第一行代码中分别填写(1, 5)、(1, 6)、(2, 5)、(10)并本地【运行】,查看终端结果。
for i in range( , ):
print(i)
你发现range()函数的奥秘了吗?
range()在控制打印次数的同时,还能得到一个“数字序列”,具体内容由括号内()所填的指定数字决定。
(1, 5)
的打印语句循环了4
次,终端输出了1,2,3,4
; (2, 5)
的打印语句循环了3
次,终端输出了2,3,4
。
如果把括号左侧的数字称为“起始数字”,括号右侧的数字称为“结束数字”。
由此可得出range()函数的第一个规律:“数字序列”从“起始数字”开始生成,每次增加1
,到“结束数字”的前1个数终止。
如果省略了“起始数字”,如range(10),那么,“起始数字”默认从0开始。
range(10)相当于range(0,10),得到的“数字序列”则是0,1,2,3,4,5,6,7,8,9。
下面,请补充代码的第1行,生成一个从数字“1”开始,“12”结束的“数字序列”,终端将打印12次。
for i in range(1, ):
print(i)
我的答案是这样:
for i in range(1, 13):
print(i)
注意:range()函数生成的“数字序列”不包括括号右侧的“结束数字”,如果“结束数字”写成了12,那么“数字序列”只能取到11。
到这里,我们已经了解了 for 循环语句的写法,但是你可能会有一个疑问,程序是怎么依次打印出“数字序列”内的所有数据呢?
接下来,来看看 for 循环语句的执行流程吧。
1.2 for 循环语句的执行流程
为了方便我们理解执行流程,我们依旧使用 for 循环语句取出列表元素的例子。
首先体验一下 for 循环语句的代码。
number_list = [1, 2, 3, 4, 5]
sum = 0
for number in number_list:
sum = sum + number
print(sum)
可以看到我们终端的显示。是列表 number_list 内元素依次累加的结果。
我们来分析一下程序。
运行程序后,分别定义了列表 number_list 和变量 sum,其中 sum 是用来存储每一次相加结果的变量。
接着 for 循环语句会从列表 number_list ,即 [1,2,3,4,5] 中依次取出元素。
首先取出列表的第一个元素:1,并赋值给变量 number,完成赋值操作。
程序下一步进入循环体部分,先执行sum = sum + number。
这里是对变量 sum 的重新赋值,程序在开头时给 sum 赋值为 0,加上 number 的值 1 后再赋给 sum,使 sum 的值变为 1。
完成变量 sum 的重新赋值后,执行打印语句print(sum),我们可以看到 sum 的值已经变为 1。
你可以本地运行下面的代码感受一下赋值过程:
sum = 0
number = 1
sum = sum + number
print(sum)
打印语句执行完毕后,即第一次循环执行的循环体执行完毕。程序会去列表取第二个元素:2,再赋值给变量 number,然后执行循环体内的语句。
此时 sum 的值为 1,加上 number 的值 2 后再赋值给 sum,使 sum 的值变为 3。
以此类推,直到我们列表内的最后一个元素被取出并执行完循环体,才算执行完 for 循环语句的整个流程。
最后我们来看一下 for 循环语句执行流程的总结图。
看完 for 循环语句的执行流程图以后,我们来巩固一下 for 循环语句。看看下面的代码后完成练习:
foods = ['薄荷冰粉', '龟苓膏', '草莓圣代']
n = 0
for food in foods:
n = n + 1
print(str(n) + '份甜品')
单选题
以上程序执行后,终端的显示结果为?
A.3份甜品 B.1份甜品
C.0份甜品 D.2份甜品
解析:for 循环语句循环了三次,每次都执行一次 n + 1 的操作,而 print() 语句与 for 循环语句同缩进,所以 for 循环语句执行完毕后才执行打印语句,最终打印变量 n 的结果为 3。
答案:A
本地运行下面的代码,观察一下代码的终端效果。
foods = ['薄荷冰粉', '龟苓膏', '草莓圣代']
n = 0
for food in foods:
n = n + 1
print(str(n) + '份甜品')
我把这两段代码的不同标在了下面这张图里。
在图片中我们可以发现,第二段代码的最后一行相比第一段代码多了缩进。
循环语句的代码块和条件判断语句一样,都是通过缩进来表示的。
在 for 循环语句中,循环体内语句会重复执行,而循环体外则最后执行。
如左图最后一行代码,print() 语句没有缩进,这里就表示 print() 语句不在循环体之中。整个循环执行完之后再去运行 print() 语句。
如右图最后一行代码,print() 语句有了缩进,这里就表示 print() 语句在循环体之中。每一次循环都会执行一遍 print() 语句。
如果我们需要得到一共有多少份甜品,只取最后的整数 n ,就不用重复执行打印,所以 print() 语句不应该放在循环体内。
for 循环语句的讲解就先到这里啦,接下来继续学习循环嵌套。
2. for 循环嵌套
在前面我们已经学习过条件判断嵌套,对嵌套也有个模糊的感觉。
嵌套在编程中泛指一个对象中包含另一个与它相似的对象。
像我们之前接触过的条件判断嵌套就是条件判断语句里面还有另外的条件判断语句。
除此之外,上节课我还提到了数据类型的嵌套,比如列表中的列表。
涉及到嵌套的知识乍一听确实有点抽象,但没关系,下面就让我们结合之前学过的例子来理解嵌套的概念。
比如列表、元组这些我们学过的数据类型嵌套,就像下面这段代码:
pen_bag = ['笔', '尺子', '涂改液']
bag = ['电脑', '雨伞', pen_bag]
'笔'、'尺子'、'涂改液'这几个元素组合成了一个列表 pen_bag。
然后我们可以再把列表 pen_bag 与'电脑'、'雨伞'组合成一个新的列表 bag。
列表中的元素可以是任何类型的数据,像这样一个列表的某个元素是另一个列表就是列表嵌套。
同理,我们知道代码块可以是任何内容,比如它可以是赋值操作,也可以是一个条件判断语句。
for 循环语句下的代码块,即循环体,也可以是一个条件判断语句。
2.1 for 循环语句嵌套条件判断语句
下面我们来看看 for 循环语句嵌套条件判断语句的示例。
下方的代码用来筛选出列表中大于指定数值的数字,本地运行程序后输入一个 0~61 之间的数字感受一下:
number_list = [12, 62, 33, 47, 59]
num = int(input('请输入一个数值:'))
for n in number_list:
if n > num:
print('{}大于{}'.format(n, num))
看到终端将大于你输入的数字显示出来了吗?没有的话要看看是不是输入的值太大了哦。
先给你看看它的执行流程:
这里第 6-7 行的条件判断语句,相对 for 循环语句的首行有缩进,所以我们先把它看做一个循环体①。
number_list = [12, 62, 33, 47, 59]
count = int(input('请输入一个数值,筛选出列表中大于该数值的数字:'))
for n in number_list:
(循环体①)
程序运行后,需要我们在终端输入内容,比如我们输入 45。
外层的 for 开始从列表 number_list 依次取出元素,首先取出第一个元素:12,接着程序进入循环体①内执行条件判断语句。
执行的时候等价于这个情况:
count = 45
n = 12
if n > count:
print('{}大于{}'.format(n, count))
很明显条件 n > count 不成立,程序便继续取出列表的第二元素:62,再进入循环体内执行,直到最后一个元素被取出,且执行完循环体。
这里也有个注意点:无论循环体内 if 语句的条件是否符合,只要执行完 if 语句,程序依旧会取下一个元素再去执行循环体,直到列表内的元素都被取完。
讲到这里不知道你对 for 嵌套 if 的了解如何,我出一道题你来试试看吧。
练习巩固:
循环遍历 cake_number 列表,在循环体中进行条件判断。如果数字小于等于 4,打印'好吃',否则打印'饱了'。
提醒一下,缩进时四个空格和 tab 键最好不要混用哦!你可以在 for 冒号后直接使用 enter 键,这样编辑器会自动帮你缩进。
cake_number = [1, 2, 3, 4, 5]
# for 循环遍历cake_number
for i in cake_number:
# if 条件语句判断,如果数字小于等于4打印'好吃',否则打印'饱了'
来看看我的代码吧:
cake_number = [1, 2, 3, 4, 5]
# for 循环遍历cake_number
for i in cake_number:
# if 条件语句判断,如果数字小于等于4打印'好吃',否则打印'饱了'
if i <= 4:
print('好吃!')
else:
print('饱了!')
这段代码中,if 语句是循环体的内容,所以循环每执行一次,if 语句都会重复执行。
接下来,我们再来看看 for 循环语句的另一个嵌套 —— for 循环语句嵌套 for 循环语句。
2.2 for 循环语句嵌套 for 循环语句
先来本地运行一下 for 循环语句嵌套 for 循环语句的代码示例:
pen_bag = ['笔', '尺子', '涂改液']
computer_bag = ['电脑', '鼠标']
bag_list = [pen_bag, computer_bag]
for bag in bag_list:
for item in bag:
print(item)
我们发现,这段代码把一段完整的for循环语句进行了缩进,写成了一个循环体。
运行程序,for 循环会从列表 bag_list 里依次取元素,即列表 pen_bag 和 computer_bag。
首先取出列表 pen_bag 并赋给变量 bag,接着进入循环体。
进入循环体后,程序执行循环体内的 for 循环语句,从 bag(即列表 pen_bag)依次取出元素,并执行打印语句,直到取出列表 pen_bag 里的最后一个元素且执行完打印语句。
执行完内层的 for 循环语句后,程序再去取列表 computer_bag,再重复执行一次循环体内的代码。
到这里,我们学习完 for 循环语句嵌套 for 循环语句了。
所以说呀,只要按照循环语句或者判断语句本身的执行流程,去理解循环体或整个程序执行的流程,理解嵌套也不是难事!
下面来一道题,实战一下所学的嵌套知识:
练习巩固:
已知一个大列表 total_list 中有两个小列表 number_list1 和 number_list2,小列表内各有五个数字,请筛选出两个列表里大于 60 的数。
number_list1 = [45, 66, 45, 76, 54]
number_list2 = [60, 23, 67, 84, 70]
total_list = [number_list1, number_list2]
# 使用 for 循环语句遍历 total_list
# 使用 for 循环语句遍历 number_list 中的元素
# 使用 if 语句进行条件判断,如果数字大于60,则打印数字
来看看我的代码吧:
number_list1 = [45, 66, 45, 76, 54]
number_list2 = [60, 23, 67, 84, 70]
total_list = [number_list1, number_list2]
# 使用 for 循环语句遍历 total_list
for number_list in total_list:
# 使用 for 循环语句遍历 number_list 中的元素
for number in number_list:
# 使用 if 语句进行条件判断,如果数字大于60,则打印数字
if number > 60:
print(number)
这个嵌套语句啊其实就是一个“纸老虎”,之后再面对任何嵌套语句我们先别慌,就把嵌套语句当做一个普通的代码块。
将复杂问题简单化,按照程序的执行流程一步一步地去理解、去运行。
掌握了程序的嵌套逻辑,能很好理解代码。
3.循环控制
Python 提供给我们两个特殊的语句来控制循环。它们就是continue和break语句。
我们先来学习continue语句。
3.1 continue语句
continue 单词的汉语翻译是“继续”,用在循环里,可以理解为跳出本轮循环,进入下一轮循环的意思。
常见的使用方法是:当循环体中的某个条件被满足后,触发该条件下面的continue语句。
这时,程序会跳过本轮循环的剩余语句,执行下一轮循环。
这句话什么意思呢?我们可以结合下面的例题来理解。
本地运行下面的代码,然后观察这份代码的输出结果。
to_do_list = ['酒吧驻唱', '学Python', '看剧', '写论文', '睡觉']
for i in to_do_list:
if i == '看剧':
continue
print(i)
这段代码只打印出了'酒吧驻唱','学Python','写论文',和'睡觉'这四个元素,'看剧'并没有被打印出来。
这是因为,我在循环体中设置了 if 条件判断,当元素为'看剧'时,执行 if 下面的 continue 语句,跳过了本应该打印'看剧'的这一轮循环。
接下来的动图会模拟这个循环的执行流程,会帮助你更直观的理解continue语句。
总结一下continue语句的具体用法:
在循环中,continue语句通常会和if条件判断一起出现在循环体里。
在执行循环体的过程中,只要 if 条件判断成立,就执行continue语句,跳过本轮循环。
下面让我们来进行一个continue语句的练习:
【代码练习】我们的同学小雨上周在学校点心店吃下午茶的时候,发现盘子里有很多小点心。小雨很饿,决定把盘子里的点心都吃完。
盘子里的所有点心有巧克力酥、草莓酥、榴莲酥以及芒果酥,它们长得都一样,拿起来闻一闻才知道是什么味道。
但小雨不爱吃榴莲,所以当她拿到榴莲酥的时候她会放下来,然后吃下一个。
下面的代码模拟了小雨吃点心的情景,会打印出小雨吃掉的所有点心。
请在下面代码中补充continue语句,让小雨在拿到榴莲酥时跳过循环。
cake_list = ['巧克力酥', '草莓酥', '榴莲酥', '芒果酥']
for cake in cake_list:
# if语句判断,如果cake为'榴莲酥',跳过当前循环
if cake == '榴莲酥':
print(cake)
我的答案是:
cake_list = ['巧克力酥', '草莓酥', '榴莲酥', '芒果酥']
for cake in cake_list:
# if语句判断,如果cake为'榴莲酥',跳过当前循环
if cake == '榴莲酥':
continue
print(cake)
有关continue语句的讲解和练习就到这里,接下来开始今天最后的学习内容break语句。
3.2 break语句
break 可译为“打破,终止”,用在循环里就是打破循环,终止循环的意思。
与continue语句一样,break语句也必须在循环体中使用。
常见的使用方法是:当循环体中的某个条件被满足后,触发该条件下面的break语句。
这时,程序会提前结束整个循环。
这句话又是什么意思呢?我们接着用刚才讲解时的代码来理解break语句。
我只对下面的代码做了一处改动,你试试运行一下查看效果。
to_do_list = ['酒吧驻唱', '学Python', '看剧', '写论文', '睡觉']
for i in to_do_list:
if i == '看剧':
break
print(i)
这回这段代码只输出了'酒吧驻唱'和'学Python'两个元素。
这是因为循环体中的 if 条件判断,当元素为'看剧'时,执行 if 下面的 break 语句,提前结束了整个循环。
所以,最终的结果只打印出了两个元素。
下面我们再来看一下break语句的代码执行动图,更直观的理解break语句。
总结一下 break 语句的具体用法:
在循环中,break 语句通常会和 if 条件判断一起出现在循环体里。
在执行循环体的过程中,只要 if 条件判断成立,就执行 break 语句,提前结束整个循环。
下面让我们来进行一个break语句的练习:
程序设计:
小雨这周又去学校吃的下午茶,点心还跟上周一样。但这次小雨不是很饿,如果她拿到榴莲酥,闻到榴莲的味道她就直接不吃,回去学习。
请在下面代码中补充 break 语句,当小雨拿到榴莲酥时直接结束整个循环。
cake_list = ['巧克力酥', '草莓酥', '榴莲酥', '芒果酥']
for cake in cake_list:
# if语句判断,如果cake为'榴莲酥',提前结束整个循环
我的答案是:
cake_list = ['巧克力酥', '草莓酥', '榴莲酥', '芒果酥']
for cake in cake_list:
# if语句判断,如果cake为'榴莲酥',提前结束整个循环
if cake == '榴莲酥':
break
print(cake)
到这里,我们循环控制的两个语句就已经全部学完了。
小结一下,在Python中,控制循环可以使用continue和break语句来实现,来看下图👇:
下面我再来出一道结合循环嵌套的练习题,这回需要你自己根据题干选择循环控制语句,听好了!
程序设计:
小雨在整理她的两个包,两个包里都有雨伞。今天是晴天,他打算把两个包里的雨伞收走。
下面的代码模拟了小雨收拾两个包的情景,请在下面的代码中补充合适的循环控制语句,让小雨找到雨伞时跳过当前循环,整理下一个东西。
hand_bag = ['钱包', '雨伞', '钥匙包', '口红']
computer_bag = ['电脑', '雨伞', '鼠标']
bag_list = [hand_bag, computer_bag]
# for 循环语句遍历bag_list
for bag in bag_list:
# for 循环语句遍历bag_list中的元素
for item in bag:
# if 语句判断,如果元素为'雨伞',跳过循环
# 打印元素
我的答案是:
hand_bag = ['钱包', '雨伞', '钥匙包', '口红']
computer_bag = ['电脑', '雨伞', '鼠标']
bag_list = [hand_bag, computer_bag]
# for 循环语句遍历bag_list
for bag in bag_list:
# for 循环语句遍历bag_list中的元素
for item in bag:
# if 语句判断,如果元素为'雨伞',跳过循环
if item == '雨伞':
continue
# 打印元素
print(item)
本节的知识点到这里就结束啦,我们来总结总结这节的内容。
4 知识总结
本节主要学习了以下几个知识点:
1)for 循环语句的概念:for 循环语句根据 in 后的可迭代对象,在一定范围内循环执行代码。
2)for 循环语句的语法:① 关键字"for";② 循环变量;③ 关键字"in";④ 可迭代对象;⑤ 英文冒号":";⑥ 缩进;⑦ 循环体。
3)for 循环语句嵌套 if 语句。
4)for 循环语句嵌套 for 循环语句。
5)循环控制语句:① continue语句;② break语句。
"学如逆水行舟,不进则退",学习Python可能有一定的难度,但是持之以恒,你一定能够学会。随着你不断掌握新的知识和技能,你会发现学习Python是一件非常有趣和有意义的事情。坚持下去,你一定能够取得成功!