Python 使用产量时无法在多行中使用不同的值
我试图弄清楚如何使用Python 使用产量时无法在多行中使用不同的值,python,python-3.x,generator,yield,Python,Python 3.x,Generator,Yield,我试图弄清楚如何使用yield在不同的行中打印多个值更清晰:不使用多个产生;相反,一个产生具有多行的。在返回的情况下,我可以使用如下内容: return (placeholder_one,placeholder_two,placeholder_three + placeholder_four,placeholder_five,placeholder_six,title,link) 然而,当我使用yield来做同样的事情时,我会陷入困境 我的目标是将值写入csv文件中。如果我使用retu
yield
在不同的行中打印多个值更清晰:不使用多个产生;相反,一个产生具有多行的。在返回的情况下,我可以使用如下内容:
return (placeholder_one,placeholder_two,placeholder_three +
placeholder_four,placeholder_five,placeholder_six,title,link)
然而,当我使用yield
来做同样的事情时,我会陷入困境
我的目标是将值写入csv文件中。如果我使用return
,我可以用以下方式编写相同的代码:
placeholder_one,placeholder_two,placeholder_three,placeholder_four,placeholder_five,placeholder_six,title,link = fetch_items()
writer.writerow([placeholder_one,placeholder_two,placeholder_three,placeholder_four,placeholder_five,placeholder_six,title,link])
如果我使用yield
,我可以简单地在名称内使用这个函数(这将是最理想的):
我使用了一些占位符来扩大这条线
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
base = "https://stackoverflow.com"
url = "https://stackoverflow.com/questions/tagged/web-scraping"
def fetch_items():
res = requests.get(url,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(res.text,"html.parser")
placeholder_one = "Some name"
placeholder_two = "Some id"
placeholder_three = "Gender info"
placeholder_four = "Some phone"
placeholder_five = "Some email"
placeholder_six = "Some credit info"
for items in soup.select(".summary"):
title = items.select_one(".question-hyperlink").get_text(strip=True)
link = urljoin(base,items.select_one(".question-hyperlink").get("href"))
yield placeholder_one,placeholder_two,placeholder_three,placeholder_four,placeholder_five,placeholder_six,title,link
if __name__ == '__main__':
for item in fetch_items():
print(item)
我如何才能像使用return
那样,在两行或三行中生成值?尝试创建一个列表或元组以生成:
yield [placeholder_one,placeholder_two,placeholder_three + placeholder_four,placeholder_five,placeholder_six,title,link]
例如,请考虑:
def num():
for i in range(10):
yield [2 + i, 6 + i, 7 + i]
for i in num():
print(i[0])
print(i[1])
print(i[2])
还可以看看您是否只是期待着一些接近:
for items in soup.select(".summary"):
title = items.select_one(".question-hyperlink").get_text(strip=True)
link = urljoin(base,items.select_one(".question-hyperlink").get("href"))
yield (placeholder_one,placeholder_two,placeholder_three,
placeholder_four,placeholder_five,placeholder_six,
title,link)
你可以有多个yield
语句,或者你可以做yield from(占位符1,占位符2,…)
是的,我知道它会产生一个元组。也许我误解了你的意图,但我想你每次都想产生一个值-这是正确的吗?请查看编辑@alaniwi。这将帮助你理解确切的原因。谢谢。yield
和return
具有相同的语法(适用于您的用例)。如果您对return(…)
行没有问题,那么也可以使用yield(…)
。长话短说:完全相同的行,只是用yield
更改return
。这正是他们已经在做的事情,只是您已经将输出元组的格式设置得更容易一些。OP并没有真正解释这对他们不起作用的原因,因为它似乎应该起作用。@alaniwi:老实说,我第一次把它作为一条注释发布(如果注释中的代码是可读的,它应该是什么)。但在第二次(可能是第四次或更多)阅读之后,我真的很想知道这是否是OP的问题,并决定将其作为答案发布。当然,如果OP接受另一个答案,则应将其作为非答案删除…谢谢@Serge Ballesta。在返回
的情况下,我在进行第二行时使用了+
,但您坚持使用,
在使用时产生
,这就是修复方法。至于阿兰尼维,我想你还是很难理解这个问题。
for items in soup.select(".summary"):
title = items.select_one(".question-hyperlink").get_text(strip=True)
link = urljoin(base,items.select_one(".question-hyperlink").get("href"))
yield (placeholder_one,placeholder_two,placeholder_three,
placeholder_four,placeholder_five,placeholder_six,
title,link)