从循环内部返回是一种好习惯[关闭]

Posted

技术标签:

【中文标题】从循环内部返回是一种好习惯[关闭]【英文标题】:Is it good practice to return from inside a loop [closed] 【发布时间】:2018-10-20 07:34:10 【问题描述】:

当我编写任何验证函数时,我会编写如下所示的代码

方法 1。

def func():
    for section in sections:
        if section.has_timetable():
            return True
    return False

但最近我在想退出这样的功能是一种好习惯吗?这种做法会不会有什么后果,如果是的话应该按照方法2吗?

方法 2

def func():
    has_timetable = False
    for section in sections:
        if section.has_timetable():
            has_timetable = True
            break
    return has_timetable

【问题讨论】:

是的,早点返回通常是首选,而不是在不需要时完成对整个集合的迭代,除非有其他事情需要进行完整的迭代(找到最小/最大值等.) 抱歉我忘了加break,但是可以通过return来打破循环吗? 哦,好吧,如果您要跳出循环并立即返回,请返回! 感谢您的回答 也可以:any(s.has_timetable() for s in sections) 【参考方案1】:

pythonic 的写法是这样的

def has_timetable(sections):
    for section in sections:
        if section.has_timetable():
            result = True
            break
    else:
        result = False
    return result

但是你是break然后返回还是早点返回是个人喜好问题;至少在这种情况下。此功能易于阅读和理解,因此,多个return 没有害处。在具有多个返回的较长函数中,可能很难获得所有退出点。

我会选择更适合你阅读的东西

【讨论】:

【参考方案2】:

方法 1 比方法 2 更有效,因为它会在找到匹配条件后立即返回。但是,就良好实践而言,我觉得最好有一个单一的 return 语句。例如,如果您有多个条件要检查,将会有多个 return 语句,这会使调试变得困难(假设您想在代码中放置一个断点以在函数返回之前检查返回值。您最终会在每个返回声明。)。为避免这种情况,您可以稍微修改您的方法 2 代码以使其更高效,如下所示:

 def func():
    has_timetable = False
    for section in sections:
        if section.has_timetable():
            has_timetable = True
            break
    return has_timetable

因此,您可以有多个break 语句,而只有一个return 语句。调试时,您只需在return 语句处放置一个断点。

【讨论】:

【参考方案3】:

是的,没关系!当然,您必须确保您确实得到了您正在寻找的结果,但是如果您在循环内返回,则不会发生任何不好的事情。 Return 只是将结果传递给您,实际上在循环中返回一些值是很常见的。在您的情况下,它是一个布尔值,因此您返回 true(或者您可以将其视为 1)或 false(作为 0)

【讨论】:

以上是关于从循环内部返回是一种好习惯[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在公共头文件中包含条件是不是被认为是一种好习惯?

将 if 语句放在 main() 或函数内部以响应用户输入是一种好习惯吗?

编写返回 void 的方法是一种好习惯吗?

C# 中的重载运算符实际上是一种好习惯吗? [关闭]

将嵌入式码头和 GRPC 服务器运行在同一个 JVM 中是一种好习惯吗?

ASP.NET MVC:让 AP​​I 控制器操作返回 View 和/或 JSON 是不是是一种好习惯