1

私は現在 Project Euler の問題に取り組んでいる Python の初心者です (聞いたことがない人はこちら)。私はこの特定の問題を解決しましたが、いくつかの質問が残っています:

def fibsum():
    result = []
    a, b = 0, 1
    while True:
        a, b = b, a + b
        print b
        if b < 4000000 and b % 2 == 0:
            result.append(b)
        if b > 4000000:
        break
    print sum(result)

fibsum()

PowerShell を使用してこれを実行すると、最初に必要なすべての数値が出力され (ただし、1 つ上になります)、最後に合計が出力されます。

1
2
3
5
8
...
3524578
5702887 <-- This is over 4,000,000. Why is this here?
4613732 <-- This is the answer.
  1. 4,000,000 を超える最初の値に達する前に、ループの反復を停止させる方法はありますか?

  2. スペースを節約するために、印刷を使用する場合、すべての値をリスト形式 ([ 、 、 ]) で印刷する方法はありますか?

  3. 元のコードの print を yield または return (変数 b の場合) に置き換えると、プログラムは何も出力しません。

    印刷合計(結果)

    関数の最後に。

  4. 結果を定義して値を追加することなく、これを簡単にする方法はありますか? 値が実際の結果と同様の形式で返される場合、 sum() は機能していないようです。

4

1 に答える 1

1

1.印刷する前に2番目の条件を移動するだけですb:

while True:
    a, b = b, a + b  
    if b > 4000000:
        break
    print b
    if b < 4000000 and b % 2 == 0:
        result.append(b)

2.bループで印刷しないでください。むしろ、result抜けたら印刷します。

3.リターンに関しては、関数から戻っていることは明らかなので、関数内の次のコードは実行されないため、リストにはデータが入力されません。

yield関数を実行するたびに次の値を返すジェネレーター関数を作成するために使用されます。したがって、関数を複数回呼び出す必要があるため、生成された値を外部で定義されたリストに追加します。返すものがない場合、関数は壊れます。

yieldキーワードの使用法をより明確に理解するには、次の投稿をご覧ください: What does the "yield" keyword do in Python?

コードを編集して、次のように yield を使用できます (テストしていません)。

def fibsum():
    a, b = 0, 1
    while True:
        a, b = b, a + b
        if b > 4000000:
            break
        yield b

result = []
for val in fibsum():
    if val < 4000000 and val % 2 == 0:
            result.append(val)

print sum(result)

したがって、for ループでは、fibsum()関数を呼び出すたびに、条件に基づいてリストに追加する次の値が生成されます。

于 2013-06-21T21:03:24.863 に答える