我有一个python中的方法/函数,其中我';我试图得到一个返回值,然后在另一个函数中用作变量

我有一个python中的方法/函数,其中我';我试图得到一个返回值,然后在另一个函数中用作变量,python,Python,因此,我正在尝试学习Python,同时编写一些代码来帮助自己完成一些平凡的任务。 所以我有一个函数,如果我使用print语句来显示我所需要的内容,它工作得很好,但是当我将“print”语句替换为“return”时,我只得到列表中的第一个元素,因为“return”导致函数退出,但我不知道如何让它返回其余的元素。 我尝试了很多东西,现在已经读了好几个小时了,但仍然没有进一步的进展。 目标:读取目录中的所有“*.common”文件,然后将它们与包含一些名称的文本文件进行比较,如果它们匹配,则返回*.c

因此,我正在尝试学习Python,同时编写一些代码来帮助自己完成一些平凡的任务。 所以我有一个函数,如果我使用print语句来显示我所需要的内容,它工作得很好,但是当我将“print”语句替换为“return”时,我只得到列表中的第一个元素,因为“return”导致函数退出,但我不知道如何让它返回其余的元素。 我尝试了很多东西,现在已经读了好几个小时了,但仍然没有进一步的进展。 目标:读取目录中的所有“*.common”文件,然后将它们与包含一些名称的文本文件进行比较,如果它们匹配,则返回*.common文件的名称,以便我可以在另一个函数中将其用作变量。 到目前为止,我一直在写代码

# This method gets the list of common files....
def get_common_files():
    path = (config_home)
    files = []

    for r, d, f in os.walk(path):
        for file in f:
            if '.common' in file:
                files.append(file)

    for f in files:
        return files

new_file = get_common_files()

def build_default_manifest():
    for line in fileinput.FileInput(new_manifest):
        for name in new_file:
            if line.strip() in name:
                print(name) # works as it should and displays all that i need
                return name  # only shows me the first element 


good_name = build_default_manifest()
print(good_name)  
我希望我已经提供了所需的一切,但如果没有,请随时回到我身边……

当您这样做时:

for f in files:
    return files
这是不完全正确的。这里有两个问题。首先,这只是返回
文件
——整个过程,一次。在
返回
周围放置一个循环体并没有真正的意义。可能您想键入
返回f
,以迭代结果……但这导致了第二个问题

return
语句将在第一次遇到它时运行,导致函数结束,仅此而已。因此,仅更改返回到
return f
的内容仍然不起作用:它将只返回
文件中的第一个值

这实际上非常接近一种更高级的模式,称为生成器。如果您将上述模式替换为:

for f in files:
    yield f
那么你的函数就应该起作用了。解释它为什么起作用并不那么容易,但是 有一些很好的答案应该会有所帮助

出于好奇,这是你自己写的,还是你在某处遵循了一个例子?我只是有点惊讶于你如此接近生成器模式,显然是无意的,并且假设你以前没有意识到

def build_default_manifest():
    for line in fileinput.FileInput(new_manifest):
        for name in new_file:
            if line.strip() in name:
                yield name  

good_name = build_default_manifest()
for name in good_name:

    print(name)
就像Z4 tier说的,听起来你需要一个发电机


您可以使用每个元素的良好名称进行函数调用,就像普通调用一样。

也许我在这里遗漏了一些东西,但您的for循环(对于r,d…)是否已经创建了名为“文件”的列表?因此,为什么不更改:

for f in files:
    return files


哪个应该只返回整个列表?

这回答了你的问题吗?当你启动for循环
for f in files
时,你会立即执行一个
返回
。因此循环在第一次迭代后立即退出。你可以只执行
返回文件
。你不必执行for循环,因为
files
i它已经是一个列表。```您只得到文件中f的第一个值实际上,他正在获取全部
文件
。再次检查
返回
:-D@RicardoC阿尔德内斯啊,你说得对!眼光好,我会更新的。谢谢大家的及时回复,非常感谢。我会尝试一下,并根据我找到的例子,提供反馈@Z4 tier我自己写的。
return files