питона не имеет такую особенность использования 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
точка расхождения очень легко нашел (используя выше fib
)
>>> 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]
>>>
так что для всех п> = 72, что вы получаете не числами Фибоначчи ...
, если вы заботитесь только для все числа в последовательности ниже 4 000 000, то это, конечно, не проблема, так как предел равен n = 33
Посмотрите на этот ответ: http://stackoverflow.com/questions/31003486/stopping-list-selection- in-python-2-7 –
Да, есть способ. Вы даже пытались написать цикл while? – blacksite
Вы можете использовать выражение генератора вместо понимания списка, а затем перебирать его до некоторой точки или использовать 'itertools.takewhile()'. –