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)