循环体与else语句
大家一定非常熟悉else关键字语句,else通常是用来配合if语句使用的,但是在Python的else语句并不只能用在if语句之后,还可以用在循环语句甚至try异常处理语句中,这虽然不是什么秘密,但是很多人没有发现它的好处。
for & else
默认情况下,只有当for循环语句正常执行后,最后才会执行else语句。
for i in list("abcdefg"):
print(i)
else:
print("I am 'else' expression.")
# 输出如下:
# a
# b
# c
# d
# e
# f
# g
# I am 'else' expression.
但是如果像下面这样,循环语句里出现了break语句或者return之类跳出去的语句的话,同时又符合被跳出去的条件,那么else就不会被执行了,因为被提前跳出去了。但是被continue语句跳过是没有任何问题的,因为最终还是会执行下去语句不会跳出执行体。
for i in list("abcdefg"):
print(i)
if i == "c":
break
else:
print("I am 'else' expression.")
# 输出如下:
# a
# b
# c
那什么时候用else合适呢,试想一种场景,我们要遍历一个元素列表,判断列表中是否有奇数,如果存在就打印奇数存在,不存在就打印奇数不存在。对于这类判断是否存在某个值的时候,我们都会考虑设定一个flag开关来判断,因为不设立flag判断的话,像下面示例这样直接在循环体内做判断设置打印语句就会把每次判断一个元素的的结果都打印一遍,显得十分多余,也极不推荐和采纳。
numbers = [2, 4, 6, 8, 10]
for n in numbers:
if n % 2 == 1:
print('Odd exist')
break
else:
print('Odd does not exist')
# 输出如下:
# Odd does not exist
# Odd does not exist
# Odd does not exist
# Odd does not exist
# Odd does not exist
通常像下面这样设立一个flag开关来判断是否存在某个元素更合理。
numbers = [2, 4, 6, 8, 10]
flag = False
for n in numbers:
if n % 2 == 1:
flag = True
break
if flag:
print('Odd exist')
else:
print('Odd does not exist')
# 输出如下:
# Odd does not exist
但是考虑到代码优化和尽可能pythonic的话,往for循环里添加else语句就很合适了,这样是不是更简洁。
numbers = [2, 4, 6, 8, 10]
for n in numbers:
if n % 2 == 1:
print('Odd exist')
break
else:
print('Odd does not exist')
# 输出如下:
# Odd does not exist
所以,对于带有else子句的for循环,如果是因为循环条件不成立或序列中的元素已迭代结束而使得循环自然结束,则继续执行else子句中的代码;而如果是因为执行了break语句使得循环提前结束,则不再执行else子句中的代码。
while & else
下面这个例子中,在while循环的时候,我们判断while是否小于4,如果小于就执行循环,如果不小于它就不会做任何执行也不会给出任何提示。
number = 5
while number < 4:
if number == 3:
break
print(number)
number += 1
但是我们可以在while语句后面搭配else语句给出一个打印提示,使代码更容易理解。
number = 5
while number < 4:
if number == 3:
break
print(number)
number += 1
else:
print('number is greater then 4')
# 输出如下:
# number is greater then 4