我正在使用以下代码:
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))
答案 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