老婆给当程序员的老公打电话:“下班顺路买一斤包子带回来,如果看到卖西瓜的,买一个。”当晚,程序员老公手捧一个包子进了家门……老婆怒道:“你怎么就买了一个包子?”老公答曰:“因为看到了卖西瓜的。”

程序员买西瓜的笑话可能大部分读者都知道,今天写的这篇文章和这个笑话有一定的关系。

任何编程语言都提供了 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语句相关推荐

  1. python中for和while可以有else_Python 中的for,if-else和while语句

    for循环 功能 for 循环是一种迭代循环机制,迭代即重复相同的逻辑操作,每次的操作都是基于上一次的结果而进行的.并且for循环可以遍历任何序列的项目,如一个列表或者一个字符串 语法 for 循环的 ...

  2. mysql中难以理解的sql

    工作中遇到这样的例子, CASE type WHEN 1 THEN '普通红包' WHEN 2 THEN '普通礼包加油卡' WHEN 3 THEN '优 惠码兑换加油卡' WHEN 4 THEN ' ...

  3. 对于新手来说,Python 中有哪些难以理解的概念?我似乎明白了

    对于初学者,我们都遇到过难以理解一些概念.哪门都有哪些呢? 总结来说有:编码问题.装饰器.闭包.对象引用.可变性,抽象基类.魔术方法.多重继承.mixin.重载.可迭代对象.迭代器和生成器.上下文管理 ...

  4. 对于0基础来说,Python 中有哪些难以理解的概念?我似乎明白了

    对于初学者,我们都遇到过难以理解一些概念.哪门都有哪些呢? 总结来说有:编码问题.装饰器.闭包.对象引用.可变性,抽象基类.魔术方法.多重继承.mixin.重载.可迭代对象.迭代器和生成器.上下文管理 ...

  5. 深入理解python异步编程 中_这篇文章讲得精彩-深入理解 Python 异步编程(上)!

    可惜,二和三现在还没有出来~ ~~~~~~~~~~~~~~~~~~~~~~~~~ http://python.jobbole.com/88291/ ~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  6. python多级目录import_深入理解Python中import机制

    大型项目中为了维护方便,通常使用模块化开发,模块化的过程中,就会涉及到各种包或者模块的相互导入,即使是对于有多个项目的Python开发者来说, import 也会让人困惑!本文带你深入了解python ...

  7. python装饰器作用-Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  8. (一)Python装饰器的通俗理解

    在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Py ...

  9. python神经网络库 keras_在Python和R中使用Keras和Tensorflow进行深度学习

    了解TensorFlow 2.0和Keras在Python和R中的深度学习并构建神经网络 深入了解人工神经网络(ANN)和深度学习 了解Keras和Tensorflow库的用法 了解适用人工神经网络( ...

最新文章

  1. java相关网络协议无响应_java网络协议有哪些
  2. unity实战 实现鼠标选择对象前置显示
  3. IE9正式版已完成 截图曝光
  4. Intel Edision安装Android Things
  5. Sharepoint学习笔记---SPList--创建一个带有Lookup字段的List
  6. Redis高可用基石--主从同步
  7. 【渝粤题库】广东开放大学 人力资源本 形成性考核
  8. [Oracle]快速构造大量数据的方法
  9. 阿里开发者招聘节 | 面试题06-07: MySQL的数据如何恢复到任意时间点
  10. FPGA复位方法总结
  11. Python学习 Day7 Python3 函数
  12. React Native For Android 架构初探
  13. 机器学习基石笔记2——在何时可以使用机器学习(2)
  14. 2.http dns
  15. 关于加密与解密、签名与验签
  16. Java牛客项目课_仿牛客网讨论区_已经看完的部分
  17. JavaWeb课程设计学生宿舍管理系统
  18. PR音频处理——收尾音乐
  19. linux查看xfreedrdp指令,windows和linux的远程桌面
  20. 实现两个路由器漫游(传统路由器做AP)

热门文章

  1. 哈夫曼编码(基于哈夫曼树-最优二叉树,不唯一)、B树(b-树)、B+树
  2. 杭州一员工因离职和领导起纠纷,携带爆炸物把写字楼给炸了!
  3. Zircon内核到用户空间启动流程(userboot)
  4. 硬盘重新分区怎么操作?硬盘分区软件推荐
  5. # PyTorch学习笔记(15)--神经网络模型训练实战
  6. vue关闭代码格式校验
  7. 我国电信运营商经营即时通信业务前景分析
  8. 使用pytorch搭建MLP多层感知器分类网络判断LOL比赛胜负
  9. 22-基于单片机的LED点阵滚动显示系统
  10. python没有用官方正版会不会有什么影响呢_正版系统有必要买吗