如何使用地图

时间:2015-09-16 08:59:21

标签: python python-2.7 dictionary lambda functional-programming

我开始学习如何以功能方式使用python,我遇到了一个我无法解决的问题。

我有以下代码(部分来自this question),它完全符合我的要求:

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))
    ...

我一直以empy列表开头,使用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 个答案:

答案 0 :(得分: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是一个pure function,可以从外部接受所有内容。

您正在生成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']

答案 1 :(得分:1)

前缀和后缀正在减损gen_url中的简单逻辑。 他们可以退出。

试试这个:

{{1}}