在Python中,有while和for两种循环,并且都可以带有else子句,都有什么区别呢?
-
while
循环常用于无法提前确定循环次数的场合,当然也可以用于循环可以提前确定的场合。 -
for
循环常用于可以提前确定循环次数的场合,尤其适合用来迭代或遍历可迭代对象中的元素,这也是for循环的本质。
什么时候执行else,什么时候不执行else语句
-
对于带有
else
子句的循环,如果是因为循环条件不成立或序列中的元素已迭代结束而使得循环自然结束,则继续执行else
子句中的代码。 -
如果是因为执行了
break
语句使得循环提前结束,则不再执行else
子句中的代码。简单来说,break
跳出执行的不仅是for
后面的代码,同时会跳出执行else
后面的代码。
for…else…正确代码示例和说明
num = int(input('请输入一个数字:'))
for test in range(2,num):
if num%test == 0:
print('是合数')
break # else是for里面的一部分,break会同时退出
else:
continue
else:
print('是质数')
代码说明
-
这里第6行的
break
一旦执行,会同时跳出第7行的else
语句和第9行的else
。 -
第8行的
continue
一旦执行,从逻辑上就不会执行第9行的else
。 -
那什么时候会执行第9行的
else
呢?当第3行的
for test in range(2,num):
完全执行结束之后,即test = num
的时候。
所以这段程序完全等价于下面这段程序(仅仅第9行有变化)
num = int(input('请输入一个数字:'))
for test in range(2,num):
if num%test == 0:
print('是合数')
break # else是for里面的一部分,break会同时退出
else:
continue
if test == num: # 原来是else:
print('是质数')
for循环搭配else常见错误和陷阱
错误代码示范
例如我想寻找一个列表list里的特定的数字100,代码如下
list = [34, 756, 234, 21, 100]
for num in list:
if num == 100:
print('found 100')
else: # 注意这是for循环中的else,不是if的else
print('not found 100')
运行结果:
found 100
not found 100
Process finished with exit code 0
为什么又打印出了not found 100
呢?
因为for循环迭代结束了,而且是正常结束的,所以会接着执行else语句,逻辑完全没有问题。
是我们写代码的时候出的问题,找到之后不应该退出循环吗?所以应该加上break
语句。
正确代码示范
修改之后的代码如下:
list = [34, 756, 234, 21, 100]
for num in list:
if num == 100:
print('found 100')
break
else:
print('not found 100')
运行结果:
found 100
Process finished with exit code 0
因为在执行完print('found 100')
之后,又执行了break
,所以会一并跳出第6行的else
语句。在书写的时候我们一定要当心,把else
,break
,continue
,pass
这些东西都写全,这段代码严谨一点应该修改为:
list = [34, 756, 234, 21, 100]
for num in list:
if num == 100:
print('found 100')
break
else:
pass
# 或者写成continue
else:
print('not found 100')
参考文章
-
Python中带else子句的for循环执行过程 - Python小屋 - 优快云博客
https://blog.youkuaiyun.com/oh5W6HinUg43JvRhhB/article/details/78883502 -
Python中for循环搭配else的陷阱 - icebug - 博客园
https://www.cnblogs.com/dspace/p/6622799.html