1

私はlearnpython.orgでpythonを学んでいます。基本的なクラスはすべて問題なく完了しましたが、ジェネレーター レベルで問題が発生しています。

コマンドの仕組みは理解できたと思いますが、このyieldコマンドを使用してレッスンを完了するために必要なフィボナッチ数列を取得する方法がわかりません。これが私のコードですが、最初の2つの数字しか得られません。

# fill in this function
def fib():
    a,b = 1,0  # Sets the values (is this causing a problem?)
    yield a    # Sends back the value of a to the iterator (for loop)
    b = a + b  # Sets the value of b to a + b
    yield b    # Sends back the value of b to the iterator (for loop)

# testing code
import types
if type(fib()) == types.GeneratorType:
    print "Good, The fib function is a generator."

    counter = 0
    for n in fib():
        print n
        counter += 1
        if counter == 10:
            break

このレベルを完了したいのですが、方法がわかりません。

4

2 に答える 2

4

ジェネレーターは、yield実行されたステートメントごとに 1 つの結果を生成します。2 つのステートメントのみを実行yieldしたため、ジェネレーターは 2 つの結果を生成しました。

これを試して:

def fib():
    a,b = 1,0  # Sets the values (is this causing a problem?)
    while True:
        a,b = b, a + b  # Sets the value of b to a + b
        yield b    # Sends back the value of b to the iterator (for loop)

ご覧のとおり、whileループは永久に実行されるため、このジェネレーターは無限 (無限?) の数の結果を生成します。


または、ジェネレーターを変更して有限シーケンスを生成し、呼び出し元を変更してそれを利用することもできます。

def fib(counter=None, limit=None):
    a,b = 0,1
    i = 0
    while (counter is None or counter > i) and (limit is None or limit > b):
        i += 1
        yield b
        a,b = b, a + b

print list(fib(counter=10))
print list(fib(limit=60))
于 2013-11-05T17:14:46.450 に答える