gpt4 book ai didi

python - 列表中的列表

转载 作者:行者123 更新时间:2023-11-28 20:09:54 25 4
gpt4 key购买 nike

第二行的目的是什么?难道我们不必传入一个列表作为我们的 seed 参数吗?我认为您可以在我们拥有 tocrawl 变量的所有区域中使用种子,而不是在列表中使用列表。

def crawl_web(seed):
tocrawl = [seed]
crawled = []
while tocrawl:
page = tocrawl.pop()
if page not in crawled:
union(tocrawl, get_all_links(get_page(page)))
crawled.append(page)
return crawled

编辑:完整脚本 - http://codepad.org/qxuzVkof

最佳答案

seed 不是列表,而是单个项目,很可能是要抓取的第一个页面的 URL。

虽然可以更改函数的设计以允许多个种子 URL,但这会使函数的签名复杂化 - 几乎每个调用者都只想从一个 URL 抓取。让函数修改调用者的变量也是不好的风格;如果该函数采用参数 tocrawl,您必须记录(并让每个调用者知道):

  • tocrawl 表示作为初始起点的所有 URL
  • tocrawl 必须是list(或兼容类型);普通的可迭代对象支持pop。它还必须符合 union 期望的属性。这是严重的 unpythonic。
  • 如果函数退出,参数列表将为空。这意味着几乎所有调用者都希望传递一份列表副本。
  • 如果函数异常退出,tocrawl 将包含尚未抓取的 URL 的快照。

由于最后两点本质上意味着输入参数被破坏,更好的设计是使参数成为任意可迭代的,然后然后构造一个列表.这样,调用者就不必担心所有这些愚蠢的约定。

还有一件事:与其编写自己的 union 实现并使用列表来存储所有已抓取的网站,不如考虑使用 set在这两种情况下,都是这样的:

def crawl_web(seed):
tocrawl = set([seed])
crawled = set()
while tocrawl:
page = tocrawl.pop()
if page not in crawled:
tocrawl.update(get_all_links(get_page(page)))
crawled.add(page)
return crawled

关于python - 列表中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9694020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com