0

我正在使用以下代码:

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

4 回答 4

1

Once a return statment is reached in a function, that functions execution ends, so the second return does not get executed. In order to return both values you need to pack them in a list or tuple:

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

This uses list comprehension to make a list of all the object you want the function to return and then returns it.

Then you can unpackage individual results from the return list:

answerList = recentchanges()
for element in answerList:
    print element
于 2012-09-30T15:46:02.573 回答
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']
于 2012-09-30T15:39:16.513 回答
0

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

yield您可以在这里通过ing 而不是ing 来提供生成器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]
于 2012-09-30T15:38:55.040 回答
0

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

有两种选择;

  • 您可以将标题附加到列表并返回,或者
  • 你可以使用yield而不是return将你的函数变成一个生成器

后者可能更 Pythonic,因为你可以像这样使用它:

for title in recentchanges():
   # do something with the title
   pass
于 2012-09-30T15:38:58.497 回答