诡异的else

计算机程序由两部分组成,数据和语句。每一类数据有一个对应的数据类型,不同编程语言有不同的分类方法,但是不管怎么说,任何语言都有整数、小数、字符串。但是程序都是需要对数据进行处理的,我们用语句来实现数据的处理,语句主要有两大类——条件语句和循环语句(当然还有赋值语句啥的)。在条件语句中,我们通常会写if … else …或者 if … elif … else …,这两个语句大家用的多应该都知道是如何执行的,我就不讲了。刚学编程的新手经常都会认为if和else必须成对出现,要么只能有if,反正就是不能单独出现else。实际上else可以脱离if而存在,但是else自己不能单独存在,但也不是所有的语句都能够和else缠在一起的,比如import语句。能够和else缠在一起的语句有3种:try … except … else …,while … else …,for … else …。下面将一一介绍这三种。

try … except … else …

在有些情况下,在没有出现异常时执行一个代码块很有用。为此,可以使用try … except … else …语句,它的执行方式是当try执行完之后没有任何异常,跳过except,直接执行else的语句,如果有异常,要么被except排除,要么就程序崩溃。程序崩溃就不用多说了,必然不会继续执行了。当被except排除的时候,会执行完except语句里面的内容,然后直接跳过else执行后面的内容。下面来看一个例子。

运行结果如下:

这是在没有异常的情况下的执行结果,也就是try执行完后直接执行else了,接下来我们随便弄一个有异常的语句,代码修改如下:

很明显它会引发一个NameError的异常,因为我a没有定义就去使用,我捕捉的是异常基类,所以任何异常都能捕捉(除了SyntaxError,这个错误大部分情况并不是在运行时触发,而是在解释器检查语法时就触发了。如果想让这个错误在运行时触发,我们就需要绕过运行之前的语法检查,我们可以用exec这个函数传入一个字符串参数,exec是用来执行存放在字符串中的Python代码的,程序运行时,exec执行途中发现参数中有一处语法错误,这个时候语法错误是在运行时产生的,所以就可以被捕获。异常一定是在运行时产生的!)程序的运行结果如下:

从执行结果我们看出,它执行try里面的第一句就引发了异常,之后的也就都没有执行,直接跳到except了,然后跳过else执行后面的内容(后面啥都没有,直接正常退出了)。

while … else …

通常,在循环中使用break是因为你“发现”了什么或“出现”了什么情况。要在循环提前结束时采取某种措施很容易,但有时候你可能想在循环正常结束时才采取某种措施。如何判断循环是提前结束还是正常结束的呢?可在循环开始前定义一个布尔变量,然后在满足条件需要break时,在break之前先将它进行逻辑非的运算,然后将结果付给其本身。这样就可在循环后面使用一条if语句来判断循环是否是提前结束的。如图所示:

一种更简单的方法是在循环后面添加一条else语句,它仅在没执行break时执行。修改上面的代码如下即可:

for … else …

for … else …和while … else …执行过程完全一样,在这就不详细讲解了。这两个语句主要是用来手动实现顺序查找的,顺序查找就是从第一个找到最后一个,当然还有一种查找方式叫二分查找,二分查找比顺序查找快,但是只适用于排好序的数组。

本文分享自微信公众号 - Python机器学习算法说书人(Python-ML-Algorithm),作者:小陈学Python

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-22

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 低级工具——C语言/C++

    虽然我的公众号以Python方向为主,但是Python运行速度太慢,因为做了太多的底层封装。提高速度可以使用多进程,但是多进程占用系统资源太多,为了减少占用的资...

    不可言诉的深渊
  • 新闻汇总(2):再次实现

    初次实现管用,但很不灵活,因为使用它只能从Usenet讨论组获取新闻。在再次实现中,你将对代码稍作重构以修复这种问题。你将各部分代码放在类和方法中,以提高程序的...

    不可言诉的深渊
  • 遗传算法可视化项目(插曲):关于距离的计算

    今天暂时先不讲遗传算法,我要解决的是TSP问题,具体什么TSP问题之前文章里讲过了,大家可以点一下历史消息或者这里:

    不可言诉的深渊
  • 大数据-Hive修改表

    cwl_java
  • 人生苦短,让你的Git飞起来吧

    git是一款超极优秀的版本控制工具,包括Linus大神的linux项目在内的千千万万的项目在使用。你可以使用Eclipse插件管理,亦可以使用终端工具。

    技术小黑屋
  • 一次"艰难"的XSS Bypass之旅

    这绝对是我玩过的最乏味的一次XSS。 我使用Burp进行枚举,用高级选项来控制测试范围。

    周俊辉
  • 玩转 Nodejs 命令行

    在做 cli 工具的时候,非常需要命令行相关的第三方库。一个比较稳健成熟的命令行应该考虑以下 4 种需求:

    心谭博客
  • 混合线性模型学习笔记2

    这一个章节主要是介绍混线性模型的应用,其实我们很多本科时候学的统计学知识(大都是一般线性模型,回归分析,方差分析等等)都可以放在混合线性模型的框架下进行分析,就...

    邓飞
  • Element table设置固定列,没有滚动条时底部会显示一条线的解决方法

    在小屏幕上含有滚动条,显示是正常的,但是如果是大屏幕没有滚动条就在底部约17像素的地方有一条线,非常不美观,

    tianyawhl
  • Zookeeper Watcher机制

    ZooKeeper是用来协调(同步)分布式进程的服务,多个分布式进程通过ZooKeeper提供的API来操作共享的ZooKeeper内存数据对象ZNode来达成...

    Monica2333

扫码关注云+社区

领取腾讯云代金券