【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 = 2print("半途而废!!!")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='')continueprint('<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):passelse: print("\r" + string[:string_length-1-i] + "%", end="")time.sleep(0.10)print('<3> 打印标志!', end='')
else:print('\n'+"半途而废!!!")print('----------------------------------')
输出结果:
当前的字符串长度为:12蜀道难,难%<3> 打印标志!
半途而废!!!
----------------------------------
[Finished in 263ms]
【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 = 2print("半途而废!!!")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='')continueprint('<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):passelse: print("\r" + string[:string_length-1-i] + "%", end="")time.sleep(0.10)print('<3> 打印标志!', end='')
else:print('\n'+"半途而废!!!")print('----------------------------------')
输出结果:
当前的字符串长度为:12蜀道难,难%<3> 打印标志!
半途而废!!!
----------------------------------
[Finished in 263ms]
发布评论