Python的控制流:break和continue

公众号:尤而小屋
作者:Peter
编辑:Peter

大家好,我是Peter~

之前给大家介绍过Python中的for、if、赋值等相关语句,本文介绍的Python中的两种控制流:break和continue

首先,从英文单词的字面上,我们可以简单地理解下二者:

  • break,中断的意思,在代码中就表现为中断后面代码的运行
  • continue,继续的意思,在代码中体现为继续后面代码的运行

其次,我们需要明白的是二者都有跳出循环的作用,都可以用在for循环和while循环中,但是作用的范围却是不同的。

本文主要讲解两个主要知识点:

  • break和continue语句
  • 缩进对代码块的影响
python

range函数

下面多个例子中的range(m,n,s)函数表示的是取指定数值区间的数值作为迭代器:

  • m:起始位置,整数;默认从0开始,可以取到m;可省略
  • n:终止位置,整数,必须有,取不到n;不能省略
  • s:步长,每次取数的长度;可正可负

下面举例说明:

image
image

单层for循环-break

例子1:

for i in range(8):  # i=0,1,2....7
    if i == 5:  # 当i等于5的时候执行break操作
        break
    print(i)
    
# 结果
0
1
2
3
4

怎么解释上面的结果呢?

  • 当i=0,进入if,不等于5,不执行break,直接print,此时输出0
  • 同样的道理,i=1,2,3,4都是同样的操作
  • 当i=5进入if语句中,发现i=5,执行break,跳出了整个循环,后面的i=6、7就不会执行了

看例子2(只是没有缩进):

for i in range(8):   # i=0,1,2....7
    if i == 5:
        break
print(i)

# 结果
5

这个例子说明的是缩进对代码执行的影响:

  • i=0进行if,不等于5,不执行break,进入下次循环即i=1
  • 同样的道理,当i=1、2、3、4进行if,不等于5,不执行break
  • 当i=5进入if的时候,刚好是等于5,执行break语句跳出整个循环,此时i刚好是5,打印出来print(i)就是5

例子3:

这个例子的结果解释同例子1,只是将range函数的迭代器换成了字符串的形式:

for i in "python":
    if i == "o":
        break
    print(i)
    
# 结果
p
y
t
h

这三个break相关的例子说明:当遇到满足break条件,则会跳出整个for循环;当然,这仅仅是针对单层循环。

单层for循环-continue

例子4:

for i in range(8):  # i=0,1,2....7
    if i == 5:
        continue
    print(i)
    
# 结果
0
1
2
3
4
6
7

解释下上面的结果:

  • 当i=0进入if循环,不等于5,不执行continue,执行print(i),打印0;进入下次循环
  • 当i=1、2、3、4进入if循环的时候,都是同样的效果,且执行print(i)的语句
  • 当i=5进入if循环,刚好i等于5,执行continue,跳出此时的print(i),也就是不打印5;直接从开头进入下次的循环
  • 当i=6、7就和i=0、1、2、3、4的解释是相同的

如果print语句不缩进呢?看例子5:

for i in range(8):
    if i == 5:
        continue
print(i)

# 结果
7

从上面例子5的结果可以看出来,最后一次i是等于7;当我们的print语句不缩进的时候,只有当for语句完全执行完毕才会执行,所以要等到最后的i=7才会打印。

例子6:

for i in ["语文","数学","英语"]:
    if i != "数学":
        continue
    print(i)
    
# 结果
数学

解释上面的结果:

  • i为“语文”,第一次进入if语句,i不等于数学,执行continue,不会执行print;进入下次循环
  • 第二次i取值为“数学”,进入if中,不满足if条件,所以不执行continue,执行print,打印出“数学”
  • 后面的“英语”满足if条件,直接continue跳出去了

上面3个continue相关的例子说明:当满足continue语句的条件,则会跳出当前的这次不执行,但是不影响后面的语句执行

高斯求和

例子7:

sum = 0  # 和的初始值

for i in range(1,101):
    if i % 2 == 0:  # i除以2的余数为0,即i是偶数
        break
    sum += i  # sum = sum + i
print(sum)
   
# 结果
1

解释上面的结果:

  • 当i=1进入if,不满足if条件,执行sum += i的语句,此时sum变成了1,i变成了2进入下次循环
  • 当i=2进入if,满足偶数的条件,执行break,直接跳出整个循环,后面的sum+i不再执行
  • print(sum)实际上就是第一步中的sum值1
image

例子9:

sum = 0

for i in range(1,101):   # i从1到100
    if i % 2 == 0:    # i除以2的余数为0,即i是偶数
        continue
    sum += i
print(sum)
        
# 结果
2500

解释上面的结果:

  • 当i=1进入if循环,不满足if条件(i为奇数),执行sum += i,sum变成1,i变成2进入下次循环
  • 当i=2进入if循环,刚好满足if条件(i为偶数),执行continue,不执行后面的sum += 1,i变成3进入下次循环
  • 当i=3进入if循环,不满足if条件(i为奇数),执行sum += i,sum变成1+3=4,i变成4进入下次循环
  • 当i=4进入if循环,刚好满足if条件(i为偶数),执行continue,不执行后面的sum += 1,i变成5进入下次循环

通过前4步我们发现:只有当i为奇数的时候才会执行相加的操作,所以实际上就是1到100的奇数之和,刚好2500

双层for循环-break

例子10:

for i in range(3):  # i:0、1、2
    for j in range(4):  # j:0、1、2、3
        if j > i:
            break
        print((i,j))  # 和if对齐
        
# 结果
(0, 0)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
(2, 2)

解释上面的结果:

上面的代码包含两层for循环,从i=0进入第一层循环:

i j 是否满足if执行break 是否执行print
0 0 是,(0,0)
0 1
0 2 已跳过
0 3 已跳过
1 0 是,(1,0)
1 1 是,(1,1)
1 2 已跳过
1 3 已跳过
2 0 是,(2,0)
2 1 是,(2,1)
2 2 是,(2,2)
2 3 已跳过

这就是整个过程的执行和解释~

例子11:

for i in range(3):    # i=0,1,2
    for j in range(4):   # j=0,1,2,3
        if j > i:
            break
    print((i,j))  # 和第二个for对齐
    
# 结果
(0, 1)
(1, 2)
(2, 3)

解释上面的结果:

这个例子和上面一个的区别是:print和第二个for对齐,也就是说只有当第二个for全部运行结束才会执行print

i j 是否满足if执行break 是否执行print
0 0
0 1 是,(0,1)
0 2 已跳过
0 3 已跳过
1 0
1 1
1 2 是,(1,2)
1 3 已跳过
2 0
2 1
2 2
2 3 是,(2,3)

也就是说:当两层循环的时候,break会跳出最里层(靠break最近)的for循环

例子12:

for i in range(3):
    for j in range(4):
        if j > i:
            break
print((i,j))

# 结果
(2, 3)

上面的结果解释和前两个的过程相同,直到最后的一次(2,3)满足条件break条件便会执行print。

双层for循环-continue

例子13:

for i in range(3):  # i=0,1,2
    for j in range(4):  # j=0,1,2,3
        if j > i:
            continue
        print((i,j))
        
# 结果
(0, 0)
(1, 0)
(1, 1)
(2, 0)
(2, 1)
(2, 2)

解释上面的结果:

i j 是否满足if执行continue 是否执行print
0 0 是,(0,0)
0 1 是,跳出
0 2 是,跳出
0 3 是,跳出
1 0 是,(1,0)
1 1 是,(1,1)
1 2 是,跳出
1 3 是,跳出
2 0 是,(2,0)
2 1 是,(2,1)
2 2 是,(2,2)
2 3 是,跳出

例子14:

for i in range(3):
    for j in range(4):
        if j > i:
            continue
    print((i,j))
    
# 结果
(0, 3)
(1, 3)
(2, 3)

解释上面的结果:

print语句的代码进行了缩进,只有当第二层的for全部执行完毕,才会print

i j 是否满足if执行continue 是否执行print
0 0
0 1 是,跳出
0 2 是,跳出
0 3 是,跳出 是,(0,3)
1 0
1 1
1 2 是,跳出
1 3 是,跳出 是,(1,3)
2 0
2 1
2 2
2 3 是,跳出 是,(2,3)

例子15:

for i in range(3):
    for j in range(4):
        if j > i:
            continue
print((i,j))

# 取最后一次的值
(2, 3)   

总结下二者的本质区别:break 是用于终止整个循环;而continue 是跳出本次循环,不影响下次循环的执行。

神器网站

最后送给大家一个经典的神器网站:https://pythontutor.com/visualize.html#mode=edit,这个网站能够演示我们代码每一步的运行。

我们以这个代码为例:

for i in range(3):
    for j in range(4):
        if j > i:
            continue
    print((i,j))
    
# 结果
(0, 3)
(1, 3)
(2, 3)

1、写入代码

image

2、演示过程:

image

3、具体过程

image

当我们运行到第15步骤,出现了第一个结果:

image

40步全部运行结束,我们想要的结果就看到了:

image

感兴趣的朋友可以去这个网站看看~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容