【问题标题】:Why should I use `return` when the script is functional without that?当脚本没有它时,我为什么要使用`return`?
【发布时间】:2019-05-17 14:52:36
【问题描述】:

我创建了一个脚本,使用 Python 来解析电影名称及其年份,这些电影名称分布在一个 torrent 站点的多个页面中,并将它们写入一个 csv 文件。它可以正常工作并将数据写入 csv 文件,没有任何问题。

我没有在我的get_data() 函数中使用这一行return itemlist 就完成了整个工作,并且当我创建这个函数write_data() 完全独立时,我将数据写入了一个取自该列表@987654324 的CSV 文件@位于变量URLS下。

如果我保持现有设计不变,是否有必要使用现在被注释掉的return itemlist这一行?如果有,为什么?

import requests
from bs4 import BeautifulSoup
import csv

URLS = ["https://yts.am/browse-movies?page={}".format(page) for page in range(1,6)]
itemlist = []

def get_data(links):
    for url in links:
        res = requests.get(url)
        soup = BeautifulSoup(res.text,"lxml")
        for record in soup.select('.browse-movie-bottom'):
            items = {}
            items["Name"] = record.select_one('.browse-movie-title').text
            items["Year"] = record.select_one('.browse-movie-year').text
            itemlist.append(items)
    # return itemlist

def write_data():
    with open("outputfile.csv","w", newline="") as f:
        writer = csv.DictWriter(f,['Name','Year'])
        writer.writeheader()
        for data in itemlist:
            writer.writerow(data)

if __name__ == '__main__':
    get_data(URLS)
    write_data()

【问题讨论】:

  • 好吧,反正你也不会使用那个结果。
  • 如果要返回列表,它也应该在函数内部创建。这也将使该功能更具可重用性和可测试性。类似地,它应该被传递给第二个函数,它不是当前“完全独立”。但是,如果脚本可以正常工作,您为什么认为需要对其进行任何更改?
  • 我听说在函数中使用return 是一种很好的做法,这是我问我所做的是否正确@jonrsharpe 的唯一原因?
  • 这是Well, you don't use that result anyway@usr2564301 有什么建议吗?

标签: python python-3.x csv web-scraping return


【解决方案1】:

使用现有设计,您不需要该行,因为您的get_data 打算从外部范围修改列表,而不是返回列表 .

但是,如果您想重命名 itemlist,您还需要在 get_datawrite_data 中重命名它(在所有可能使用它的函数中)

如果您将write_data 定义为,您可能需要return itemlist

def write_data(some_list):
    ...

并将其用作

if __name__ == '__main__':
    write_data(get_data(URLS))

在这种情况下write_data 接收get_data 返回的列表,您不需要在get_data 之外定义itemlist = []

【讨论】:

  • 感谢@Andersson 先生的回答。
【解决方案2】:

在这种特定情况下,您的脚本将起作用。但是在其他地方重用你的函数不是很好吗?在不同的文件中,您可以说:

from xy import get_data
links = ["url1", "url2",...]
a = get_data(links)

无需重写函数即可使用它。

【讨论】:

    【解决方案3】:

    让我们在 Python 控制台中执行此操作:

    >>> import this
    The Zen of Python, by Tim Peters
    
    Beautiful is better than ugly.
    Explicit is better than implicit.
    ...
    

    格言 2 指出“显式优于隐式。”。因此,我认为通过调用它们来告知这些函数的潜在用户预期的副作用会更好地提高可读性。为此,您需要返回您获得的数据列表,并将其交给write_data 以完成其工作。

    作为一个独立的脚本,你的脚本很好。作为一个库,除非您返回您填充的列表,否则它是不切实际的。

    【讨论】:

      【解决方案4】:

      在任何编程语言中使用全局变量都不受欢迎。如果您想重用您的函数,您可以使用 return 语句并将结果传递给 write_data 函数。我建议你看看@andersson 上面给出的内容

      【讨论】:

        【解决方案5】:

        在您的代码中,itemlist 是全局变量。以上情况不需要return语句。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-11
          • 2011-06-02
          • 2011-06-11
          • 1970-01-01
          • 2017-01-04
          相关资源
          最近更新 更多