在Python中使用匿名函数

2024-10-03 15:26:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些代码可以从众多的url下载数据列表,然后调用另一个函数,传递每个结果。像是。。。在

def ShowUrls(self, url):
    Urls = self.Scraper.GetSubUrls(url)
    for Url in Urls:
        self.UI.addLink(
          Url[0],
          Url[1])

这很好,但是self.Scraper.GetSubUrls运行时会有很长的延迟,然后所有的UI调用都会非常迅速地进行。这会导致UI长时间显示“0个url added”,然后完成。在

我想要的是能够将self.UI.addlink方法传递给self.Scraper.GetSubUrls方法,以便在检索到每个URL后立即调用它。这将使UI在检索到每个url后立即显示正确的计数。在

这可能吗?如果是,正确的语法是什么?在

如果我使用Javascript,我会做一些类似。。。。在

^{pr2}$

然后,在getsuburl内部

SomeParamMethod(Pram1, Param2)

这可能吗?如果是,正确的语法是什么?在


Tags: 数据方法函数代码selfurlui列表
2条回答

这个建议有点复杂,但是如果您控制GetSubUrls,一种更为python的方法可能是使它成为一个生成器,在检索到每个URL时生成它。然后,可以在for循环中处理函数外部的每个URL。例如,我假设GetSubUrls大概看起来像这样:

def GetSubUrls(self, url):
    urls = []
    document = openUrl(url)
    for stuff in document:
        urls.append(stuff)
    return urls

也就是说,它构建一个url列表并返回整个列表。你可以让它成为发电机:

^{pr2}$

那你就可以

for url in self.Scraper.GetSubUrls(url):
    self.UI.addlink(url[0], url[1])

这与前面相同,但是如果GetSubUrls是一个生成器,它不会等到收集所有子url然后返回它们。它一次只生成一个,而您的代码也可以一次处理一个。在

与传递回调相比,这种方法的一个优点是可以存储生成器并随时使用它,而不是在GetSubUrls内部进行调用。也就是说,您可以执行urls = GetSubUrls(url),将其保存到以后,然后在以后的时间“按需”迭代这些url,然后逐个检索它们。使用回调方法强制GetSubUrls函数立即处理所有url。另一个优点是,您不需要创建一堆内容很少的小回调;相反,您可以自然地将这些一行程序编写为for循环的主体。在

请阅读Python生成器以获取更多信息(例如What does the "yield" keyword do in Python?)。在

您可以使用^{},但通常最好创建一个单独的函数并传递它。在

self.Scraper.GetSubUrls(url, lambda url: self.UI.addLink(url[0], url[1]))

或者

^{pr2}$

相关问题 更多 >