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

あなたが抱えている問題は、関数が最初に見たリターンラインで終了することです。

それで。行で

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

最初の値のみを返します:pages[0]['title']

これを回避する1つの方法は、リスト内包表記を使用することです。

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

別のオプションはrecentchanges、ジェネレータを作成してを使用することyieldです。

for title in pages:
    yield title['title']
于 2012-09-30T15:39:16.513 に答える
1

関数でreturnステートメントに到達すると、その関数の実行は終了するため、2番目のreturnは実行されません。両方の値を返すには、それらをリストまたはタプルにパックする必要があります。

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

これは、リスト内包を使用して、関数が返すすべてのオブジェクトのリストを作成し、それを返します。

次に、リターンリストから個々の結果を解凍できます。

answerList = recentchanges()
for element in answerList:
    print element
于 2012-09-30T15:46:02.573 に答える
0

return関数を終了します。したがって、ループ内にいるため、ループは1回だけ実行returnされます。考えてみてください。最初の値が返された後、呼び出し元はどのようにして後続の値を取得しますか?関数を再度呼び出す必要がありますか?しかし、それはそれを最初からやり直すでしょう。Pythonは、ループが完了するまで待機して、すべての値を一度に返す必要がありますか?しかし、彼らはどこに行き、Pythonはこれをどのように知っているのでしょうか?

ここでジェネレーターを提供するには、 yieldingではなくreturningを使用します。ジェネレータを返すこともできます。

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、最初の値を返した後に関数が終了します。

2つの選択肢があります。

  • タイトルをリストに追加して返すことができます、または
  • 関数をジェネレータyieldに変換する代わりにを使用できます。return

後者はおそらくもっとPythonicです。なぜなら、次のように使用できるからです。

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