python优化else_python 中 难以理解的for-else语句
老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”当晚,程序员老公手捧一个包子进了家门……老婆怒道:“你怎么就买了一个包子?”老公答曰:“因为看到了卖西瓜的。”
程序员买西瓜的笑话可能大部分读者都知道,今天写的这篇文章和这个笑话有一定的关系。
任何编程语言都提供了 if…else… 语句,表示如果(if)满足条件就做某件事,否则(else)就做另外一件事:
Python
if a==b:
print("true")
else:
print("false")
1
2
3
4
ifa==b:
print("true")
else:
print("false")
然而,在 Python 中 else 不仅可以和 if 搭配使用,还有另一种特有的句法是 for…else …,除此之外,它还可以和 while、try…except 组合使用,例如:
Python
for i in range(3):
print(i)
else:
print("end")
>>>
0
1
2
end
1
2
3
4
5
6
7
8
9
foriinrange(3):
print(i)
else:
print("end")
>>>
0
1
2
end
但是,你会发现 for…else… 与 if…else… 表现得不一样,按照以往经验来说,执行了 for 语句块中的代码就不执行 else 里面的,反之亦然。
然而,我们看到的却恰恰相反,for 循环结束之后接着又执行了 else 语句块,这就有点意思了,if … else … 翻译成白话就是 如果…否则…,而 for…else… 翻译成白话成了 直到… 然后 …,为什么不把它写成 for…then… 的句式呢?这不更好理解吗?
另外,即使 for 循环遍历的是一个空列表也会执行 else 语句块。
Python
for i in []:
print(i)
else:
print("end")
>>>
end
1
2
3
4
5
6
foriin[]:
print(i)
else:
print("end")
>>>
end
继续探索,如果我们用 break 提前终止 for 循环,会发生什么?
Python
for i in range(3):
print(i)
if i % 2 == 0:
break
else:
print("end")
>>>
0
1
2
3
4
5
6
7
8
foriinrange(3):
print(i)
ifi%2==0:
break
else:
print("end")
>>>
0
循环遇到 break 退出后,整个语句就结束,else 语句块也不执行了。
综上,我们可以得出这样一个结论,只有当循环里没有遇到 break 时,else 块才会执行。此刻,你应该明白了,真正和 else 搭配使用的是 for 循环中的 break,break … else … 才是两个互斥的条件
Python 之父为什么要搞出这样的一种语法糖出来呢?这是我们常人没法理解的。不过「
"Although that way may not be obvious at first unless you're Dutch."。
在平时的开发中真的很少有 for…else… 的应用场景,不过,像下面这种场景用 for else 还真是一种 pythonic 的用法。
当你用 for 循环迭代查找列表的中的某个元素时,如果找到了就立刻退出循环,如果迭代完了列表还没找到需要以另外一种形式(比如异常)的方式通知调用者时,用 for…else… 无疑是最好的选择。
Python
# https://stackoverflow.com/a/9980752/1392860
for i in mylist:
if i == target:
break
process(i)
else:
raise ValueError("List argument missing terminal flag.")
1
2
3
4
5
6
7
# https://stackoverflow.com/a/9980752/1392860
foriinmylist:
ifi==target:
break
process(i)
else:
raiseValueError("List argument missing terminal flag.")
如果不用 for…else… , 那么还需要专门建立一个临时标记变量来标记是否已经找到了
Python
found = False
for i in mylist:
if i == target:
found = True
break
process(i)
if not found:
raise ValueError("List argument missing terminal flag.")
1
2
3
4
5
6
7
8
found=False
foriinmylist:
ifi==target:
found=True
break
process(i)
ifnotfound:
raiseValueError("List argument missing terminal flag.")
当你想在房间里找某样东西时,只要在任意位置找到了,就停止继续搜查工作。但如果把整个房间都翻遍了,还没找到我们想要的东西时,需要告诉人家,很抱歉,这儿没有你要找的东西。遇到这样的情况时就用 for … else ,除此之外,恐怕只会引起误操作。
python优化else_python 中 难以理解的for-else语句相关推荐
- python中for和while可以有else_Python 中的for,if-else和while语句
for循环 功能 for 循环是一种迭代循环机制,迭代即重复相同的逻辑操作,每次的操作都是基于上一次的结果而进行的.并且for循环可以遍历任何序列的项目,如一个列表或者一个字符串 语法 for 循环的 ...
- mysql中难以理解的sql
工作中遇到这样的例子, CASE type WHEN 1 THEN '普通红包' WHEN 2 THEN '普通礼包加油卡' WHEN 3 THEN '优 惠码兑换加油卡' WHEN 4 THEN ' ...
- 对于新手来说,Python 中有哪些难以理解的概念?我似乎明白了
对于初学者,我们都遇到过难以理解一些概念.哪门都有哪些呢? 总结来说有:编码问题.装饰器.闭包.对象引用.可变性,抽象基类.魔术方法.多重继承.mixin.重载.可迭代对象.迭代器和生成器.上下文管理 ...
- 对于0基础来说,Python 中有哪些难以理解的概念?我似乎明白了
对于初学者,我们都遇到过难以理解一些概念.哪门都有哪些呢? 总结来说有:编码问题.装饰器.闭包.对象引用.可变性,抽象基类.魔术方法.多重继承.mixin.重载.可迭代对象.迭代器和生成器.上下文管理 ...
- 深入理解python异步编程 中_这篇文章讲得精彩-深入理解 Python 异步编程(上)!
可惜,二和三现在还没有出来~ ~~~~~~~~~~~~~~~~~~~~~~~~~ http://python.jobbole.com/88291/ ~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
- python多级目录import_深入理解Python中import机制
大型项目中为了维护方便,通常使用模块化开发,模块化的过程中,就会涉及到各种包或者模块的相互导入,即使是对于有多个项目的Python开发者来说, import 也会让人困惑!本文带你深入了解python ...
- python装饰器作用-Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
- (一)Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...
- python神经网络库 keras_在Python和R中使用Keras和Tensorflow进行深度学习
了解TensorFlow 2.0和Keras在Python和R中的深度学习并构建神经网络 深入了解人工神经网络(ANN)和深度学习 了解Keras和Tensorflow库的用法 了解适用人工神经网络( ...
最新文章
- java相关网络协议无响应_java网络协议有哪些
- unity实战 实现鼠标选择对象前置显示
- IE9正式版已完成 截图曝光
- Intel Edision安装Android Things
- Sharepoint学习笔记---SPList--创建一个带有Lookup字段的List
- Redis高可用基石--主从同步
- 【渝粤题库】广东开放大学 人力资源本 形成性考核
- [Oracle]快速构造大量数据的方法
- 阿里开发者招聘节 | 面试题06-07: MySQL的数据如何恢复到任意时间点
- FPGA复位方法总结
- Python学习 Day7 Python3 函数
- React Native For Android 架构初探
- 机器学习基石笔记2——在何时可以使用机器学习(2)
- 2.http dns
- 关于加密与解密、签名与验签
- Java牛客项目课_仿牛客网讨论区_已经看完的部分
- JavaWeb课程设计学生宿舍管理系统
- PR音频处理——收尾音乐
- linux查看xfreedrdp指令,windows和linux的远程桌面
- 实现两个路由器漫游(传统路由器做AP)