2012-09-30 71 views
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()我只得到一個結果。如果我打印它,則打印所有頁面。
我只是誤解,或者這是有關的蟒蛇?

另外,開啓器是:

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

回答

1

一旦在函數中返回一個表達式,該函數的執行就會結束,所以第二個返回不會被執行。爲了回報這兩個值,你需要將其打包在一個列表或元組:

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

這使用列表解析讓你想函數返回的所有對象的列表,然後返回。

然後你可以從返回列表解包單獨的結果:

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

return結束功能。所以循環只執行一次,因爲你在循環中是return。想一想:一旦第一個值被返回,調用者將如何獲得後續值?他們是否必須再次調用該函數?但那會重新開始。 Python是否應該等到循環完成才能立即返回所有值?但是他們會去哪裏,Python如何知道這麼做呢?

您可能會在此處提供一個生成器,而不是。你也可以只返回一個發電機:

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

無論哪種方式,調用者可以將其如果需要轉換到一個列表,或直接遍歷它:

titles = list(recentchanges()) 

# or 

for title in recentchanges(): 
    print title 

或者,你可以返回標題的列表:

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

由於您使用return,你的函數將返回第一個值之後結束。

有兩種選擇;

  • 可以追加標題的列表,並返回,或
  • 可以使用yield,而不是return把你的函數變成generator

,後者可能更Python,因爲你可以那麼我們這樣說:

for title in recentchanges(): 
    # do something with the title 
    pass 
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']