print a
さて、あなたは最終的な値を出力します。
また、コードに関するいくつかのコメント:
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
そこで初期化する必要はありませi
ん。 for ループがそれを行います。また、これを行うだけでブロック全体を単純化できます。
numberlist = list(range(20))
そして、実際にはそれをリストにする必要がないことを考えると、それを構築する必要はまったくありませんが、for n in range(20)
後で実行することができます.
次にfib
、ループ内で関数を何度も再定義しています。その外側で定義し、再利用する必要があります。
また、複数のフィボナッチ数のリストを作成したいことがわかっている場合は、その間に計算したすべての数を保存するだけで役立ちます。そうすれば、同じことを何度も繰り返す必要はありません。ジェネレーター関数を使用して、すべてを簡単にすることもできます。
def fibGenerator():
a, b = 0, 1
yield 0
while True:
a, b = b, a + b
yield a
fibonaccinumbers = []
fib = fibGenerator()
for n in range(20):
fibonaccinumbers.append(next(fib))
範囲を反復しnext
てジェネレーターを手動で呼び出す代わりに、 itertools のtake
-recipeを使用して、次のようにすることもできます。
fibonaccinumbers = take(20, fibGenerator())
発電機について
ただし、ジェネレーターが何をするのかはまだよくわかりません。
ジェネレーターは、一連の戻り値を生成する Python 関数です。値は遅延生成されます。つまり、要求したときに生成されます。yield
代わりに を使用するだけでジェネレータを作成できますreturn
。Ayield
は値を「返し」、ジェネレーターを一時停止します。次に値を要求すると、ジェネレーターは中断したところから続行します。
ジェネレーターを使用すると、無限のシーケンスを作成できます。上記の定義でわかるように、内部fibGenerator
を持つ無限の while ループがあります。yield
ジェネレーターが停止すると、そのループにもかかわらずハングアップしません。
ここに簡単な自明の例があります:
>>> def example():
print('begin')
i = 0
while True:
print('Calculating next value')
yield i
i += 1
>>> g = example()
>>> next(g)
begin
Calculating next value
0
>>> next(g)
Calculating next value
1
>>> next(g)
Calculating next value
2
>>> next(g)
Calculating next value
3
>>> next(g)
Calculating next value
4
関数は、 iterableから次のnext
値を要求する組み込み関数です。イテラブルとは、反復できるものです (例: )。また、任意のジェネレーターもイテラブルです。for x in iterable: ...