El tutorial o código que hallarás en este post es la solución más eficiente y efectiva que encontramos a tus dudas o problema.
Solución:
No puedes hacerlo así: el lista de comprensión es evaluado primero, y luego esa lista se agrega a series
. Entonces, básicamente, sería como si hubieras escrito:
series=[]
series.append(1)
series.append(1)
temp = [series[k-1]+series[k-2] for k in range(2,5)]
series += temp
Sin embargo, puede resolver esto usando lista de comprensión como una forma de efectos secundarios de la fuerza, como por ejemplo:
series=[]
series.append(1)
series.append(1)
[series.append(series[k-1]+series[k-2]) for k in range(2,5)]
Tenga en cuenta que aquí no agregue el resultado a la serie. La lista de comprensión solo se usa de tal manera que .append
es llamado series
. Sin embargo, algunos consideran que la comprensión de listas con efectos secundarios es bastante propensa a errores: no es muy declarativa y tiende a introducir errores si no se hace con cuidado.
Si sabe cuántos términos de la serie necesitará, puede escribir el código de forma compacta sin una lista de comprensión como esta.
def Fibonacci(n):
f0, f1 = 1, 1
for _ in range(n):
yield f0
f0, f1 = f1, f0+f1
fibs = list(Fibonacci(10))
print (fibs)
Si desea una cantidad indefinida de términos, puede usar esto, que es muy similar.
def Fibonacci():
f0, f1 = 1, 1
while True:
yield f0
f0, f1 = f1, f0+f1
fibs = []
for f in Fibonacci():
fibs.append(f)
if f>100:
break
print (fibs)
Cuando necesite una colección potencialmente infinita de elementos, tal vez debería considerar una function
con uno o más yield
sentencias o una expresión generadora. Me encantaría poder hacer números de Fibonacci con una expresión generadora, pero aparentemente no se puede.
Podríamos escribirlo como una comprensión limpia de la lista de Python (o generador) usando su relación con la proporción áurea:
>>> series = [int((((1 + 5**0.5) / 2)**n - ((1 - 5**0.5) / 2)**n) / 5**0.5) for n in range(1, 21)]
>>> series
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
>>>
o un poco más bien como:
>>> square_root_of_five = 5**0.5
>>> Phi = (1 + square_root_of_five) / 2
>>> phi = (1 - square_root_of_five) / 2
>>>
>>> series = [int((Phi**n - phi**n) / square_root_of_five) for n in range(1, 21)]
>>> series
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
valoraciones y reseñas
Recuerda algo, que puedes permitirte interpretar si te ayudó.