返回多个结果

时间:2012-09-30 15:31:11

标签: python wiki

我正在使用以下代码:

def recentchanges(bot=False,rclimit=20):
    """
    @description: Gets the last 20 pages edited on the recent changes and who the user who     edited it
    """
    recent_changes_data = {
        'action':'query',
        'list':'recentchanges',
        'rcprop':'user|title',
        'rclimit':rclimit,
        'format':'json'
    }
    if bot is False:
        recent_changes_data['rcshow'] = '!bot'
    else:
        pass
    data = urllib.urlencode(recent_changes_data)
    response = opener.open('http://runescape.wikia.com/api.php',data)
    content = json.load(response)
    pages = tuple(content['query']['recentchanges'])
    for title in pages:
        return title['title']

当我recentchanges()时,我只得到一个结果。如果我打印它,则打印所有页面 我只是误解或者这是与python相关的事情吗?

此外,揭幕战是:

cj = CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

4 个答案:

答案 0 :(得分:1)

你遇到的问题是一个函数在它看到的第一个返回行结束。

因此。在行

for title in pages:
    return title['title']

它只返回第一个值:pages[0]['title']

解决这个问题的一种方法是使用列表理解,即

return [ title['title'] for title in pages ]

另一种选择是使recentchanges成为生成器并使用yield

for title in pages:
    yield title['title']

答案 1 :(得分:1)

在函数中达到返回语句后,函数执行结束,因此第二次返回不会被执行。要返回这两个值,您需要将它们打包在列表或元组中:

...
returnList = [title['title'] for title in pages]
return returnList

这使用list comprehension来创建希望函数返回的所有对象的列表,然后返回它。

然后您可以从返回列表中解压缩单个结果:

answerList = recentchanges()
for element in answerList:
    print element

答案 2 :(得分:0)

return结束了这个功能。所以循环只执行一次,因为你在循环中return。想一想:一旦返回第一个值,调用者将如何获得后续值?他们是否必须再次调用该功能?但那会重新开始。 Python应该等到循环完成后立即返回所有值吗?但他们会去哪里以及Python如何知道这样做?

您可以通过yield而不是return来提供生成器。你也可以只返回一个发电机:

return (page['title'] for page in pages)

无论哪种方式,调用者都可以根据需要将其转换为列表,或者直接迭代它:

titles = list(recentchanges())

# or

for title in recentchanges():
    print title

或者,您只需返回标题列表:

return [page['title'] for page in pages]

答案 3 :(得分:0)

由于您使用return,您的函数将在返回第一个值后结束。

有两种选择;

  • 您可以将标题附加到列表中并返回该标题,或
  • 您可以使用yield代替return将您的功能转换为generator

后者可能更像pythonic,因为你可以像我这样:

for title in recentchanges():
   # do something with the title
   pass