Pythonは(フィルターと組み合わせるマップのようなものです)理解にwhile
を使用してこのような機能を持っていませんが、他を使用していることを達成することができますあなたが望むやり方で機能するか、あなたの親友であるitertoolsモジュールを使うようなツールです。例
例1の場合は、itertools
>>> from itertools import takewhile
>>> def fib():
fk,fk1 = 0,1
while True:
yield fk
fk, fk1 = fk1, fk + fk1
>>> list(takewhile(lambda fn:fn<100,fib()))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>>
例2で、機能
>>> def fib_while(tope):
fk,fk1 = 0,1
while fk < tope:
yield fk
fk,fk1 = fk1, fk + fk1
>>> list(fib_while(100))
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>>
ああして、私は言及を忘れてしまったが、フィボナッチ数を取得するための数式、数学的に正解であっても、十分な大きさのnの実際の値を得ることができないという運命であるから、floating point arithmetic rounding errors
すべてのnに対して
>>> def fib_float(n):
return int(((1+(5**0.5))**n-(1-(5**0.5))**n)/(2**n*(5**0.5)))
>>> [n for n,f in zip(range(100),fib()) if f!=fib_float(n)])
[72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>>
ので(上記fib
使用)
発散のポイントが見つかりました。非常に簡単です> = 72あなたは、あなただけの世話場合
...番号をフィボナッチされていません何を得ます4,000,000以下のシーケンス内のすべての数字は、制限がn = 33のようにもちろん問題ではありません。
この回答を見る:http://stackoverflow.com/questions/31003486/stopping-list-selection- in-python-2-7 –
はい、方法があります。あなたは 'while'ループを書こうとしましたか? – blacksite
リスト内包表記の代わりにジェネレータ式を使用して、ある点までループするか、 'itertools.takewhile()'を使用することができます。 –