【问题标题】:Python: Return function won’t return a listPython:返回函数不会返回列表
【发布时间】:2014-05-09 13:00:42
【问题描述】:

以下函数从服务器打印已安装的应用程序。

def getAppNames():
    for app in service.apps:
        print app.name   

它工作得非常好,它会打印一个已安装应用程序的列表,如下所示:

应用 A

应用 B

应用 C

应用 D

应用 E

应用F

但是,当我将“打印”更改为“返回”时,我得到的只是“应用程序 A”。我已经看到了类似的问题,但我找不到解决方案并探索了不同的方法。基本上我需要像打印函数这样的返回函数,我将不胜感激。 谢谢。

【问题讨论】:

  • service.apps 中的第一个元素在第一次迭代时返回,然后函数停止。您可能正在寻找def getAppNames(): return service.apps
  • 您可能需要阅读一些基础知识。你知道return 是做什么的吗?

标签: python return


【解决方案1】:

return 语句会导致您的函数立即退出。来自文档:

return 将当前函数调用与表达式列表(或 无)作为返回值。

快速解决方法是将名称保存在临时列表中,然后返回列表:

def getAppNames():
    result = []
    for app in service.apps:
        result.append(app.name)
    return result

由于这是一件很常见的事情——遍历一个列表并返回一个新列表——python 为我们提供了一个更好的方法:list comprehensions

你可以像这样重写上面的:

def getAppNames:
    return [app.name for app in service.apps]

这被认为是“pythonic”解决方案,这意味着它使用语言的特殊功能来简化常见任务。

另一个“pythonic”解决方案涉及使用generator。创建生成器涉及按原样获取原始代码,但将return 替换为yield。但是,这会影响您使用该功能的方式。由于您没有展示如何使用该功能,因此我不会在此处展示该示例,因为它可能会增加混乱而不是清晰。可以说有两种以上的方法可以解决您的问题。

【讨论】:

    【解决方案2】:

    有两种解决方案:

    def getAppNames():
        return [app.name for app in service.apps]
    

    def getAppNames():
        for app in service.apps:
            yield app.name
    

    return 不同,yield 将留在循环中。这在 Python 中称为“生成器”。然后,您可以使用list() 将生成器转换为列表或对其进行迭代:

    for name in getAppNames():
        ...
    

    生成器的优点是它不必在内存中构建整个列表。

    【讨论】:

    • 至少还有一个(非pythonic)解决方案,即保持循环并将每个名称附加到列表中,然后返回列表。对于新程序员来说,这可能是一个更简单的概念。
    【解决方案3】:

    您应该阅读有关 Python 的基本文档 :)

    试试这个:

    def getAppNames():
        return [app.name for app in service.apps]
    

    【讨论】:

    • 我认为给一个没有经验的程序员一个列表理解而不解释它的作用不是很有用。
    • 我觉得他不是程序员 :)
    • 给出解释的理由多于代码。
    • 作为非程序员,他只需要解决方案,而不是我想的解释。在其他情况下,理解返回等基本概念的最佳选择是非常开始的人,而不是 stackoverflow
    【解决方案4】:

    在 return 语句之后,函数“结束”——它离开了函数,所以你的 for 循环实际上只进行了一次迭代。

    要返回一个你可以做的列表 -

    return [app for app in service.apps]
    

    或者只是 -

    return service.apps
    

    【讨论】:

    • 他只想要名字。
    【解决方案5】:

    当您第一次点击return 命令时,函数会返回,这就是您只能得到一个结果的原因。

    一些选项:

    • yield 结果使用'yield' 并使函数充当生成器
    • 收集列表(或其他集合)中的所有项目并将其返回。

    【讨论】:

    • +1 用于提及yield; -1 对甚至不理解 return 的人这样做。
    • 我确实解释了为什么 return 不符合 OP 的预期;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2013-01-15
    • 2013-10-22
    相关资源
    最近更新 更多