社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

For-else:Python 中一个奇怪但有用的特性

技术最前线 • 1 年前 • 407 次点击  

导语

无论使用哪种编程语言,我们都会编写“if-else”语句,但是“for-else”呢?

对于许多语言来说,例如 C、C++ 和 Java,在一个循环后使用“else”是完全错误的。然而 Python 作为一门优雅的语言,拥有这个“奇怪但有用”的特性。如果使用得当,我们的代码会变得更加整洁。

本文将介绍 Python 中的“for-else”功能,并通过简单的示例说明如何正确地使用它。

有关“For-Else”功能的基础知识

当第一次遇到“for-else”这个特性时,它会看起来很奇怪而且难以理解(Python开发者主页君刚开始用到这个功能时,很容易误以为 else 缩进错了)。但实际上,它的用法却出乎意料的简单。一句话就足以说明:代码中的“else”块仅在循环中没有中断时执行。

听起来有点过于简单而显得不真实?让我们通过一个例子来看看:

leaders = ["Elon""Tim""Warren"]

for i in leaders:
    if i == "Yang":
        print("Yang is a leader!")
        break
else:
    print("Not found Yang!")

# Not found Yang!

如上所示:如上所示,leaders 列表中不包含“Yang”,故我们的 for 循环中没有中断。因此“else”块执行并打印了信息。

如果 leaders 列表中包含“Yang”,会如何呢?

leaders = ["Yang""Elon""Tim""Warren"]

for i in leaders:
    if i == "Yang":
        print("Yang is a leader!")
        break
else:
    print("Not found Yang!")

# Yang is a leader!

如上所示,由于leaders 列表中包含“Yang”,for 循环被中断,“else”块中的内容没有执行。

简而言之,for-else 特性本身并不难理解,但是正确而熟练地使用它并不容易。下面我们来介绍三种适合使用 for-else 特性的场景。

使用 For-Else 功能的 3 个场景

我们不一定必须在 Python 程序中使用 for-else 这一特性。老实说,没有它我们也可以做同样的事情,但是使用它可以使我们的代码更加优雅。

1.进行迭代并找出没有被标记的元素

迭代列表以查找特定的元素是使用循环的基本场景。通常当我们找到目标元素后,继续迭代是没有意义的,我们需要跳出循环。问题是:我们如何知道该元素是否被找到呢?

传统的解决方案是定义一个“标记”变量,并在我们找到特定项目时将其设置为 True

leaders = ["Yang""Elon""Tim""Warren"]
have_yang = False
for i in leaders:
    if i == "Yang":
        have_yang = True
        # Do something
        break

if have_yang == False# no yang
    ...  # Do others

如上例所示,have_yang 变量就是一个标志。在 for 循环运行完成后,如果它的值是 False,我们就知道列表中没有“Yang”,而后可以做一些其他的操作。

这种方法已经足够好了,但是如果你想利用 Python 的“优雅”特性,使用 for-else 就是另一种选择:

leaders = ["Yang""Elon""Tim""Warren"]

for i in leaders:
    if i == "Yang":
        have_yang = True
        # Do something
        break
else:  # no yang
    ...  # Do others

这种写法看起来更整洁,对吧?

2. 用于跳出嵌套循环

当代码中存在嵌套循环时,for-else 也可以提供帮助。

for i in range(5):
    for j in range(5):
        if j == 2 and i == 0:
            break
    if not (j == 2 and i == 0):
        continue
    break 

如上所示,跳出嵌套循环有一点困难,因为我们必须知道内部循环是否被跳出。

上面的代码展示了一个笨拙的解决方案来确定内部循环是否已经中断。它当然可以正常工作,但我们可以通过使用 for-else 来使其更整洁:

# use the for-else syntax
for i in range(5):
    for j in range(5):
        if j == 2 and i == 0:
            break
    else:  # only execute when it's no break in the inner loop
        continue
    break

3.协助处理异常

nums = [1305]

for denominator in nums:
    try:
        20/denominator
    except ZeroDivisionError:
        break

else:  # no found ZeroDivisionError
    ...  # Do others

如上所示,如果 for 循环中没有出现 ZeroDivisionError,我们可以在“else”块中进行相应的后续操作。

总结

Python 中的 for-else 特性乍一看会有些奇怪,但是它的用法并不难理解,并且在某些场景下可以发挥其用处。毕竟,我们只需要记住一条规则:“else”块仅在循环中没有中断时执行

参考原文:
https://medium.com/techtofreedom/for-else-a-weird-but-useful-feature-in-python-2076d8dafad1

- EOF -

推荐阅读  点击标题可跳转

1、10 种聚类算法的完整 Python 操作示例

2、一个 Python Bug 干倒了估值 1.6 亿美元的公司

3、比默认的 Python shell 好太多,IPython 实用小技巧合集


↓推荐关注↓

「Python开发者」日常分享 Python 相关的技术文章、实用案例、工具资源、精选课程、热点资讯等


点赞和在看就是最大的支持❤️

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/148541
 
407 次点击