如何使用map函数对一个函数进行n次应用

4

我开始学习如何以函数式的方式使用Python,但我遇到了一个无法解决的问题。

我有以下代码(部分取自这个问题),它完全符合我的要求:

url = "www.testpage.com/"
def gen_url(prefix, suffix, places=3):
    pattern = "{}{{:0{}d}}{}".format(prefix, places, suffix)
    for i in count(1):
        yield pattern.format(i)

list_of_urls = []
for c in "xyz":
    g = gen_url(url+c,"&show=more")
    for x in range(2):
        list_of_urls.append(next(g))

而它生成的结果类似于这样:

www.testpage.com/x001&show=more
www.testpage.com/y001&show=more
www.testpage.com/z001&show=more
www.testpage.com/x002&show=more
www.testpage.com/y002&show=more
www.testpage.com/z002&show=more

如您所见,它停在002是因为:

    ...
    for x in range(2):
        list_of_urls.append(next(g))
    ...

每次我都从一个空列表开始,使用for循环并填充它。我正在尝试以这种方式使用map,并摆脱for循环:

urls = map(lambda x:next(gen_url(url+x,"&show=more")),"xyz")

它可以正常工作。但是我只能到达001。假设我想要到达002;我尝试了以下内容,但是它不起作用:

urls = imap((lambda x:next(gen_url(url+x,"&show=more")),"xyz"),2)

这个也不起作用:

urls = map((lambda x:next(gen_url(url+x,"&show=more")),"xyz"),repeat(2))

有人能向我解释一下如何在这种情况下正确使用迭代器吗?

2个回答

1
"功能上看起来像这样:"
def gen_url(prefix, suffix, id, places=3):
    pattern = "{}{{:0{}d}}{}".format(prefix, places, suffix)
    return pattern.format(id)

url = "www.testpage.com/"
a = [ gen_url(url + l, "&show=more", n) for l in "xyz" for n in range(1,4) ]
print a

所以现在你的gen_url是一个纯函数,可以接受来自外部的所有内容。

你正在生成2个序列"xyz"[1, 2, 3]的笛卡尔积(基本上是所有排列组合)

上面的脚本生成:

['www.testpage.com/x001&show=more',
 'www.testpage.com/x002&show=more',
 'www.testpage.com/x003&show=more', 
 'www.testpage.com/y001&show=more', 
 'www.testpage.com/y002&show=more', 
 'www.testpage.com/y003&show=more', 
 'www.testpage.com/z001&show=more',
 'www.testpage.com/z002&show=more',
 'www.testpage.com/z003&show=more']

谢谢,它完美地工作了。只是为了以后参考:你有什么建议可以用我尝试的方式来重复吗?我的意思是,如何使用map重复? - Angelo
我认为你不能仅通过对“xyz”进行单个映射来轻松实现这一点。 - zerkms

1
前缀和后缀在gen_url中破坏了简单的逻辑。它们可以被拆分出来。
尝试这样做:
from itertools import count, islice

def gen_url(places=3):
    for i in count(1):
        yield "{{:0{}d}}".format(places).format(i)

url = "www.testpage.com/"
list_of_urls = [url+c+x+"&show=more" for c in "xyz" for x in islice(gen_url(), 0, 2)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接