【Python 3.6.1】循环语句中使用break和continue
一、break:跳出当前的循环体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# 代码 [root@dt xxf]# cat bk.py for i in 'yujiutech': if i == 't': break print (i) print ('*' * 18) i = 1 while i<=10: if i == 9: break print (i) i +=1 [root@dt xxf]# # 执行效果 [root@dt xxf]# python3 bk.py y u j i u ****************** 1 2 3 4 5 6 7 8 [root@dt xxf]# |
二、continue:跳过当前循环块中剩余的部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 代码 [root@dt xxf]# cat ct.py for i in 'yujiutech': if i == 't': continue print (i) [root@dt xxf]# # 执行效果,我们可以看到,t字母没有打印出来 [root@dt xxf]# python3 ct.py y u j i u e c h [root@dt xxf]# |
2.1 continue 注意事项:死循环
while循环时使用continue时需要格外的注意,否则会出现死循环,在此只举例说一下死循环的例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[root@dt xxf]# cat ctd.py i = 1 while i<=10: if i == 9: continue print (i) i +=1 [root@dt xxf]# python ctd.py 1 2 3 4 5 6 7 8 # 此时就会出现死循环 |
我们分析一下上面的代码,当 i == 9 时,转到continue,然后就跳过continue之后所有的循环块,也就是说跳过了i自增长的那一句话,也就意味着i的值一直是9,循环条件是i<=10,所以,while循环将永远循环下去,此时只能 Ctrl + c 强制结束了
代码可以稍加修改,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
[root@dt xxf]# cat ctd.py i = 0 while i<=10: i +=1 if i == 9: continue print (i) [root@dt xxf]# python3 ctd.py 1 2 3 4 5 6 7 8 10 11 [root@dt xxf]# |
2.2 continue 注意事项:数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# db.conf配置文件 [root@dt xxf]# cat db.conf [default] ip = 192.168.1.8 port = 1521 [odb_9] ip = 192.168,1.9 port = 1521 [odb_201] ip = 192.168.1.201 port = 1526 [root@dt xxf]# # 测试代码,读取db.conf配置文件,如果port=1521,那么continue,也就是说,print (s)这句话将不会被执行,也就是说,只打印odb_201这个section,因为它的port=1526 [root@dt xxf]# cat ctt.py import configparser cf = configparser.ConfigParser() cf.read("db.conf") sec = cf.sections() for s in sec: host = cf.get(s,"ip") port = cf.get(s,"port") print ("*" * 20) print (host, port) if port == 1521: continue print (s) [root@dt xxf]# ## 执行测试代码 [root@dt xxf]# python3 ctt.py ******************** 192.168.1.8 1521 default ******************** 192.168,1.9 1521 odb_9 ******************** 192.168.1.201 1526 odb_201 [root@dt xxf]# |
看到上面的测试结果,显示跟我们预期的不一样,甚至开始怀疑人生。那么原因是什么呢?其实就是标题上我提到的,数据类型的问题,从配置文件中提取的字符串均为字符型,所以,在代码中if判断时,数据类型要匹配,修改、测试如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
## 修改代码,修改if语句的数据类型,两种方法均可 [root@dt xxf]# cat ctt.py import configparser cf = configparser.ConfigParser() cf.read("db.conf") sec = cf.sections() for s in sec: host = cf.get(s,"ip") port = cf.get(s,"port") print ("*" * 20) print (host, port) #if int(port) == 1521: if port == "1521": continue print (s) [root@dt xxf]# ## 执行修改后的代码,显然,此时我们看到我们想看到的效果了 [root@dt xxf]# python3 ctt.py ******************** 192.168.1.8 1521 ******************** 192.168,1.9 1521 ******************** 192.168.1.201 1526 odb_201 [root@dt xxf]# |