在循环的第一次迭代之后,`return`退出函数

时间:2017-07-22 16:14:43

标签: python

我知道我在这里遗漏了一些非常小的概念。

以下是我要做的事情: - 返回目录中带有“* .html”扩展名的文件中的所有标题。

但是,我写的函数只生成了第一个文件标题。但如果我使用“打印”它会打印所有。

GROUP BY

2 个答案:

答案 0 :(得分:2)

返回函数内的退出,只给出第一次迭代的结果。函数返回后,控制权将传递回调用者。它没有恢复。

作为解决方案,您有2个选项。

选项1 (建议用于大量数据):将return更改为yield。使用yield将您的函数转换为生成器,您可以从该循环器循环返回其值:

def titles():
    for file_name in glob.glob(os.path.join(dir_path, "*.html")):
        with open(file_name) as html_file:
            soup = BeautifulSoup(html_file)

        yield soup.title.get_text().strip() # yield inside the loop, happens multiple times

for s in titles():
    print(s)

选项2: 将所有输出存储在列表中并在结尾处返回列表:

def titles():
    data = []
    for file_name in glob.glob(os.path.join(dir_path, "*.html")):
        with open(file_name) as html_file:
            soup = BeautifulSoup(html_file)
        data.append(soup.title.get_text().strip())

    return data # return outside the loop, happens once

print(titles())

答案 1 :(得分:1)

你有两个选择。将每个结果添加到循环中的本地数据结构(例如,列表)并在循环之后返回列表;或创建此函数作为生成器并在循环中的每个结果上产生(不返回)。

对于较小的数据集,返回方法是可行的。对于较大的数据集,生成器方法更友好甚至是必需的。