我知道我在这里遗漏了一些非常小的概念。
以下是我要做的事情: - 返回目录中带有“* .html”扩展名的文件中的所有标题。
但是,我写的函数只生成了第一个文件标题。但如果我使用“打印”它会打印所有。
GROUP BY
答案 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)
你有两个选择。将每个结果添加到循环中的本地数据结构(例如,列表)并在循环之后返回列表;或创建此函数作为生成器并在循环中的每个结果上产生(不返回)。
对于较小的数据集,返回方法是可行的。对于较大的数据集,生成器方法更友好甚至是必需的。