【Python打卡日:20220513】for循环中的break语句陷阱

今天,抽点空闲,复习一下几个和 for 关键字 联系起来用的关键字。

一、for ... else ...

import os
import sys
import time
string = "吁!危乎高哉!!蜀道难,难于上青天!!!"
string_length = len(string)
for i in range(string_length):
    if i == int(string_length/2):
        print("\r" + string[:string_length-1-i] + "|", end="")
        print('位置一半处,打印标志!') 
    else:       # postion = 1 
        print("\r" + string[:string_length-1-i] + "%", end="")
        time.sleep(0.10)
else:  # postion = 2
    print("半途而废!!!")

print('----------------------------------')

二、for ... break ... else .... 

我们可以看到,这里for 紧连着跟了两个 else 语句。当然,postion =1 处的else 是针对 if 语句的分支。这很容易理解。而 position = 2 处的else 语句,才是今天我们谈的主角。

这里,Python 规定,for ... else ...  是合法语句。且,只有for 循环变量 i 取尽了 所有 0~string_length 之间的取值,然后 else 语句才会执行。

我们看输出结果:


吁!危乎高哉!!蜀道难,难于上青天!!%
吁!危乎高哉!!蜀道难,难于上青天!%
吁!危乎高哉!!蜀道难,难于上青天%
吁!危乎高哉!!蜀道难,难于上青%
吁!危乎高哉!!蜀道难,难于上%
吁!危乎高哉!!蜀道难,难于%
吁!危乎高哉!!蜀道难,难%
吁!危乎高哉!!蜀道难,%
吁!危乎高哉!!蜀道难%
吁!危乎高哉!!蜀道%
吁!危乎高哉!!蜀|位置一半处,打印标志!

吁!危乎高哉!!%
吁!危乎高哉!%
吁!危乎高哉%
吁!危乎高%
吁!危乎%
吁!危%
吁!%
吁%
%半途而废!!!
----------------------------------

语句“半途而废”,在最后被打印出来。

【陷阱】疑问来了,什么叫 只有for 循环变量 i 取尽了 所有 0~string_length 之间的取值,然后 else 语句才会执行 ???

对上面的例子,我们进行变形如下:

import os
import sys
import time
string = "吁!危乎高哉!!蜀道难,难于上青天!!!"
string_length = len(string)
for i in range(string_length):
    if i == int(string_length/2):
        print("\r" + string[:string_length-1-i] + "|", end="")
        print('位置一半处,打印标志!')
        break   # 我们此处加了 break 语句
    else:        
        print("\r" + string[:string_length-1-i] + "%", end="")
        time.sleep(0.10)
else:
    print("半途而废!!!")

print('----------------------------------')

我们添加了 “break” 语句。知道,break 语句就是跳出本次 for 循环。指的注意点是,for 同一级的else 语句却没有被执行。而是直接打印最后一句的输出“------------------------------------”。


吁!危乎高哉!!蜀道难,难于上青天!!%
吁!危乎高哉!!蜀道难,难于上青天!%
吁!危乎高哉!!蜀道难,难于上青天%
吁!危乎高哉!!蜀道难,难于上青%
吁!危乎高哉!!蜀道难,难于上%
吁!危乎高哉!!蜀道难,难于%
吁!危乎高哉!!蜀道难,难%
吁!危乎高哉!!蜀道难,%
吁!危乎高哉!!蜀道难%
吁!危乎高哉!!蜀道%
吁!危乎高哉!!蜀|位置一半处,打印标志!
----------------------------------

三、for...continue...else

应用中,还有一种经常使用的结构为: for...continue...else...

例子:

import os
import sys
import time
string = "蜀道难,难于上青天!!!"
string_length = len(string)
print('当前的字符串长度为:{}'.format(string_length))
for i in range(string_length):
    if i == int(string_length/2):
        print("\r" + string[:string_length-1-i] + "|", end="")
        print('<1> 打印标志!', end='')
        continue
        print('<2> 打印标志!', end='')
    else:        
        print("\r" + string[:string_length-1-i] + "%", end="")
        time.sleep(0.10)
    print('<3> 打印标志!', end='')
else:
    print('\n'+"半途而废!!!")

print('----------------------------------')

输出结果:

当前的字符串长度为:12

蜀道难,难于上青天!!%<3> 打印标志!
蜀道难,难于上青天!%<3> 打印标志!
蜀道难,难于上青天%<3> 打印标志!
蜀道难,难于上青%<3> 打印标志!
蜀道难,难于上%<3> 打印标志!
蜀道难,难于%<3> 打印标志!
蜀道难,难|<1> 打印标志!
蜀道难,%<3> 打印标志!
蜀道难%<3> 打印标志!
蜀道%<3> 打印标志!
蜀%<3> 打印标志!
%<3> 打印标志!
半途而废!!!
----------------------------------
[Finished in 1.4s]

可以知道,<1> 打印标志! 在被打印出来之后,并没有继打印 <3> 打印标志!

即:跳过本次循环剩余语句的执行,直接进行下次循环。

四、for...pass...else

pass 语句放在这里讲解,其实有点牵强。因为,pass 语句使用的场合很多。

import os
import sys
import time
string = "蜀道难,难于上青天!!!"
string_length = len(string)
print('当前的字符串长度为:{}'.format(string_length))
for i in range(string_length):
    if i != int(string_length/2):
        pass
    else:        
        print("\r" + string[:string_length-1-i] + "%", end="")
        time.sleep(0.10)
        print('<3> 打印标志!', end='')
else:
    print('\n'+"半途而废!!!")

print('----------------------------------')

输出结果:

当前的字符串长度为:12

蜀道难,难%<3> 打印标志!
半途而废!!!
----------------------------------
[Finished in 263ms]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

那么菜

你的鼓励和批评是我最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值