Python 中被忽略的 else

来源:Python中文社区

ID:python-china

else, 我们再熟悉不过了。对于一个python程序员来说,else往往都是配合if来使用的,像这样:

a = '12'if a == '123':    print(a)else:    print('出错了!')

但是,python中的else并不只能用在if之后,so,这次我们讨论一下Python流程控制中的else。

else子句不仅能在if 语句中使用,还能在 for、while 和 try 语句中使用,这个语言特性不是什么秘密,但却没有得到重视。我们看一个例子:

my_list = ['apple', 'pear', 'orange', 'banana']for item in my_list:    if item == 'banana':        print('Founded!')        breakelse:    raise ValueError('No banana flavor found!')

本例当中,循环最后找到了'banana',输出'Founded!',并且跳出循环,所以else字句并没有被执行。但如果,将代码修改一下,去掉列表中的'banana':

my_list = ['apple', 'pear', 'orange']for item in my_list:    if item == 'banana':        print('Founded!')        breakelse:    raise ValueError('No banana flavor found!')

运行代码就会直接抛出错误!如果不使用else字句来完成上述功能,可能我们就需要设置控制标志了,像这样:

my_list = ['apple', 'pear', 'orange']flag = Truefor item in my_list:    if item == 'banana':        print('Founded!')        flag = False        breakif flag:    raise ValueError('No banana flavor found!')

很明显,这里使用了额外的变量flag和if语句。

while 和 for相类似,简单举个例子:

a = 'apple'while a == 'banana':    passelse:    raise ValueError('No banana flavor found!')

下面看一下try:

try:    dangerous_call()except OSError:    log('OSError...')else:    after_call()

很明确,try 块防守的是 dangerouscall() 可能出现的错误,而且很明显,只有 try 块不抛出异常,才会执行aftercall()。

现在,总结一下else 子句的行为如下:

for:

仅当 for 循环运行完毕时(即 for 循环没有被 break 语句中止)才运行 else 块。

while:

仅当 while 循环因为条件为假值而退出时(即 while 循环没有被break 语句中止)才运行 else 块。

try:

仅当 try 块中没有异常抛出时才运行 else 块。

即,如果异常或者 return、break 或 continue 语句导致控制权跳到了复合语句的主块之外,那么else 子句也会被跳过。

for/else、while/else 和 try/else 的语义关系紧密,不过与if/else 差别很大。主要是else 这个单词的意思阻碍了我们对这些特性的理解。 按正常的理解应该是“要么运行这个循环,要么做那件事”。可是,在循环中,else 的语义恰好相反:“运行这个循环,然后做那件事。”不过,相信多使用几次,你会熟悉的。

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2018-05-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5387
来自专栏魂祭心

原 canvas绘制clock

4254
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2626
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

25410
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3255
来自专栏落花落雨不落叶

canvas画简单电路图

65111
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

7148
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

32610
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5676
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2727

扫码关注云+社区