广告
返回顶部
首页 > 资讯 > 精选 >为什么不要在for与while循环后写else块
  • 833
分享到

为什么不要在for与while循环后写else块

2023-06-15 16:06:55 833人浏览 泡泡鱼
摘要

这篇文章主要讲解了“为什么不要在for与while循环后写else块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么不要在for与while循环后写else块”吧!实际工作中,笔者不会这

这篇文章主要讲解了“为什么不要在for与while循环后写else块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么不要在for与while循环后写else块”吧!

实际工作中,笔者不会这样写,而是会改用辅助函数完成计算。这样的辅助函数有两种常见的写法。

第一种写法是,只要发现某个条件成立,就立刻返回,如果始终都没碰到这种情况,那么循环就会完整地执行,让程序返回函数末尾的那个值作为默认返回值。

def coprime(a, b):     for i in range(2, min(a, b) + 1):         if a % i == 0 and b % i == 0:             return False     return True  assert coprime(4, 9) assert not coprime(3, 6)

第二种写法是,用变量来记录循环过程中有没有碰到这样的情况,如果有,那就用break提前跳出循环,如果没有,循环就会完整地执行,无论如何,最后都返回这个变量的值。

def coprime_alternate(a, b):     is_coprime = True     for i in range(2, min(a, b) + 1):         if a % i == 0 and b % i == 0:             is_coprime = False             break     return is_coprime assert coprime_alternate(4, 9) assert not coprime_alternate(3, 6)

对于不熟悉for/else结构的人来说,刚才那两种写法都是比较清晰的方案,大家可以根据情况选择其中的一种。

for/else或while/else结构本身虽然可以实现某些逻辑表达,但它给读者(也包括你自己)带来的困惑,已经盖过了它的好处。因为for与while循环这种简单的结构,在python里面读起来应该相当明了才对,如果把else块紧跟在它的后面,那就会让代码产生歧义。所以,请不要这么写。

要点

  • Python有种特殊的语法,可以把else块紧跟在整个for循环或while循环的后面。

  • 只有在整个循环没有因为break提前跳出的情况下,else块才会执行。

  • 把else块紧跟在整个循环后面,会让人不太容易看出这段代码的意思,所以要避免这样写。

Python的循环有一项大多数编程语言都不支持的特性,即可以把else块紧跟在整个循环结构的后面。

for i in range(3):     print('Loop', i) else:     print('Else block!') >>> Loop 0 Loop 1 Loop 2 Else block!

奇怪的是,程序做完整个for循环之后,竟然会执行else块里的内容。既然是这样,那为什么要叫“else”呢?这应该叫“and”才对。在if/else结构里,else的意思是:如果没执行前面那块语句,那就执行else块。在try/except结构里,except也是这个意思:如果前面那块语句执行失败,那就执行except块。

try/except/else结构里的else依然遵循这样的理念,它的意思是:如果没有异常需要处理,那就执行这块语句。try/finally结构里的finally同样很直观,意思是:不管前面那块代码执行得如何,最后都要执行finally块代码。

了解了else、except、finally等在上面那些结构里的用法,Python新手可能就觉得,for/else结构里的else也是这个意思,即如果循环没有从头到尾执行完,那就执行else块。实际上恰恰相反,如果循环没有从头到尾执行完(也就是循环提前终止了),那么else块里的代码是不会执行的。在循环中使用break语句实际上会跳过else块。

for i in range(3):     print('Loop', i)     if i==1:         break else:     print('Else b1ock!') >>> Loop 0 Loop 1

还有一个奇怪的地方是,如果对空白序列做for循环,那么程序立刻就会执行else块。

for x in []:     print('Never runs') else:     print('For Else block!') >>> For Else block!

while循环也是这样,如果首次循环就遇到False,那么程序也会立刻运行else块。

while False:     print('Never runs') else:     print('While Else block!') >>> While Else block!

把else设计成这样,是想让你利用它实现搜索逻辑。

例如,如果要判断两个数是否互质(也就是除了1之外,是不是没有别的数能够同时整除它们),就可以用这种结构实现。先把有可能同时整除它们的数逐个试一遍,如果全都试过之后还是没找到这样的数,那么循环就会从头到尾执行完(这意味着循环没有因为break而提前跳出),然后程序就会执行else块里的代码。

a = 4 b = 9 for i in range(2, min(a, b) + 1):     print('Testing',i)     if a % i == 0 and b % i == 0:         print('Not coprime')         break else:     print('Coprime') >>> Testing 2 Testing 3 Testing 4 Coprime

实际工作中,笔者不会这样写,而是会改用辅助函数完成计算。这样的辅助函数有两种常见的写法。

第一种写法是,只要发现某个条件成立,就立刻返回,如果始终都没碰到这种情况,那么循环就会完整地执行,让程序返回函数末尾的那个值作为默认返回值。

def coprime(a, b):     for i in range(2, min(a, b) + 1):         if a % i == 0 and b % i == 0:             return False     return True  assert coprime(4, 9) assert not coprime(3, 6)

第二种写法是,用变量来记录循环过程中有没有碰到这样的情况,如果有,那就用break提前跳出循环,如果没有,循环就会完整地执行,无论如何,最后都返回这个变量的值。

def coprime_alternate(a, b):     is_coprime = True     for i in range(2, min(a, b) + 1):         if a % i == 0 and b % i == 0:             is_coprime = False             break     return is_coprime assert coprime_alternate(4, 9) assert not coprime_alternate(3, 6)

对于不熟悉for/else结构的人来说,刚才那两种写法都是比较清晰的方案,大家可以根据情况选择其中的一种。

for/else或while/else结构本身虽然可以实现某些逻辑表达,但它给读者(也包括你自己)带来的困惑,已经盖过了它的好处。因为for与while循环这种简单的结构,在Python里面读起来应该相当明了才对,如果把else块紧跟在它的后面,那就会让代码产生歧义。所以,请不要这么写。

要点

  • Python有种特殊的语法,可以把else块紧跟在整个for循环或while循环的后面。

  • 只有在整个循环没有因为break提前跳出的情况下,else块才会执行。

  • 把else块紧跟在整个循环后面,会让人不太容易看出这段代码的意思,所以要避免这样写。

感谢各位的阅读,以上就是“为什么不要在for与while循环后写else块”的内容了,经过本文的学习后,相信大家对为什么不要在for与while循环后写else块这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 为什么不要在for与while循环后写else块

本文链接: https://www.lsjlt.com/news/280884.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么不要在for与while循环后写else块
    这篇文章主要讲解了“为什么不要在for与while循环后写else块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么不要在for与while循环后写else块”吧!实际工作中,笔者不会这...
    99+
    2023-06-15
  • php之为什么不要在for循环中操作DB
    本篇内容主要讲解“php之为什么不要在for循环中操作DB”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php之为什么不要在for循环中操作DB”吧!前言如何提高程序运行速度,减轻服务器压力是服...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作