我理解这种 struct 的工作原理:

for i in range(10):
    print(i)

    if i == 9:
        print("Too big - I'm giving up!")
        break
else:
    print("Completed successfully")

但我不明白为什么这里使用else作为关键字,因为它表明,只有在for块没有完成时,相关代码才会运行,这与它的功能相反!不管我怎么想,我的大脑都无法从for语句无缝地发展到else语句块.对我来说,continuecontinuewith会更有意义(我正在努力训练自己阅读它).

我想知道Python程序员是如何在他们的头脑中读到这个 struct 的(如果您愿意,也可以大声说出来).也许我遗漏了一些可以使这样的代码块更容易理解的东西?

推荐答案

即使对经验丰富的Python程序员来说,这也是一种奇怪的构造.当与for循环结合使用时,它基本上意味着"在iterable中查找某个项,否则如果没有找到,则执行…".例如:

found_obj = None
for obj in objects:
    if obj.key == search_key:
        found_obj = obj
        break
else:
    print('No object found.')

但是,每当你看到这个构造时,一个更好的 Select 就是将搜索封装在一个函数中:

def find_obj(search_key):
    for obj in objects:
        if obj.key == search_key:
            return obj

或者使用列表:

matching_objs = [o for o in objects if o.key == search_key]
if matching_objs:
    print('Found {}'.format(matching_objs[0]))
else:
    print('No object found.')

它在语义上并不等同于其他两个版本,但在非性能关键代码中工作得足够好,无论您是否迭代整个列表.其他人可能不同意,但我个人会避免在生产代码中使用for-else或while-else块.

另见第[Python-ideas] Summary of for...else threads

Python相关问答推荐

如果条件为真,则Groupby.mean()

即使在可见的情况下也不相互作用

沿着数组中的轴计算真实条目

对于一个给定的数字,找出一个整数的最小和最大可能的和

_repr_html_实现自定义__getattr_时未显示

如何获取TFIDF Transformer中的值?

driver. find_element无法通过class_name找到元素'""

Plotly Dash Creating Interactive Graph下拉列表

Pandas GroupBy可以分成两个盒子吗?

Python Pandas—时间序列—时间戳缺失时间精确在00:00

在pandas/python中计数嵌套类别

剪切间隔以添加特定日期

如何将数据帧中的timedelta转换为datetime

在Docker容器(Alpine)上运行的Python应用程序中读取. accdb数据库

如何合并具有相同元素的 torch 矩阵的行?

如何从比较函数生成ngroup?

Polars定制函数返回多列

使用pythonminidom过滤XML文件

两个名称相同但值不同的 Select 都会产生相同的值(discord.py)

Python:使用asyncio.StreamReader.readline()读取长行