Anders Wang


我所认识的每个人都是榜样,都有值得我去尊敬和学习的地方。


循环体与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  
最近的文章

python的短逻辑

python中的与(and)和或(or)都是短路的与或,短路指的是当通过第一个值能判断出结果时,就不再去查看第二个值了。 Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布…

Python, 技术博文详细阅读
更早的文章

Python变量的作用域

Python程序有各种各样的命名空间,它指的是在该程序段内一个特定的名称是独一无二的,它和其它同名的命名空间是无关的。 在Python中每一个函数都有自己的命名空间,如果在函数体外部,也就是主程序范围…

Python, 技术博文详细阅读
comments powered by Disqus