¶故事
昨儿,一天迷离。
手忙脚乱,写了一段代码;
误打误撞,通过了测试用例;
迷迷糊糊,提交入库了。
今儿醒来 review, 觉得是 bug, 结果却获得了意外…
因此就有了这个,一次由 python for/while-else 「 语法糖 」 引发的 「 深度学习 」。
故事开头是这样的:
判断一个「 , 」分割的字符串,如果是 None,则返回「 * 」;如果不是,则遍历验证每一个元素是否在列表中,不存在则错误输出,存在则返回列表。
非常简单的逻辑,可我写成了这个样子:
写过一段 C/C++ 或者 Java 的我,review 时看到这个,瞬间懵逼了。
bug 呀,那个 else 不应该出现呀,缩进应该往前提一下呀,语法错误呀…
可是测试用例的处理逻辑却跑的没问题呀,二脸懵逼…
赶紧 Google…
¶Python for/while-else 语法
搜索文档才发现:
Python 的 for…else 和 while…else 语法,是 Python 中最不常用、最为误解的语法特性之一。
Python 中的 for、while 循环都可以有一个可选的 else 分支(类似 if 语句和 try 语句那样),在循环迭代正常完成之后执行。也就是说,如果我们不是以非正常方式以外的其他任意方式退出循环,那么 else 分支将被执行。也就是在循环体内没有 break 语句、没有 return 语句,或者没有异常出现。
那么,写一个 demo 测试一下这个语法糖吧。
¶Demo 测试
把代码写成这样,验证一下这个语法糖。
1 | # coding=utf-8 |
输出的结果是这样的:
1 | --------------------------- |
完整代码地址:python-loop-with-else-demo
庆幸每一次懵逼后的不知所措
庆幸每一次 fix 后的醍醐灌顶。
¶参考资料
[1] https://docs.python.org/2/tutorial/controlflow.html#for-statements
[2] http://book.pythontips.com/en/latest/for_-_else.html
[3] http://python.jobbole.com/81063/