Python: 返回函数不返回列表

-3 投票
5 回答
14200 浏览
提问于 2025-04-18 05:59

下面这个函数可以从服务器上打印出已安装的应用程序。

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

它运行得非常好,能够列出已安装的应用程序,像这样:

应用程序 A

应用程序 B

应用程序 C

应用程序 D

应用程序 E

应用程序 F

但是,当我把“打印”改成“返回”时,我只得到“应用程序 A”。我看到过类似的问题,但找不到解决办法,也尝试了不同的方法。基本上,我需要返回的功能像打印那样工作,任何帮助都将不胜感激。

谢谢。

5 个回答

0

第一次你使用 return 命令时,函数就会返回结果,这就是为什么你只会得到一个结果的原因。

这里有一些选择:

  • 使用 'yield' 来 生成 结果,让函数变成一个生成器。
  • 把所有的项目收集到一个列表(或者其他集合)中,然后返回这个列表。
1

你应该先看看一些关于Python的基础文档哦 :)

试试这个:

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

在一个函数中,一旦遇到返回语句,函数就“结束”了——这意味着它会离开这个函数,所以你的循环实际上只会执行一次。

如果你想返回一个列表,可以这样做 -

return [app for app in service.apps]

或者也可以这样简单写 -

return service.apps
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():
    ...

生成器的好处在于,它不需要在内存中一次性创建整个列表。

8

return 语句会让你的函数立刻结束。根据文档的说明:

return 会带着表达式列表(或者是 None)作为返回值离开当前的函数调用。

一个简单的解决办法是把名字保存到一个临时列表中,然后返回这个列表:

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

因为这个操作很常见——遍历一个列表并返回一个新列表——所以 Python 提供了更好的方法:列表推导式

你可以把上面的代码改写成这样:

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

这种写法被认为是“pythonic”的解决方案,也就是说它利用了语言的特殊功能,让常见的任务变得更简单。

另一种“pythonic”的解决方案是使用生成器。创建生成器的方式是保持你原来的代码不变,但把 return 替换成 yield。不过,这会影响你使用这个函数的方式。因为你没有展示你是怎么使用这个函数的,所以我就不在这里举例了,这样可能会让人更困惑。可以简单说,解决这个问题的方法不止两种。

撰写回答